Покрытие кода тестами (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