2021年2月26日追記
最近は PCOV が良いらしいです。
PCOV は PHPUnit8 以降の対応なので、この記事は PHPUnit8 未満の方向けです。
2021年8月2日追記
が、phpdbg と比べてカバレッジが下がってしまう場合もあるようです
ユニットテストの評価に、コードカバレッジを使用することは、よくあると思います。
従来より、 PHPUnit にはコードカバレッジ解析機能が実装されており、 HTML をはじめとするいくつかの形式で、レポートを出力可能です。
PHP5 では、 xdebug が提供するステートメントカバレッジ機能が利用されてきましたが、これが大変遅く、1100 Assertions ほどの EC-CUBE3 のカバレッジを出力するまで、2時間以上かかります。
しかも、速い CPU にしても大して速くならないのです。
Windows 環境では特に遅くなるらしく、6時間くらいかかります。
PHP7 + PHP_CodeCoverage 2.2 からは、 phpdbug が利用できるようになりました。
HTML のレポートを出力する場合は、以下のように実行します。
phpdbg -qrr path/to/phpunit --coverage-html <output dir>
xdebug では 2時間以上かかっていたのが、 phpdbg では、なんと 6分程度で終わりました!
Time: 6.01 minutes, Memory: 218.00Mb
レポートも、 xdebug と同じように出力できます。
Coveralls.io で、こんなレポートも作成できます。
ただ、 xdebug では正常だったテストがいくつかエラーになってしまう場合があるようですが、 PHP7 のバージョンアップに伴い改善されています。
完璧とは言えませんが、カバレッジレポートを出すくらいでしたら大きな支障は無いと思います。
2021年8月2日追記
phpdbg と xdebug3 の比較
2020年11月に xdebug3 がリリースされました。 xdebug2 に比べ、パフォーマンスが向上しているようです。
2000 Assertion 弱の EC-CUBE4 では30分弱で出力できるようになりました。
phpdbg の場合は20分弱かかっていますので、大幅な差は無くなっています。
また、 xdebug3 の方が正確なカバレッジ計測ができるとのことですが、0.1%程度の差のようです。
Too many open files と言われる時は
大きめのプロジェクトで phpdbg を実行すると、 Too many open files のエラーとなってしまう。これを回避するには phpdbg を Docker Container 経由で実行すると良い。
Travis-CI では ulimit -n 30000 の制限がかかっているが、 Docker Container では ulimit -n 524288 まで使用可能
docker run -v "$PWD":/usr/src/myapp:cached -w /usr/src/myapp --rm nanasess/phpdbg phpdbg -qrr -dmemory_limit=-1 ./path/to/bin/phpunit --coverage-clover=coverage.clover
Dockerfile はこちら
https://github.com/nanasess/phpdbg