Railing against time: tools and techniques that got us 5X faster tests
同社がコンサルする会社でテスト実行時間が約5倍早くなった
50分から12分へ
テスト最適化の考え方
最適化する最も価値のあるものを探す
簡単に達成できる成果を見つけ、過度に最適化しない
測定し、常に最適化の前後のタイミングを比較する
見るべきメトリクス
合計テスト時間、コールスタック内の最も遅いメソッド、最も多く使用されている (そして最も遅い) ファクトリ
TEST_STACK_PROF=1 SAMPLE=1000 bin/rspecでレポートを出力
FPROF=flamegraph bin/rspecでレポート出力
やったこと
不要なコールバックがテストで呼ばれないようにする
あるファクトリーで作るモデルのコールバックで大量のデータが作られるが、テストの約1%でしか必要ない
そのモデルにTestingモジュールを追加し、fake modeであればコールバックメソッドで何もしないようにした
fake modeかどうかはRSpecのタグで決定でき、必要なテストだけタグを明示的につける これにより20分ほど短縮できた
factoryの最適化
associationで関連を宣言している場合、不要でも関連レコードが作られてしまう
traitで宣言された場合のみレコードを作るようにする
ほぼすべてのテストでユーザーが作成されている
TestProfのAnyFixture機能でテストスイートのサイクルで一度だけ作られるようにした 10分短縮できた
let_it_be
FactoryDefaultでdefault userを使い回す
let_it_beによりexample間でデータを使い回す
これらにより10分短縮できた