0
рейтинг

1
0
Есть ответы

Автоматизация тестирования: промт для генерации unit-тестов

Генерация unit-тестов

Есть ловушка, в которую попадают почти все, кто начинает генерировать тесты. Модель смотрит на код и пишет тесты по нему. Получается зеркало: тесты повторяют логику реализации, включая её ошибки, и зелёные всегда. Формально покрытие выросло, фактически защиты нет.

Лечится сменой источника. Тесты пишутся не по коду, а по ожидаемому поведению. Значит, и в промт надо давать не реализацию, а контракт.

Промт по контракту, а не по коду

Ты пишешь тесты. Вот описание функции — реализацию я намеренно не показываю.

СИГНАТУРА: [имя, параметры с типами, возвращаемое значение]
ЧТО ДЕЛАЕТ: [в двух-трёх фразах, на языке предметной области]
ПРЕДУСЛОВИЯ: [что гарантирует вызывающий]
ПОСТУСЛОВИЯ: [что гарантирует функция]
ОШИБКИ: [какие исключения и когда]

Напиши тесты на [pytest / unittest], покрывающие:
1. Обычный случай — 2 теста с разными данными.
2. Границы: пустое, один элемент, максимум, ноль, отрицательное.
3. Некорректный вход: каждый описанный класс ошибок отдельным тестом.
4. Инварианты: что должно оставаться верным при любых входных данных.

ПРАВИЛА:
- Одна проверка на тест. Имя теста описывает сценарий, а не функцию.
- Никаких моков там, где можно обойтись реальными объектами.
- Не подстраивай ожидаемые значения под удобство — считай их по описанию.
- Отдельно перечисли случаи, которые ты не смог протестировать, и почему.

Скрыть реализацию — самый действенный приём во всём этом тексте. Тесты, написанные вслепую по контракту, регулярно вскрывают расхождение между тем, что код делает, и тем, что от него ждали.

Проверка самих тестов

Тест бесполезен, если проходит и на сломанном коде. Проверяется это просто: сломайте код нарочно.

Вот функция и тесты к ней.
Предложи 7 мелких изменений в функции, которые её ломают: сдвиг границы на единицу, замена < на <=, перестановка аргументов, пропуск проверки, возврат вместо исключения, неверный порядок операций, отсутствие обработки пустого входа.
Для каждого скажи, упадёт ли хоть один тест.
Изменения, которые тесты не заметят, — это дыры. Перечисли их отдельно.

Это ручная версия мутационного тестирования, и она честнее любого процента покрытия. Покрытие показывает, какие строки выполнились, а не какие ошибки поймаются.

Что стоит и не стоит тестировать

СтоитНе стоит
Логику с ветвлениями и вычислениямиГеттеры, сеттеры и обёртки в одну строку
Границы диапазонов и разбор форматовРаботу сторонней библиотеки
Обработку ошибок и откатыПриватные детали реализации
Места, где уже находили багиКод, который вы завтра удалите

Отдельный приём: тест из бага

Каждый найденный баг — готовое техзадание на тест. Промт короткий и окупается быстрее всех остальных:

Вот описание бага: [что сделали, что ожидали, что получилось].
Вот исправление: [диф].
Напиши тест, который падал бы до исправления и проходит после.
Тест должен проверять поведение, а не конкретные строки исправления — чтобы он остался осмысленным после рефакторинга.

Чего не надо ждать

  • Интеграционных сценариев. Модель не знает, как ваши части соединяются в реальности.
  • Реалистичных данных. Она сгенерирует «test@example.com» и «Иван Иванов», а падает всё обычно на данных с пробелами, эмодзи и апострофами в фамилии.
  • Понимания, что важно. Она распределит внимание равномерно по всем функциям, включая те, что никогда не ломались.
  • Правильных ожидаемых значений в сложных расчётах. Их считайте сами: если модель ошиблась в ожидании, тест закрепит ошибку.

Разумный режим работы

Тесты на новую логику — писать самому, хотя бы каркас: пока формулируешь, что проверять, обычно и находишь дыры в замысле. А вот дополнить набор скучными краевыми случаями, размножить параметризацию, написать тест на найденный баг — тут генерация экономит реальное время и не портит качество.

Похожие вопросы

1 ответ

обсуждение открыто
0
25 августа 2026 23:03
Данных недостаточно: вы не приложили код функции и тестов, а описание задачи оборвалось на полуслове.

Что нужно уточнить и предоставить:
1. Текст функции — в вопросе сказано «Вот функция и тесты к ней», но сами исходники отсутствуют. Без них предложить *конкретные* ломающие правки невозможно.
2. Текст тестов — нужен, чтобы понимать контракт, который вы уже закрепили, и проверить, какие мутации он отсечёт.
3. Окончание списка правок — фраза «замена < на» обрывается. Уточните, нужно ли мне самому составить 7 типичных мутаций для вашей функции (например: замена < на <=, and на or, сдвиг индекса, возврат None, инверсия флага, удаление шага цикла, округление в другую сторону), или вы планировали задать их сами.

Как только пришлёте код и тесты, я покажу 7 вариантов «сломанной» функции в виде мутаций, которые должны вызывать падение ваших тестов.

Ответ сгенерирован ИИ автоматически, потому что вопрос какое-то время оставался без ответа. Проверьте важные детали и поправьте, если что-то не так — живой ответ всегда ценнее.

Добавление комментария

Не публикуется. Нужен для уведомлений об ответах.
Отвечайте по существу: решение, а не «у меня то же самое».
Кликните на изображение чтобы обновить код, если он неразборчив