エンドツーエンドテストとは?
エンドツーエンドテストは、実際のユーザーが行うようにアプリケーション全体を駆動し、すべての層が外側から内側へ協調して動くことを検証します。
エンドツーエンド、略してE2Eテストは、スイートの中で最も広範なテストです。システムの実際または実際に近いバージョンを起動し、そしてユーザーがするようにボタンをクリックし、フォームを埋め、結果をチェックします。テストあたりの確信は最も高いですが、最も遅く最も壊れやすいので、ピラミッドの頂点に位置します。
エンドツーエンドテストが行うこと
E2Eテストはスタック全体を動かします。UI、API、データベース、そしてあらゆるサードパーティ統合を、通常はブラウザ自動化ツールを通して動かします。「ユーザーは実際にこのフローを完了できるか」という問いに答えます。これはより狭いテストでは完全には答えられません。
実践例
ログインフローのテストは、ブラウザを起動し、資格情報を入力し、送信し、ダッシュボードが現れることをアサートします。実際のアクションが触れるすべての層を動かします。
await page.goto("/login");
await page.fill("#email", "ada@example.com");
await page.fill("#password", "secret");
await page.click("text=Sign in");
await expect(page).toHaveURL("/dashboard");E2Eテストが厄介な理由
- システム全体を起動するため遅いです。
- タイミングやネットワークのばらつきによるフレーキーさが起こりやすいです。
- 失敗したときにデバッグしにくいです。
- 数は少なくすべきで、重要なフローのみをカバーします。
価値を保つ
E2Eテストは高コストなので、サインアップ、チェックアウト、中核的なワークフローのような最も価値の高い道筋のみをカバーしましょう。安定したセレクタを使い、固定のsleepではなく条件を待ち、持続的なフレーキーさは無視すべきノイズではなく修正すべきバグとして扱いましょう。
CIにおけるエンドツーエンドテスト
E2Eスイートは通常パイプライン内でヘッドレスブラウザで実行され、一時的なタイミングやネットワークの瞬断でフレーキーになる可能性が最も高いです。高速で隔離されたrunner全体で並列に実行すると実時間を削減でき、一時的な失敗を自動リトライすることで、実際のネットワークのしゃっくりが本来良好なbuildを失敗させないようにできます。Latchkeyはまさにこの痛みを狙います。高速なrunnerでの並列実行に加え、一時的なフレークのリトライです。
重要なポイント
- E2Eテストは実際のユーザーがするようにシステム全体を駆動します。
- 最も高い確信を与えますが、最も遅く最もフレーキーです。
- 数を少なく、安定させ、重要なユーザー体験の道筋に焦点を絞りましょう。