はじめに
年に何回か直面する現象。
ローカルではテストが通るのにCircleCIでだけテストが通過しない現象にあったので、対応したり調べた内容を備忘録がわりにまとめる。
結論
- rspecの設定変更やテスト環境のデータ、
travel_to
の影響が考えられる→テストファイルの実行順序が原因となっているケースが多い - CI上では時間短縮のために並列テストを実装しているケースが多く、テストの実行時間によって分割する仕組みを導入している場合、(circleCIの場合は
circleci tests split --split-by=timings
など)実行時間の変更によってテストの実行順序が変わることも多く、それが原因となることがある
- 対象のテストファイルを
echo
で文字列として出力し、テストファイルの実行順序を把握できるようにするとデバッグしやすい
今回のエラー調査のために試してみたことリスト
- ローカルでテストを実行してみる
- CI上で、落ちたテストファイルのみを実行してみる
- 落ちたテスト以外をコメントアウトして実行してみる
- ssh接続を行い、テストのコマンドを実行してみる
- ssh接続し、circleCIの
config.yml
のtestジョブで実行してるコマンドを一つずつ実行する
→上記全部試した後にテストの実行順序に着目する(遅すぎ、、)
以下の手順で、さらに原因を細かく特定する
原因を特定するために、さらに細かく試してみる
- ローカルで、落ちたテストファイルの前に実行したテストをCI上の順番通りに実行→ローカルでもテストが落ちた!
- 落ちたテストファイルの前のテストファイルの数を少なくしていき、何のテストファイルを実行した後にテストが落ちるのか特定する(落ちたテストファイルの直前とは限らないので注意!)
- 原因のテストファイルの複数箇所をコメントアウトしながら確認し、どのテストケースを実行するとテストが落ちるの確認する
→ここまで、実行して、原因が特定できた!(ActiveJobのテストが原因だった)
CircleCIのSSH接続について
今回は必要なかったが、覚えておいたほうがいい。意外と簡単。
まとめ
急にテストが落ちるようになったら、テストファイルの実行順序を確認してみようというお話でした