Об'єднуємо Code Coverage від PHPUnit і phpspec

Сьогодні та чи інша бібліотека на 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">
<fs>tests</directory>
</testsuite>
</testsuites>

<filter>
<whitelist>
<fs>src</directory>
<exclude>
<fs>src/*Bundle/Resources</directory>
<fs>src/*/*Bundle/Resources</directory>
<fs>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
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.