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使用という環境で試してみました。
- コマンドで
php -i
を実行し、phpinfo
の内容を出力。その内容をコピー - https://xdebug.org/wizard.phpにアクセスし、テキストエリアに1.の内容を丸ごとコピーし、ボタンをクリック
- 画面にセットアップ手順が表示されるので、その指示に沿ってセットアップを行う
php_xdebug-X.X.X-Y.Y-vcZZ.dll
のようなバージョン指定のdllファイルをリンクからダウンロード- XAMPPインストールディレクトリしたの
php\ext
に1.のファイルをカット&ペースト - XAMPPの
php.ini
を編集、zend_extension = D:\xampp\php\ext\php_xdebug-2.7.2-7.1-vc14.dll
の1行を付け足して保存 - 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ファイルを開いてみると
確かに、カバレッジの内容が表示されますね(テストの結果はともかくとして……)。