よくあることですが、PHPUnitでテストを書いている場合、テストケースが増えてくると徐々に実行速度が気になってきます。テストの量が増え、完了するまでの時間が単純に増えていくためです。
そんなとき、とにかくテストをさっさと終わらせるためのtipsです。
テストする量を減らす
ローカルで開発するときは毎回すべてのテストを実行する必要はないかと思います。そんなときはテストする量自体を減らしましょう。
filter
や group
オプションを使用し特定のテストだけ実行すると、実行テストの総量が減り完了までの時間は短くなります。
また、PhpStormなどのエディタの機能を使えば特定のテストを実行することがエディタ上で可能になります。
カバレッジを計測しない
filter
や group
の他に、実行時間を短縮する可能性のあるオプションが一つあります。
--no-coverage
オプションです。
開発環境やCI環境であれば、デバッグ用途であったりコードカバレッジの計測のためXDEBUG
がインストールされていると思います。このとき、コードカバレッジの計測がデフォルトで有効になっていると、毎回カバレッジの計測を行うため時間がかかります。
下記の例だと、オプションがない場合 5分、オプションを付けた場合 35秒 程度。8倍以上速度に差があることがわかります。
デフォルトの変更をしたいけれどやんごとなき事情ですぐに変更できない、けれどテストをさっさと終わらせたい、といった場合は、 --no-coverage
オプションをつけるとテストが捗ります。
CIで工夫してリリースを早める
また、CIでカバレッジを計測して Coveralls や Codecov などにレポートを送信している場合、本番/STG環境へのリリース時はカバレッジを計測しないという手段が取れると、リリースまでの時間を短縮することが可能になります。
CircleCIであれば、特定ブランチで行うテスト用の処理を切り替えてやれば可能になります。
参考
この方法を取ると、同じ環境でもオプションの有無だけで速度を改善するということが可能になるため、諸々の管理コストが省けるようになると思います。(他に良い方法があれば追記・修正したいと思います)
おわりに
テストの時間を短縮する方法は他に、並列化したり、 XDEBUG
を必要なときだけ有効にするなどあると思います。組織によって環境は異なってくるかと思うので、必要に応じて良い方法を取捨選択できるとよいかなと思います。
他参考