Покрытие кода
В какой-то момент вам захочется проверить, какие части вашего приложения хорошо протестированы, а какие нет. Именно для этого используется CodeCoverage. При выполнении тестов для сбора отчета о покрытии вы получите статистику по всем классам, методам и строкам, затронутым этими тестами. Основным критерием покрытия является отношение между всеми строками в скрипте и всеми затронутыми строками. В идеальном мире вы должны получить 100% покрытие кода, но на практике 80% вполне достаточно. Потому что даже 100% показатель покрытия кода не спасет вас от фатальных ошибок и сбоев.
Необходимая информация предоставляется SebastianBergmann\CodeCoverage, и вы можете использовать любой из поддерживаемых драйверов.
| Драйвер | Описание |
|---|---|
| Xdebug | Отлично подходит для отладки, но слишком медленный при сборе покрытия |
| phpdbg | Быстрее, чем Xdebug, но неточный |
| pcov | Быстрый и точный, но без функций отладки — идеально подходит для CI |
Данные о покрытии можно собирать вручную для локальных и удаленных тестов. Удаленные тесты могут выполняться на различных узлах или локально, но через веб-сервер. Может показаться сложным собрать покрытие кода для тестов Selenium или PhpBrowser. Но Codeception поддерживает как удаленное, так и локальное покрытие кода.
Настройка
Для включения покрытия кода поместите эти строки в глобальный файл конфигурации codeception.yml:
coverage:
enabled: true Это пока нормально. Но какие файлы должны присутствовать в итоговом отчете о покрытии? Передайте массив файлов или директорий для включения/исключения. Путь, оканчивающийся на «*», соответствует каталогу. Также вы можете использовать маску «*» в имени файла, например, app/models/*Model.php для соответствия всем моделям.
Существует сокращение, если вам не нужны эти сложные фильтры:
coverage:
enabled: true
include:
- app/*
exclude:
- app/cache/* Параметры включения и исключения могут быть переопределены для каждого набора в соответствующих файлах конфигурации.
По умолчанию, если покрытие составляет < 35%, оно отмечается как низкое, а >70% - как высокое. Вы также можете определить верхние и нижние границы с помощью параметров конфигурации low_limit и high_limit:
coverage:
enabled: true
low_limit: 30
high_limit: 60 По умолчанию, отображать все разрешенные файлы в выходных данных --coverage-text а не только те, у которых установлен параметр конфигурации:
coverage:
enabled: true
show_uncovered: false По умолчанию, отображать только сводку отчета о покрытии в выходных данных --coverage-text параметр конфигурации:
coverage:
enabled: true
show_only_summary: false Для получения дополнительной информации ознакомьтесь с документацией по конфигурации PHPUnit
Локальное покрытие кода
Базовое покрытие кода можно собирать для функциональных и модульных тестов. Если вы выполнили шаги настройки, описанные выше, вы готовы к работе. Все, что вам нужно, это выполнить codeception с параметром --coverage.
Чтобы сгенерировать отчет в формате clover xml или красочный html-отчет, добавьте также параметры --coverage-xml и --coverage-html.
codecept run --coverage --coverage-xml --coverage-html
Отчеты в формате XML и HTML хранятся в каталоге _output. Лучший способ просмотреть отчет — открыть index.html из tests/_output/coverage в вашем браузере. Отчеты XML в формате clover используются IDE (например, PHPStorm) или серверами непрерывной интеграции (например, Jenkins).
Удаленное покрытие кода
Локальный сервер
Если вы запускаете свое приложение через веб-сервер (Apache, Nginx, PHP WebServer), у вас нет прямого доступа к протестированному коду, поэтому сбор покрытия становится непростой задачей. То же самое относится к скриптам, которые тестируются на разных узлах. Чтобы получить доступ к этому коду, вам нужен xdebug с включенным параметром remote_enable. Codeception также требует небольшой шпиона для взаимодействия с вашим приложением. Так как ваше приложение работает автономно, даже не зная, что оно тестируется, для сбора информации о покрытии необходимо включить небольшой файл.
Этот файл называется c3.php и доступен на GitHub. c3.php необходимо загрузить и включить в ваше приложение в самой первой строке контроллера. Отправляя специальные заголовки, Codeception будет управлять вашим приложением, когда начинать и останавливать сбор данных о покрытии. После завершения набора тестов отчет будет сохранен, и Codeception получит его из вашего приложения.
Пожалуйста, следуйте инструкциям по установке, описанным в файле readme.
Для подключения к c3 Codeception использует конфигурацию url из модуля PhpBrowser или WebDriver. Но URL индекса с c3.php можно указать явно с помощью параметра c3_url:
coverage:
# url of file which includes c3 router.
c3_url: 'http://127.0.0.1:8000/index-test.php/' Примечание: мы не можем иметь несколько
c3_urlна одном хосте, отличающихся только портом. Используйте псевдоним домена (например,frontend.test:8000,backend.test:8080) вместо этого.
После включения файла c3.php в приложение вы можете начать сбор данных о покрытии. Если вы выполняете свое приложение локально, вам ничего не нужно менять в конфигурации. Все отчеты о покрытии кода будут собираться как обычно и объединяться после этого. Представьте себе: Codeception выполняет удаленное покрытие кода так же, как и локальное.
Настройка домена cookie
Возможна переопределение домена cookie, установленного Codeception во время сбора данных о покрытии. Типичный случай для этого - когда у вас есть несколько субдоменов, которые посещают ваши приемочные тесты, например, mysite.com и admin.mysite.com. По умолчанию Codeception будет собирать данные о покрытии кода только для домена, указанного в url WebDriver/url (или c3_url если определен), тем самым исключая другие субдомены из сбора данных о покрытии. Чтобы избежать этого и включить все соответствующие субдомены в сбор данных о покрытии, рекомендуется установить .mysite.com в качестве опции домена cookie:
coverage:
cookie_domain: ".mysite.com" Удаленный сервер
Но если вы запускаете тесты на другом сервере (или ваш веб-сервер не использует код из текущего каталога), необходимо добавить опцию remote в конфигурацию. Например, включим удаленное покрытие для набора тестов acceptance в acceptance.suite.yml:
coverage:
remote: true В этом случае результаты удаленного сбора данных о покрытии не будут объединены с локальными, если эта опция включена. Объединение возможно только в том случае, если у удаленных и локальных файлов одинаковый путь. Но при запуске тестов на удаленном сервере мы не уверены в этом.
Результаты сбора данных о покрытии с удаленного сервера будут сохранены в каталоге tests/_output. Обратите внимание, что результаты удаленного сбора данных о покрытии не будут отображаться в консоли по вышеуказанной причине: локальные и удаленные результаты не могут быть объединены, а консоль отображает результаты локального сбора данных о покрытии.
Рабочая директория (Docker/Общие монтирования)
Если ваш удаленный сервер доступен через общее монтирование или смонтированную папку (например, Docker Volumes), вы по-прежнему можете получить объединенные данные о покрытии. Используйте опцию work_dir для указания рабочей директории. При запуске CodeCoverage Codeception обновит любой путь, соответствующий опции work_dir для соответствия локальному текущему каталогу проекта.
Учитывая команду Docker, подобную:
docker run -v $(pwd):/workdir -w /workdir...
Используйте следующую конфигурацию, чтобы разрешить слияние данных о покрытии.
coverage:
remote: false
work_dir: /workdir Параметры удаленного контекста
Иногда создание html отчета может занять больше времени, чем стандартный таймаут в 30 секунд. Или, возможно, вы хотите изменить настройки SSL (например, verify_peer). Чтобы изменить способ, которым c3 отправляет запросы службы на ваш веб-сервер (будь то локальный или удаленный), вы можете использовать ключ remote_context_options в настройках coverage.
coverage:
remote_context_options:
http:
timeout: 60
ssl:
verify_peer: false Параметры потока контекста подробно описаны на php.net
Заключение
Установка локального и удаленного сбора данных о покрытии кода никогда не была проще. Всего одна конфигурация и один дополнительный файл для включения! С помощью Codeception вы можете легко сгенерировать отчеты о покрытии кода для своих тестов Selenium (или других приемочных или API-тестов). Объединение отчетов для наборов тестов acceptance, functional, и unit предоставляет вам наиболее полную информацию о том, какие части ваших приложений протестированы, а какие нет.
- Следующая глава: Непрерывная интеграция >
- Предыдущая глава: < Тестирование API
© 2011 Michael Bodnarchuk and contributors
Licensed under the MIT License.
https://codeception.com/docs/11-Codecoverage