自動テストの自動化は、速度を向上させ、人間の要因を減らすという考えから始まりましたが、すぐに自動テストは実行するたびに異なる動作をすることがわかりました。再現性(repeatability)と決定性(determinism)は、自動テストの質に対する基本的な要件の一つであり、同じ条件下で同じ結果を出すべきです。
問題は、明示されていない依存関係から始まります:不安定なテストデータ、同期されていない環境、並行プロセス、または外部サービスの影響です。これがフレイキー(flaky)テストを引き起こし、その結果を予測することができなくなります。
解決策は、実行環境の厳密な管理、テストの分離、モック/スタブオブジェクト、静的データ、および再現可能なシナリオ(例:各テストの前にデータベースをクリアし、準備すること)に基づいています。
主な特徴:
CIでのみフレイキーテストが発生し、ローカルではすべてが安定している場合はどうすればいいですか?
これはほぼ常に環境の違いに関連しており、依存関係のバージョン、インフラの動作速度、並列処理、OSの設定、テストの実行順序が関係しています。解決策は、CI環境を可能な限りdevマシンに近づけることです(Docker、一致したシード値、テストのsetUp/tearDownの設定)。
データがデータベースから取得される場合、パラメータ化されたテストは完全に決定的と見なすことができますか?
いいえ。データが基本的に一致していても、データベースはテスト間やリリース間で変化する可能性があります。真の決定性を確保するためには、テストごとにデータを明示的に準備し、クリアする必要があります。
要素のロードを待つためにsleepを使用することで、UIテストの不安定性の問題は解決しますか?
いいえ。sleepは問題を隠すだけで、テストの実行を遅くします。明示的な待機(Explicit Waits)を使用し、固定時間でなく特定の条件を待つべきです。
プロジェクトでは手動テストの後に誰もクリーンアップしないスタンドでUIテストが実行されていました。数回の夜の間に、テストが「ランダム」なエラーで失敗しました。それはローカルでは発生しませんでした。チームはテストにsleepを追加し、フレイキーテストの問題を無視しました。
利点:
欠点:
成熟したDevOpsエンジニアが出現した後、チームはテストデータのリセットと初期化のスクリプトを実装し、不安定な統合のためにモックサービスを追加し、コンテナ内でテストを実行するようになりました。フレイキーテストはほとんど消えました。
利点:
欠点: