🐠
PHPUnit10.1.2でカバレッジレポートを出力する
はじめに
PHPUnitとXdebugでカバレッジレポートを出力できると知り、早速環境を整えることに。
・・・だが、なかなか上手くいかない。
色々と検索したが、PHPUnit10.1.2のまとまった情報が見つけられず、公式ドキュメントを読み漁り2時間ほどかけてようやく出力できた。
せっかくなので、記事にまとめておくことに。
この記事の想定読者
PHPUnit 10.1.2でカバレッジレポートの出力が失敗する人
環境
- PHP:8.2.5
- PHPUnit:10.1.2
- Xdebug:3.2.1
手順
1.phpunit.xmlの作成
早速だが、ここが第1のハマりポイントだった。
phpunit.xmlは、PHPUnitのバージョンによって記載方法が異なるようで、古いバージョンの記事や公式ドキュメントを読んでいたために、正しい記載ができていなかった。
調べたところ、vendor/bin/phpunit --generate-configuration
を使用すると、対話形式でphpunit.xmlを簡単に生成できるため、こちらで作成した。
今回は全てデフォルト(入力なし)とした。
# vendor/bin/phpunit --generate-configuration
PHPUnit 10.1.2 by Sebastian Bergmann and contributors.
Generating phpunit.xml in /var/www/html
Bootstrap script (relative to path shown above; default: vendor/autoload.php):
Tests directory (relative to path shown above; default: tests):
Source directory (relative to path shown above; default: src):
Cache directory (relative to path shown above; default: .phpunit.cache):
Generated phpunit.xml in /var/www/html.
Make sure to exclude the .phpunit.cache directory from version control.
2.ソースコードとテストコードを記載する
引数を2つ受け取って数字を合計する。
ソースコード
summary.php
<?php
class summary
{
public function sum(int $a, int $b)
{
return $a + $b;
}
}
テストコード
SummaryTest.php
<?php
use PHPUnit\Framework\TestCase;
require_once __DIR__ . '/../src/summary.php';
class SummaryTest extends TestCase
{
protected $summary;
public function testSummary()
{
$this->summary = new summary;
$this->assertSame(10, $this->summary->sum(4, 6));
}
}
3.テストコードにアノテーションを記載する
ここが第2のハマりポイント。
アノテーションを記載せずにテストを実行すると、以下のように「問題あり!」と言われてしまう。
# XDEBUG_MODE=coverage ./vendor/bin/phpunit --coverage-html TestResult
PHPUnit 10.1.2 by Sebastian Bergmann and contributors.
Runtime: PHP 8.2.5 with Xdebug 3.2.1
Configuration: /var/www/html/phpunit.xml
R 1 / 1 (100%)
Time: 00:00.180, Memory: 8.00 MB
There was 1 risky test:
1) SummaryTest::testSummary
This test does not define a code coverage target but is expected to do so
/var/www/html/tests/SummaryTest.php:10
OK, but there are issues!
Tests: 1, Assertions: 1, Risky: 1.
ここで詰まっていたが、以下の記事と公式ドキュメントを参考にさせていただき解決した。
どうやら、アノテーションを記載する必要があるらしい。
アノテーションの記載方法は割愛。
summary.php
<?php
use PHPUnit\Framework\TestCase;
require_once __DIR__ . '/../src/summary.php';
/**
* @covers summary
*/
class SummaryTest extends TestCase
{
protected $summary;
public function testSummary()
{
$this->summary = new summary;
$this->assertSame(10, $this->summary->sum(4, 6));
}
}
4.テストの実行とカバレッジレポートの出力
# XDEBUG_MODE=coverage ./vendor/bin/phpunit --coverage-html TestResult
PHPUnit 10.1.2 by Sebastian Bergmann and contributors.
Runtime: PHP 8.2.5 with Xdebug 3.2.1
Configuration: /var/www/html/phpunit.xml
. 1 / 1 (100%)
Time: 00:00.173, Memory: 10.00 MB
OK (1 test, 1 assertion)
Generating code coverage report in HTML format ... done [00:00.097]
ブラウザで開き、テストの正常終了とレポートの正常出力を確認。
まとめ
バージョンの違いには気をつけよう。
Discussion