Spec-Zone.ru › Codeception

Покрытие кода

В какой-то момент вам захочется проверить, какие части вашего приложения хорошо протестированы, а какие нет. Именно для этого используется CodeCoverage. При выполнении тестов для сбора отчета о покрытии вы получите статистику по всем классам, методам и строкам, затронутым этими тестами. Основным критерием покрытия является отношение между всеми строками в скрипте и всеми затронутыми строками. В идеальном мире вы должны получить 100% покрытие кода, но на практике 80% вполне достаточно. Потому что даже 100% показатель покрытия кода не спасет вас от фатальных ошибок и сбоев.

Необходимая информация предоставляется SebastianBergmann\CodeCoverage, и вы можете использовать любой из поддерживаемых драйверов.

Драйвер Описание
Xdebug Отлично подходит для отладки, но слишком медленный при сборе покрытия
phpdbg Быстрее, чем Xdebug, но неточный
pcov Быстрый и точный, но без функций отладки — идеально подходит для CI

Code Coverage Example

Данные о покрытии можно собирать вручную для локальных и удаленных тестов. Удаленные тесты могут выполняться на различных узлах или локально, но через веб-сервер. Может показаться сложным собрать покрытие кода для тестов 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API