PHP: Автоматическое тестирование
Теория: Покрытие кода тестами
В больших проектах сложно с ходу определить, какой код протестирован, а какой — нет. Такая потребность возникает регулярно. Обычно это происходит, когда не все члены команды ответственно подходят к написанию тестов. В таком случае может страдать качество проекта.
Протестированность кода можно измерить. Для этого используют метрику покрытие кода тестами (code coverage). Покрытие анализируется тестовыми фреймворками, которые берут количество строчек, задействованных в тестах, и делят их на количество строчек в проекте. Например, если в коде есть условная конструкция, не покрытая тестами, то все строки кода внутри нее не будут покрыты.
Для работы покрытия в PHPUnit необходимо установить расширение xdebug. Проще всего его установить через командную строку:
Чтобы убедиться, что xdebug работает, запустим команду php -v. Она покажет версию PHP и расширения:
В PHPUnit покрытие меряется крайне просто. Достаточно запустить тесты с флагом --coverage-text:
После выполнения всех тестов, PHPUnit выводит сводную таблицу с процентом покрытия кода тестами. В примере выше видно, что в классе PHP\Package\User покрыто 100% кода. Обратите внимание, что покрытие сильно зависит от того, какие тесты выполнились. Если часть из них упала с ошибками, то PHPUnit покажет намного меньшее покрытие — тесты просто не доберутся до всего кода. Поэтому покрытие измеряют, только когда все тесты зеленые.
Различные флаги для генерации отчетов позволяют создавать отчеты в разных форматах. Например, флаг --coverage-html /path/to/report создает человекочитаемый отчет, который можно просматривать в браузере:
Эта статистика помогает найти места, где тестов мало. Дальше по ситуации их можно начинать добавлять. Если в проекте тестов не было вообще, то эта статистика начинает быстро расти. А вот дальше, ближе к 90 процентам, придется бороться за каждую строчку кода.
Покрытие само по себе не гарантирует, что код работает правильно во всех ситуациях. Логические ошибки в коде невозможно отследить только покрытием. Для этого нужны тесты на одну и ту же функциональность, но с разным набором данных. Как правило, это тесты на пограничные случаи. В разработке есть хорошая практика: перед тем как чинить баги, сначала нужно написать тесты, которые их воспроизводят, и только затем уже можно починить их.
Какое покрытие считается допустимым? 100% покрытия выглядит красиво, но добиться его невероятно сложно. И для большинства проектов бессмысленно. Затраченные усилия не окупятся. Большинство разработчиков сходится во мнении, что 80% — это достаточно хорошее покрытие. На этом можно и остановиться.
.png)


