Edited at

PHPUnitの実行をさっさと終わらせたいとき

よくあることですが、PHPUnitでテストを書いている場合、テストケースが増えてくると徐々に実行速度が気になってきます。テストの量が増え、完了するまでの時間が単純に増えていくためです。

そんなとき、とにかくテストをさっさと終わらせるためのtipsです。


テストする量を減らす

ローカルで開発するときは毎回すべてのテストを実行する必要はないかと思います。そんなときはテストする量自体を減らしましょう。

filtergroup オプションを使用し特定のテストだけ実行すると、実行テストの総量が減り完了までの時間は短くなります。

参考: PHPUnit で指定したのテストのみを実行する

また、PhpStormなどのエディタの機能を使えば特定のテストを実行することがエディタ上で可能になります。

参考: Testing with PHPUnit


カバレッジを計測しない

filtergroup の他に、実行時間を短縮する可能性のあるオプションが一つあります。

--no-coverage オプションです。

開発環境やCI環境であれば、デバッグ用途であったりコードカバレッジの計測のためXDEBUG がインストールされていると思います。このとき、コードカバレッジの計測がデフォルトで有効になっていると、毎回カバレッジの計測を行うため時間がかかります。

下記の例だと、オプションがない場合 5分、オプションを付けた場合 35秒 程度。8倍以上速度に差があることがわかります。

オプションがない場合

領域のキャプチャ_20_waku.png

オプションがある場合

領域のキャプチャ_21_waku.png

デフォルトの変更をしたいけれどやんごとなき事情ですぐに変更できない、けれどテストをさっさと終わらせたい、といった場合は、 --no-coverage オプションをつけるとテストが捗ります。


CIで工夫してリリースを早める

また、CIでカバレッジを計測して CoverallsCodecov などにレポートを送信している場合、本番/STG環境へのリリース時はカバレッジを計測しないという手段が取れると、リリースまでの時間を短縮することが可能になります。

CircleCIであれば、特定ブランチで行うテスト用の処理を切り替えてやれば可能になります。

参考

- Configuring CircleCI#branches

- Configuring CircleCI#filters

この方法を取ると、同じ環境でもオプションの有無だけで速度を改善するということが可能になるため、諸々の管理コストが省けるようになると思います。(他に良い方法があれば追記・修正したいと思います)


おわりに

テストの時間を短縮する方法は他に、並列化したり、 XDEBUG を必要なときだけ有効にするなどあると思います。組織によって環境は異なってくるかと思うので、必要に応じて良い方法を取捨選択できるとよいかなと思います。

他参考

- PHPUnitのコードカバレッジが遅いからってあきらめずに、並列実行ためしてみる

- CircleCIでmasterブランチのみカバレッジを測るようにphpunitを実行する