Стиль тестов и агенты
Тесты теперь чаще пишут агенты. Мы с Клодом сравнили, как агент справляется с тестовой работой, когда корпус бэкенда написан в unittest, в pytest и в pytest с матчерами, и как часто его тесты ложно ломаются.
Что получилось
Прирост mutmut ↑
доля мутантов изменённых функций, которых новые тесты ловят сверх тестов базы
Разности режимов по задачам
Парно: та же задача в двух режимах. Закрашенная точка — 95% интервал не содержит ноль. Справа — вероятность, что первый режим лучше второго.
Прирост mutmut
Как выглядят стили
Пример по мотивам тестов правил файрвола из cfw-backend, собран для наглядности: все три стиля проверяют одно и то же. M.dict сверяет только перечисленные ключи.
unittest (A)
pytest (B, E)
pytest + матчеры (C, F)
В unittest окружение собирается миксинами и декораторами класса, в pytest — фикстурами из плагина common-lib.
Как проверяли
Opus 5.5
Режимы
| режим | новые тесты | старые тесты |
|---|---|---|
| A · unittest | unittest | как есть |
| B · pytest rewrite | pytest | переведены в pytest |
| C · pytest rewrite + M | pytest + M | переведены в pytest + M |
| E · pytest | pytest по образцу | как есть |
| F · pytest + M | pytest + M по образцу | как есть |
- mutmut
- подменяем код изменённых функций мелкими мутациями и смотрим, сколько их ловят тесты
- хрупкость
- три рефакторинга без смены поведения: переименование приватных имён, текст логов, стиль импортов; ложное падение — тест, который был зелёным и покраснел
Скорость прогона
A* — unittest до сессионного etcd, когда каждый тестовый класс поднимал свой сервер.
A′ — unittest, который агент переписал из pytest-версии.
Оговорки
- Задачи — реальные коммиты, но их 46; интервалы бутстрапа по задачам и генерациям.
- Прирост mutmut считается по функциям, которые тронул коммит; часть задач без значения — mutmut не мутирует их функции.
- Ложные падения в штуках зависят от того, сколько тестов написал агент: в A их больше.
Больше данных
Все бэкенды, средние по задачам.