Pull to refresh
0
SimpleWeek
Персональный менеджер задач

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

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



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

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

image

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

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

Итак, что мы будем делать при каждом билде (на примере 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:
    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, который можно использовать для отображения покрытия кода, в том числе, и такого бейджа

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

UPD: бейджи, комментарии в пул реквестах и многое другое делается с помощью сервиса codecov.io (или как альтернатива — coveralls.io)

После настройки репозитория, интеграция с Travis-CI делается в одну строку:

# .travis.yml
...
after_success:
  - bash <(curl -s https://codecov.io/bash)


Codecov автоматически возьмет сгенерированный отчет в формате Clover и проанализирует его.

Также, при установке дополнения в браузер, можно прямо на Github видеть, какие строки покрыты тестами, а какие нет:

image
image
Tags:
Hubs:
+16
Comments 7
Comments Comments 7

Articles

Information

Website
simpleweek.com
Registered
Founded
Employees
2–10 employees
Location
Беларусь