🐠

PHPUnit10.1.2でカバレッジレポートを出力する

2023/04/23に公開

はじめに

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