Зачем нам мутационное тестирование |
21.05.2020 00:00 |
Автор: Кинга Витко (Kinga Witko) Уверена, что вы ежедневно думаете, как улучшить тестирование и найти проблемы до того, как продукт уйдет в релиз. Отличный способ попробовать что-то новое – это превратить ваши тест-сценарии в настоящих мутантов. Что такое мутационное тестирование? Концепция мутационного тестирования довольно проста. Ошибки (мутации) автоматически встраиваются в код, а затем прогоняются тесты. Если тесты падают, мутация убивается, а если проходят – она выживает. Качество автоматизированных тестов можно оценивать, исходя из доли убитых мутаций. Это весело! Мутатор – это изменение в логике программы, к примеру, для условий. Мутатор "Отрицание условий" меняет условные выражения на противоположные. Выражение вроде: if (a == b) { // сделать что-то } мутирует в выражение: if (a != b) { // сделать что-то } Что? В одном из моих проектов в качестве инструмента мутационного тестирования используется PiTest (или PIT). Это фреймворк с открытым исходным кодом для мутационного тестирования на Java, поэтому все могут с ним ознакомиться. PIT прогоняет ваши юнит-тесты на автоматически модифицированных версиях кода приложения. Когда код приложения меняется, он должен приводить к новым результатам и вызывать падения юнит-тестов. С другой стороны, если юнит-тест не падает в такой ситуации, возможно, что-то не так с тест-набором. Зачем? Традиционное тест-покрытие (то есть строка, утверждение, ветка, и т. д.) измеряет только код, который запускался при прогоне ваших тестов. Оно не проверяет, действительно ли ваши тесты способны находить проблемы в исполняемом коде, и, следовательно, может только выявить код, который совершенно точно не тестировался. Экстремальный пример этой проблемы – тесты без утверждений. К счастью, они редко встречаются в большинстве баз кода. Куда более распространен код, который только частично тестируется набором тестов. Набор, частично тестирующий код, меж тем вполне способен затронуть все его ветки (примеры). Мутационное тестирование может определить, значимо ли тестирование каждого утверждение, и поэтому это золотой стандарт, по которому оцениваются все прочие типы покрытия. Безусловно, PiTest – не единственный инструмент для мутационного тестирования, однако он быстр и надежен, и поэтому я бы рекомендовала его. Более того, его код открыт, однако он активно разрабатывается и поддерживается, поэтому вас вряд ли бросят с вашими проблемами в одиночестве. PiTest хорошо работает с таким инструментарием разработки, как Maven или IntelliJ. Отчеты, созданные PIT, легко читабельны и совмещают покрытие строк и информацию о мутационном покрытии. Более того, они дают полезное представление о качестве тестов и помогают эффективно выявлять пробелы в тестах, которые необходимо закрыть. Всем ли это подходит? Использование юнит-тестов – часть распространенного подхода к разработке. Команды измеряют покрытие кода (условий и веток) как часть критерия готовности. С другой стороны, эта метрика не проверяет качество тестов. В экстремальных ситуациях может случиться так, что мы будем повышать покрытие, не тестируя при этом ничего значимого. Тут-то на помощь и приходит мутационное тестирование. Основная идея в том, что хороший тест не должен продолжать работу, если исходный код изменен, "мутировал".
PITEST выполняет подходящие мутации для каждого нужного класса на уровне байткода и проверяет, падает ли соответствующий юнит-тест. Затем он сообщает о случаях, когда мутации выдержали тест (из-за качества теста или из-за отсутствия теста), и о случаях, когда мутации заставили тесты упасть. Результат – отчет о покрытии (по одному на модуль), описывающий мутационное покрытие и позволяющий разобраться подробнее. Как интегрировать PITest: Maven PITest можно добавить в Maven как плагин: <plugin> <groupId>org.pitest</groupId> <artifactId>pitest-maven</artifactId> <version>LATEST</version> </plugin> Командная строка Maven: mvn org.pitest:pitest-maven:mutationCoverage Больше информации о возможностях конфигурации Maven: http://pitest.org/quickstart/maven/ При вышеописанной базовой конфигурации HTML-отчеты в указанной выше форме создаются для каждого модуля Maven. Дайте мутантам шанс улучшить ваши тесты! |