Генерация тестовых данных в LLM. Больше вреда или пользы?
Вступление
До широкого применения LLM тестовые данные генерировали через Faker, встроенные инструменты фреймворков, Excel или системные подходы, например, property-based testing. С появлением чат-ботов наподобие ChatGPT генерировать тестовые данные стало проще и удобнее.
Теперь достаточно написать: "Сгенерируй тестовые данные для формы регистрации". И через несколько секунд получить аккуратную таблицу с именами, email, паролями, телефонами и ожидаемыми результатами.
Но можно ли доверять таким данным? LLM склонны к галлюцинациям и додумыванию контекста. А тестовые данные должны не только выглядеть разнообразно. Они должны проверять реальные риски, границы и ошибки системы.
Проблематика
Создаёт ли LLM настоящее покрытие или иногда только его иллюзию? Проверим на примере формы регистрации (имя, email, пароль, телефон и стандартные правила валидации).
Сравним два подхода. Первый подход — наивный промптинг. Когда мы просим LLM сгенерировать тестовые данные без дополнительных ограничений. Второй подход — управляемый промптинг. Когда мы заранее задаём категории данных, ограничения, ожидаемый результат и критерии оценки.
А после разберём, почему LLM может генерировать “условно полезные” данные и как можно от этого защититься.
Еще больше материала про AI QA и тестирование AI-приложений в Telegram-канале ModernQA
Эксперимент
Подход 1. Наивный промпт
Запрос: "Сгенерируй тестовые данные для формы регистрации. Укажи ожидаемый результат"
Пример типичного ответа от модели:
- Валидный пользователь: Имя — Иван Петров, Email — ivan.petrov@example.com, Пароль — Password123, Телефон — +79991234567. Ожидаемый результат: успешная регистрация.
- Валидный пользователь: Имя — Анна Смирнова, Email — anna.smirnova@example.com, Пароль — Qwerty123, Телефон — +79997654321. Ожидаемый результат: успешная регистрация.
- Пустое имя: Имя — (пусто), Email — test@example.com, Пароль — Password123. Ожидаемый результат: ошибка, имя обязательно.
- Некорректный email: Имя — Иван Петров, Email — invalid_email. Ожидаемый результат: ошибка, некорректный email.
- Короткий пароль: Пароль — 123. Ожидаемый результат: ошибка, короткий пароль.
На первый взгляд выглядит нормально. Есть позитивные и негативные сценарии. Но если посмотреть глазами QA, покрытие недостаточное:
- Почти нет граничных значений (мин/макс длина).
- Нет "грязных" данных, пробелов, Unicode, emoji.
- Нет дубликатов email.
- Нет потенциально опасного ввода (XSS, SQL-like).
- Неясно, какие классы эквивалентности реально покрыты.
Это и есть иллюзия покрытия. Cписок выглядит как тестовое покрытие, но проверяет в основном happy path и самые очевидные ошибки.
Подход 2. Управляемый промпт
Запрос, в котором описаны категории и структура:
"Сгенерируй 6 тестовых наборов для формы регистрации. Обязательно покрой следующие категории: валидные данные, пустое обязательное поле, некорректный email, дубликат, граничные значения, потенциально опасный или “грязный” ввод. Для каждого укажи: category, данные, expected_result и what_we_check"
Пример ответа (модель обычно выдает все 6; листинг сокращен):
- Базовый happy path Имя: Ivan Petrov, Email: ivan.petrov@example.com, Пароль: StrongPass123, Телефон: +79991234567. Ожидаемый результат: успешная регистрация. Что проверяем: базовый сценарий работы формы.
- Дубликат email Email: ivan.petrov@example.com (уже используется). Ожидаемый результат: ошибка "email занят". Что проверяем: уникальность email.
- XSS-like ввод Имя: <script>alert(1)</script>. Ожидаемый результат: ошибка или безопасная обработка. Что проверяем: защиту от потенциально опасного ввода.
- Грязные данные Имя: Иван 🚀 Петров (с пробелами и emoji). Ожидаемый результат: успешная регистрация или корректная обработка. Что проверяем: устойчивость к Unicode, спецсимволам и лишним пробелам.
Остальные кейсы (пустые поля, граничные значения и т.д.) строятся по тому же принципу.
Что показал эксперимент
Разницу в степени контроля. В наивном подходе модели отдается право самой определять данные. В управляемом подходе QA самостоятельно задает параметры, а модель помогает их реализовать в конкретные примеры.
Почему LLM может выдавать "условно полезные" данные
Модель не занимается тест-дизайном. Она генерирует наиболее правдоподобный и аккуратный ответ на запрос. В итоге получаются данные, которые выглядят качественно, но плохо ловят реальные баги.
Основные причины:
- В промпте нет критериев качества.
- Модель тяготеет к типовым примерам (Ivan Petrov, Password123).
- LLM может додумывать требования, которых нет в ТЗ.
- Красивый формат (списки, категории) создаёт ложное доверие.
- Модель не знает контекст именно вашей системы.
Как защититься
- Всегда задавайте категории и классы эквивалентности заранее.
- Чётко описывайте ограничения каждого поля.
- Просите указывать what_we_check — зачем нужен именно этот кейс.
- Не принимайте результат без ревью.
- Комбинируйте LLM с классическими инструментами (Faker, Hypothesis, подготовленные датасеты).
Вывод
LLM действительно может быть полезна для генерации тестовых данных. Может быстро помочь накидать примеры, найти очевидные негативные сценарии и сэкономить время на рутине.
Но есть важное ограничение. LLM не отвечает за качество тестового покрытия так, как его понимает QA. И не заменяет тест-дизайн, а ускоряет его только тогда, когда QA сам задаёт критерии качества.
Источники
- 15 промптов ChatGPT для QA — большая подборка практических шаблонов, включая генерацию тестовых данных.
- Как мы использовали нейросети для генерации тестовых данных — реальный корпоративный кейс.
- ChatGPT в качестве тестировщика. Примеры использования — ранний, но полезный разбор возможностей.
- Boundary Value Test Input Generation Using Prompt Engineering with LLMs (arXiv, 2025) — исследование эффективности промпт-инжиниринга для граничных тестов.
- Finding bugs with Claude and property-based testing (Anthropic Research, 2026) — пример удачной комбинации LLM и property-based testing.
- Prompt Engineering for Software Testers (aqua-cloud.io, 2026) — практические рекомендации по промптам в QA.