105
107

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2016-01-19

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

105
107
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
105
107

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?