Ваш ИИ пишет тесты, которые никогда не могут упасть
Вы просите ИИ написать тесты. Он выдает вам двенадцать «зеленых» тестов. Ваш CI проходит успешно. Вы вливаете код. Через три дня баг попадает в продакшн. Вы смотрите на тесты. Они прошли, но они ничего не проверяли.
Зеленый тест — это не доказательство. Это гипотеза. ИИ пишет гипотезы, которые никогда не проваливаются.
Посмотрите на эту функцию:
func Discount(total int) int {
if total > 100 {
return total - 10
}
return total
}
ИИ может написать такой тест:
func TestDiscount(t *testing.T) {
got := Discount(150)
if got < 0 {
t.Errorf("result should not be negative")
}
}
Этот тест «зеленый». Он запускает код, поэтому ваше покрытие выглядит хорошим. Но тест проверяет только то, что результат меньше нуля. Если вы замените расчет скидки на математическую ошибку, тест все равно останется зеленым. Он не проверяет поведение. Он лишь проверяет, «горит ли свет».
Это ловушка. Покрытие считает строки, которых вы коснулись. Оно не учитывает значимость утверждений (assertions). Отчет о 90% покрытии может скрывать сломанный код.
ИИ ищет кратчайший путь к «зеленому свету». Он выбирает слабые утверждения и моки, которые ничего не проверяют.
Чтобы это исправить, используйте одно правило: проверьте, умеет ли тест проваливаться.
Намеренно измените свой код. Если тест остается зеленым, он бесполезен. Выбросьте его.
Настоящий тест выглядит так:
func TestDiscount(t *testing.T) {
if got := Discount(150); got != 140 {
t.Errorf("Discount(150) = %d, want 140", got)
}
}
Если вы нарушите логику, этот тест мгновенно станет «красным». Он «кусается».
Вы не сможете делать это вручную для каждого теста. Вместо этого используйте мутационное тестирование. Такие инструменты, как Gremlins в Go, вносят небольшие изменения в ваш код. Они проверяют, замечают ли ваши тесты эти изменения.
Если изменение не приводит к провалу теста, значит, в вашем наборе тестов есть дыра.
Я использую это для кода, написанного ИИ. Я не позволяю ИИ заявлять, что работа выполнена. Я устанавливаю gate. Инструмент мутирует код. Если тест остается зеленым, ИИ должен его переписать. Не ИИ решает, хорош ли тест. Это решает мутация.
Ни один тест от ИИ не попадает в мою кодовую базу, не доказав, что он может провалиться. Тест, который не может упасть, хуже, чем отсутствие теста. Отсутствие теста очевидно. Фейковый тест опасен.
Перестаньте доверять «зеленому свету». Тест ценен лишь тем «красным», который он может выдать.
Source: https://dev.to/ohugonnot/your-ai-writes-tests-that-can-never-fail-3i57
Optional learning community: https://t.me/GyaanSetuAi
