Сегодня та или иная библиотека на Github, у которой нет тестов, уже не воспринимается серьезно. Тесты помогают нам смело делать рефакторинг и быть уверенными, что модуль, класс или функция работают так, как это задумывалось. Они позволяют нам тестировать наш код на разных версиях PHP и выявлять ошибки заранее. Это гарант качества и стабильности вашего кода.
Стремиться к стопроцентному покрытию кода нет никакого смысла, однако понимать в среднем какой процент кода покрыт вашими тестами — хорошая метрика при непрерывном интегрировании.
Мы можем настроить оповещения при падении процента покрытия, например, ниже 50, можем добавлять автоматические комментарии от ботов в пул реквестах, показывать тенденцию изменения Code Coverage на графиках с течением времени и т.д.
Но что делать, если вы используете несколько библиотек для тестирования? Как получить общее покрытие кода?
Тут на помощь приходит библиотека phpcov
Итак, что мы будем делать при каждом билде (на примере Travis-CI):
- Запускаем тесты PHPUnit, генерируем Code Coverage
- Запускаем тесты phpspec, генерируем Code Coverage
- Объединяем (merge) полученные результаты в единое покрытие
- Сохраняем результаты для последующего анализа и отображения
Для примера, возьмем проект на Symfony3, где используются PHPUnit совместно с phpspec.
Конфигурация тестов PHPUnit может выглядеть следующим образом:
<?xml version="1.0" encoding="UTF-8"?> <!-- https://phpunit.de/manual/current/en/appendixes.configuration.html --> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.8/phpunit.xsd" backupGlobals="false" colors="true" bootstrap="app/autoload.php" > <php> <ini name="error_reporting" value="-1" /> <server name="KERNEL_DIR" value="app/" /> </php> <testsuites> <testsuite name="Project Test Suite"> <directory>tests</directory> </testsuite> </testsuites> <filter> <whitelist> <directory>src</directory> <exclude> <directory>src/*Bundle/Resources</directory> <directory>src/*/*Bundle/Resources</directory> <directory>src/*/Bundle/*Bundle/Resources</directory> </exclude> </whitelist> </filter> <logging> <log type="coverage-php" target="/tmp/coverage_phpunit.cov"/> </logging> </phpunit>
Это стандартный конфиг, за исключением нескольких строк:
<logging> <log type="coverage-php" target="/tmp/coverage_phpunit.cov"/> </logging>
Здесь мы говорим, что будет использован PHP формат отчета о покрытии и кладем файл в нужную папку.
Далее похожие действия делаем с phpspec:
# phpspec.yml ... extensions: PhpSpecCodeCoverage\CodeCoverageExtension: format: - php output: php: /tmp/coverage_phpspec.cov
Осталось запустить это всё дело при каждом билде и смержить результаты:
# .travis.yml ... script: - bin/phpspec run --format=pretty - bin/phpunit - wget https://phar.phpunit.de/phpcov.phar && php phpcov.phar merge /tmp --clover coverage.xml
phpcov собирает все данные из вашей папки, объединяет их и сохраняет результат в формате Clover, который можно использовать для отображения покрытия кода, в том числе, и такого бейджа
Вот и всё. Пишите тесты, рефакторите с удовольствием.
ссылка на оригинал статьи https://habrahabr.ru/post/316210/
Добавить комментарий