PHPUnitとXdebugでコードカバレッジの出力を試す

Laravel Conference 2019で軽く触ったものの、その後まったく触っていませんでした。が、最近あるサンプルコードでテストコードを書いてみようと思い立ち、PHPUnitを使ったテストコードを書いてみました。

一通り書き終わって、「そういえばカバレッジって出力できるのだろうか?」と思い、調べてみたのでその内容を備忘録として記録しておきます。

結論から言うと、PHPUnitのほかにXdebugというライブラリが必要で、そのセットアップを行うことでカバレッジ出力できるようになりました。

1. Xdebugがあるかどうかの確認

"scripts": {
        //略
    "test:coverage": "phpunit --coverage-html coverage"
}

PHPUnitがインストールされているプロジェクトで、上述のようにcomposer.jsonの中にscriptsを書き足します。

<phpunit bootstrap="vendor/autoload.php">
    <!-- 略 -->
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./src/</directory>
        </whitelist>
    </filter>
</phpunit>

次に、phpunit.xmlにテスト対象のフィルタを追加します。上述の例では/src/ディレクトリ以下のphpファイル全てということになります。

この2つを設定した上で、以下のコマンドを実行。

> composer test:coverage

もし

Error: No code coverage driver is available

というエラーが表示されたら、Xdebugがインストールされていないことになるので、インストールに進みます。

2. Xdebugのセットアップ

Xdebugのセットアップは環境によってまちまちのようです。私の場合はWindowsでXAMPP使用という環境で試してみました。

  1. コマンドでphp -iを実行し、phpinfoの内容を出力。その内容をコピー
  2. https://xdebug.org/wizard.phpにアクセスし、テキストエリアに1.の内容を丸ごとコピーし、ボタンをクリック
  3. 画面にセットアップ手順が表示されるので、その指示に沿ってセットアップを行う
    1. php_xdebug-X.X.X-Y.Y-vcZZ.dllのようなバージョン指定のdllファイルをリンクからダウンロード
    2. XAMPPインストールディレクトリしたのphp\extに1.のファイルをカット&ペースト
    3. XAMPPのphp.iniを編集、zend_extension = D:\xampp\php\ext\php_xdebug-2.7.2-7.1-vc14.dllの1行を付け足して保存
    4. XAMPPのApacheを再起動

私の場合、これでOKでした。

3. カバレッジ出力

「2. Xdebugのセットアップ」が完了した状態で、「1. Xdebugがあるかどうかの確認」の最後で実行したコマンド

> composer test:coverage

を再度実行します。

> composer test:coverage
> phpunit --coverage-html coverage
PHPUnit 7.5.14 by Sebastian Bergmann and contributors.

..............                                                    14 / 14 (100%)

Time: 596 ms, Memory: 6.00 MB

OK (14 tests, 36 assertions)

Generating code coverage report in HTML format ... done

テストの後に

Generating code coverage report in HTML format … done

というメッセージが出力され、生成されていることが確認できます。

今回はhtmlオプション指定なので、プロジェクトのルートディレクトリ下にcoverageディレクトリが作成され、その中にHTMLファイルなどが生成されました。試しにそのHTMLファイルを開いてみると

カバレッジの出力サンプル
カバレッジの出力サンプル

確かに、カバレッジの内容が表示されますね(テストの結果はともかくとして……)。

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。