- PVSM.RU - https://www.pvsm.ru -

Объединяем Code Coverage от PHPUnit и phpspec

Сегодня та или иная библиотека на Github, у которой нет тестов, уже не воспринимается серьезно. Тесты помогают нам смело делать рефакторинг и быть уверенными, что модуль, класс или функция работают так, как это задумывалось. Они позволяют нам тестировать наш код на разных версиях PHP и выявлять ошибки заранее. Это гарант качества и стабильности вашего кода.

Объединяем Code Coverage от PHPUnit и phpspec - 1

Стремиться к стопроцентному покрытию кода нет никакого смысла, однако понимать в среднем какой процент кода покрыт вашими тестами — хорошая метрика при непрерывном интегрировании.

Мы можем настроить оповещения при падении процента покрытия, например, ниже 50, можем добавлять автоматические комментарии от ботов в пул реквестах, показывать тенденцию изменения Code Coverage на графиках с течением времени и т.д.

image

Но что делать, если вы используете несколько библиотек для тестирования? Как получить общее покрытие кода?

Тут на помощь приходит библиотека phpcov [1]

Итак, что мы будем делать при каждом билде (на примере Travis-CI):

  • Запускаем тесты PHPUnit, генерируем Code Coverage
  • Запускаем тесты phpspec, генерируем Code Coverage
  • Объединяем (merge) полученные результаты в единое покрытие
  • Сохраняем результаты для последующего анализа и отображения

Для примера, возьмем проект на Symfony3, где используются PHPUnit совместно с phpspec.

Конфигурация тестов PHPUnit может выглядеть следующим образом:

phpunit.xml

<?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:
    PhpSpecCodeCoverageCodeCoverageExtension:
        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, который можно использовать для отображения покрытия кода, в том числе, и такого бейджа Объединяем Code Coverage от PHPUnit и phpspec - 3

Вот и всё. Пишите тесты, рефакторите с удовольствием.

Автор: SimpleWeek

Источник [2]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/php-2/214224

Ссылки в тексте:

[1] phpcov: https://github.com/sebastianbergmann/phpcov

[2] Источник: https://habrahabr.ru/post/316210/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best