Покрытие кода тестами (Code Coverage)
В какой то момент Вам захочется узнать, какие части приложения покрыты тестами, а какие нет. Именно для этого и используется CodeCoverage. Во время выполнения тестов для сбора данных о покрытии, Вы получите статистику по всем классам, методам и строкам кода, которые затронуты Вашими тестами. Разница между количеством строк кода и количеством затронутых при тестировании строк является главным критерием покрытия кода тестами. В идеальном мире, покрытие кода должно составлять 100%, однако, в реальности достаточно и 80%. Помните, даже 100% покрытие кода не защитит Вас от ошибок и падения приложения.
Codeception включает инструменты CodeCoverage начиная с версии 1.5. Для сбора информации о покрытии тестами необходим xdebug
.
Данные о покрытии тестами могут быть собраны вручную для локальных или удаленных тестов. Удаленные тесты могут выполняться на другом узле, или локально, однако с использованием веб сервера. Может показаться сложным получение покрытия кода для тестов Selenium или PhpBrowser. Codeception поддерживает удаленное покрытие точно так же, как и локальное.
Конфигурация
Чтобы включить утилиту покрытия тестами добавьте следущие строки в глобальный конфигурационный файл codeception.yml
:
coverage:
enabled: true
Выглядит неплохо. Но какие файлы должны попасть в отчет о покрытии? Вы можете фильтровать файлы используя black-листы и white-листы.
coverage:
enabled: true
whitelist:
include:
- app/*
exclude:
- app/cache/*
blacklist:
include:
- app/controllers/*
exclude:
- app/cache/CacheProvider.php
Что такое black-листы и white-листы?
- Список whitelist — это список файлов, которые должны быть включены в отчет, даже если они не затронуты.
- Список blacklist — это список файлов, которые должны быть исключены из отчета, даже если они затронуты.
Передайте массив файлов/директорий в секции include/exclude. Путь заканчивающийся на '' относится к директории.
Так же Вы можете использовать маску '' в именах файлов, например app/models/*Model.php
для указания всех моделей.
Вот пример, если Вам не нужны сложные фильтры:
coverage:
enabled: true
include:
- app/*
exclude:
- app/cache/*
Опции include
и exclude
здесь добавляют или удаляют файлы из white-листа.
Каждая из этих настроек может быть переопределена для каждого набора в сооветсвующих конфигурационых файлах.
Локальное покрытие тестами
Базовый отчет о покрытии может быть получен для функциональных и модульных тестов.
Если Вы настроили конфигурацию, как было показано выше, Вы готовы к действиям.
Все, что Вам нужно — выполнить codeception с опцией --coverage
.
Для генерации xml отчета или красивого html отчета добавьте опции --xml
и --html
.
codecept run --coverage --xml --html
XML и HTML отчеты распологаются в директории _logs
. Лучший способ посмотреть отчет — открыть index.html
, находящийся в директории tests/_logs/coverage
, с помощью вашего браузера.
XML отчеты используются в IDEs (такими как PHPStorm) или серверами Continuous Integration (Такими как Jenkins).
Удаленное покрытие тестами
В случае, если Ваше приложение запущено с помощью веб-сервера (Apache, Nginx, PHP WebServer), у Вас нет доступа к тестируемому коду,
таким образом, сбор данных о покрытии кода становится нетривиальной задачей. То же самое касается скриптов запущенных на другом узле.
Для того, чтобы получить доступ к коду, у Вас должно быть установлено расширение xdebug
с включенной опцией remote_enable
.
Codeception так же требует наличия небольшого "шпиона" для взаимодействия с Вашим приложением.
Даже если Ваше приложение работает автономно, даже не зная, что оно было протестировано, данный файл должен быть подключен для того, чтобы стало возможным собирать информацию о покрытии тестами.
Этот файл называется c3.php
и он доступен на GitHub.
c3.php
должен быть скачан и включен в Ваше приложение в первой строке.
Посылая специальные заголовки, Codeception будет отдавать команды вашему приложению, позволяющие запускать сбор данных о покрытии кода и останавливать его.
После выполнения набора тестов, отчет будет сохранен и Codeception считает его с вашего приложения.
Следуйте инструкциям по установке, описанным в файле readme.
После того, как файл c3.php
будет включен в Ваше приложение, Вы сможете начать сбор данных о покрытии кода тестами.
В случае, если Вы запускаете приложение локально, не нужно производить ни каких дополнительных действий в конфигурации.
Все данные будут собраны, после чего скомпонованы.
Подумайте над этим: Codeception запускает удаленно утилиту сбора покрытия кода тестами точно так же, как и локально.
Никогда настройка удаленного формирования отчета о покрытии кода тестами не была такой простой. В любом другом фреймворке. Серьезно.
Однако, если Вы запускаете тесты на удаленном сервере (или Ваш веб-сервер не использует код из текущей директории), в конфигурационный файл необходимо добавить опцию remote
.
К примеру, давайте включим удаленную утилиту сбора информации о покрытии кода тестами в набор acceptance.suite.yml
coverage:
enabled: true
remote: true
В данном случае результаты отчеты не будут слиты с локальными, если опция включена. Объединение отчетов возможно только в том случае, если файл запущеный удаленно и локально имеет один путь. Однако в случае запуска тестов на удаленно сервере нет уверенности, что это так.
Заключение
Никогда еще не было так просто настроить одновременно локальный и удаленный отчет о покрытии тестами. Всего один конфигурационный файл и один дополнительный файл включенный в приложение!
С помощью Codeception Вы можете просто создавать CodeCoverage отчеты для ваших Selenium тестов (или других приемочных и API тестов). Соединяя отчеты для acceptance
, functional
и unit
наборов Вы можете получить наиболее полную информацию о том, какие части Вашего приложения протестированы, а какие — нет.
Трудились и переводили ребята из amyLabs
No Comments