Стиль тестов и агенты

Тесты теперь чаще пишут агенты. Мы с Клодом сравнили, как агент справляется с тестовой работой, когда корпус бэкенда написан в unittest, в pytest и в pytest с матчерами, и как часто его тесты ложно ломаются.

Что получилось

бэкенд
ложные падения

Прирост mutmut ↑

доля мутантов изменённых функций, которых новые тесты ловят сверх тестов базы

Разности режимов по задачам

Парно: та же задача в двух режимах. Закрашенная точка — 95% интервал не содержит ноль. Справа — вероятность, что первый режим лучше второго.

Прирост mutmut

Как выглядят стили

Пример по мотивам тестов правил файрвола из cfw-backend, собран для наглядности: все три стиля проверяют одно и то же. M.dict сверяет только перечисленные ключи.

unittest (A)

pytest (B, E)

pytest + матчеры (C, F)

В unittest окружение собирается миксинами и декораторами класса, в pytest — фикстурами из плагина common-lib.

Как проверяли

коммит из истории→ выбрасываем тесты→ агент их дописывает→ мерим
46задач: ad 12, cfw 25, rest 9
5режимов
3–7генераций на задачу
6800тестов написано, 2766 изменено
Opus 5.5

Режимы

режимновые тестыстарые тесты
A · unittestunittestкак есть
B · pytest rewritepytestпереведены в pytest
C · pytest rewrite + Mpytest + Mпереведены в pytest + M
E · pytestpytest по образцукак есть
F · pytest + Mpytest + M по образцукак есть
mutmut
подменяем код изменённых функций мелкими мутациями и смотрим, сколько их ловят тесты
хрупкость
три рефакторинга без смены поведения: переименование приватных имён, текст логов, стиль импортов; ложное падение — тест, который был зелёным и покраснел

Скорость прогона

A* — unittest до сессионного etcd, когда каждый тестовый класс поднимал свой сервер.
A′ — unittest, который агент переписал из pytest-версии.

Оговорки

Больше данных

Все бэкенды, средние по задачам.