108
Help us understand the problem. What are the problem?

posted at

updated at

Organization

PHP でカバレッジを出すなら phpdbg

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 と同じように出力できます。

キャプチャ.PNG

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

See Also

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
108
Help us understand the problem. What are the problem?