Генерация тестовых данных в LLM. Больше вреда или пользы?

Генерация тестовых данных в 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 сам задаёт критерии качества.

Источники

1