E2E(End-to-End/エンドツーエンド)テストは、利用者がたどる操作を入口から出口まで通しで動かし、画面・API・データベース・外部サービスがつながった状態で業務が完了するかを確かめるテストです。結合テストが部品どうしの受け渡しを確かめるのに対し、E2Eテストは「ログインして商品を選び、決済まで到達できるか」を丸ごと再現します。この記事では、JSTQBのテストレベルに沿った結合テスト・システムテストとの違い、Playwright 1.64.1で最初の1本を動かす手順、ツールの選び分け、公式ドキュメントのベストプラクティスを実行結果つきで整理し、内製と外注の判断基準まで扱います。
まとめ|E2Eテストで最初に決める3つのこと
最初に決めるのは本数ではなく対象を絞る基準です。E2Eは遅く、UI変更で壊れやすく、維持費が続きます。止まると売上か顧客対応に直結する主要動線だけをE2Eにし、計算ロジックや分岐の網羅は単体テストと結合テストへ落とします。網羅率を目標にE2Eを増やすと、実行時間と失敗調査の負債が積み上がります。
次がセレクタと待機の規約。壊れたE2Eを直すときに最初に疑うのは、CSSクラスへの依存と固定秒数の待機という2つの書き癖です。応答が200〜1,199msでばらつく検証用アプリでは、500msの固定待機で判定するテストが20回中13回失敗し、条件が満たされるまで待つ書き方は20回すべて成功しました。
最後が誰が保守し続けるか。E2Eは機能追加のたびに追従が要る資産で、直す人がいないまま本数だけ作ると、失敗が赤いまま放置されやすくなります。外注する場合も、テストコードと実行環境は自社に置く前提で発注してください。
E2Eテストとは:JSTQBの定義と検証範囲
E2Eテストの検証範囲と業務フロー
E2Eテストはシステムを部品に分解せず、利用者と同じ入口から操作して結果を確かめます。ECサイトなら「商品検索→カート投入→ログイン→配送先入力→決済→注文確定メール」が1本のシナリオで、途中に自社API・決済代行・在庫管理が含まれます。内部実装を見ずに結果だけを判定するため、ブラックボックステストとホワイトボックステストの違い|技法・カバレッジ基準・使い分けの分類ではブラックボックス側に属します。
国際的なテスト資格のJSTQB Foundation Levelシラバス V4.0(2023年4月12日)は、2.2.1で5つのテストレベルを定め、システムテストについて「多くの場合、エンドツーエンドのタスクに対する機能テスト」に焦点を当てると書いています。つまりE2Eは独立したテストレベルの名前ではなく、主にシステムテストの段階で行う「通しのシナリオで確かめる」テストの形です。
単体テスト・結合テストが見逃す欠陥の4類型
E2Eの価値は、部品単位のテストでは構造的に見つからない欠陥に絞ると判断しやすくなります。モジュールが個別に仕様どおりでも、つないだ瞬間に壊れる典型は次の4つです。
- 設定・環境差:CookieのSameSite属性やCORS設定が本番構成と違い、決済リダイレクト後にセッションが切れる
- 画面遷移:APIは200を返しているのに遷移先URLが誤っていて完了画面に着かない
- 非同期の完了待ち:注文APIの応答前に完了画面を描画し、失敗時にも成功表示が残る
- 外部連携:決済代行のWebhookが遅れ、注文ステータスが未更新のまま確定扱いになる
どれもモックを使う結合テストでは再現しにくい欠陥です。4類型は代表例です。判断の基準は「下位のテストで再現できるか」で、再現できる不具合ならE2Eで探すより単体テストや結合テストで捕まえたほうが、失敗箇所の特定も速く済みます。サービス間の入出力の破壊だけを速く検知したいなら、契約テストとは?Pactによる消費者駆動契約の実装とCI組み込みを実装者向けに解説を併用するとE2Eの本数を増やさずに済みます。
E2Eテストと結合テスト・システムテストの違い
単体・結合・E2Eの検証範囲と実行時間の比較
E2Eテストと結合テスト(統合テスト)の違いは、検証の焦点と範囲です。結合テストはモジュール間やAPI間のインターフェースと相互処理に焦点を当て、外部依存はモックやスタブに置き換えることが多い段階です。E2Eは利用者の操作の入口から業務の完了までを通しで流し、つながった状態での振る舞いを確かめます。自社で制御できない外部サービスだけは、E2Eでも代替に置き換えるのが公式の推奨です(後述)。
| テストの層 | 検証範囲 | 1本の実行時間 | UI変更で壊れる頻度 | 原因箇所の特定 |
|---|---|---|---|---|
| 単体テスト | 関数・クラス | ミリ秒〜秒 | 低 | 容易 |
| 結合テスト | モジュール間・API間 | 秒 | 中 | やや容易 |
| E2Eテスト | 画面からDB・外部連携まで | 数秒〜分 | 高 | 困難 |
実行時間は一般的な目安です。右の2列がE2Eの本質的なコストで、1本の失敗から原因を突き止めるまでが長く、画面の構造や文言を変えるとセレクタが外れて壊れます。実行環境の境界(ネットワークや外部プロセスを使うか)で分類する見方は、テストサイズとは?GoogleのSmall/Medium/Large定義と単体・結合テストとの違いで扱っています。
結合テストとシステムテストの違い
JSTQBの5つのテストレベルでは、結合にあたる段階が2つに分かれます。コンポーネント統合テストは「コンポーネント間のインターフェース、および相互処理」、システム統合テストは「テスト対象システムと他のシステム、外部サービスとのインターフェース」に焦点を当てます。システムテストはその間に置かれ、システム全体の振る舞いを機能・非機能の両面で確かめる段階です。
| JSTQBのテストレベル | 焦点 | 日本の現場での呼び方 |
|---|---|---|
| コンポーネントテスト | 部品単独 | 単体テスト |
| コンポーネント統合テスト | 部品間のインターフェース | 結合テスト |
| システムテスト | システム全体の振る舞い | 総合テスト・E2E |
| システム統合テスト | 他システム・外部サービスとの接続 | 外部結合テスト |
| 受け入れテスト | 業務ニーズを満たすか | 受入テスト・UAT |
「システムテスト」は工程(テストレベル)の名前、「E2Eテスト」はテストの形の名前なので、両者は対立しません。システムテストの中で、利用者のシナリオを通しで流すものをE2Eと呼ぶのが実態に近い整理です。発注者として工程ごとの担当や検収を決めたい場合は、システム開発のテスト工程とは?種類・流れとV字モデル・発注者が見る判断軸が工程の側から整理しています。
テストピラミッドとテスティングトロフィーでのE2Eの本数
JSTQBシラバスの5.1.6はテストピラミッドを取り上げ、最上位のエンドツーエンドテストは遅く、大きな機能をまとめて確かめるので「ほんの数個のテストのみが必要」と述べています。結合テストを最も厚くするテスティングトロフィーでも、E2Eは上の少数派です。配分の設計手順はテストピラミッドとは?単体・結合・E2Eの配分と実装者向けテスト戦略設計、トロフィーとの違いはTesting Trophy(テスティングトロフィー)とは?Kent C. Doddsの4層とテストピラミッドとの違いで扱っています。E2Eの本数が結合テストを上回っていたら、配分が崩れているサインです。
E2Eテストのメリット・デメリットと自動化する範囲
E2Eテストで得られる効果と維持コスト
メリットは、先の4類型のように「つないで初めて出る欠陥」をリリース前に捕まえられることと、利用者と同じ操作で合否を判定するため、結果を開発者以外にも説明しやすいことです。主要動線のE2Eが緑なら、検証環境とそのテストデータでは注文完了まで到達できる、と根拠を持って言えます。
デメリットは、実行が遅い、UI変更で壊れる、失敗時に原因の層を特定しにくい、の3点がそのまま維持費になることです。加えて、外部サービスやテストデータの状態に結果が左右され、同じコードで成功と失敗を繰り返すフレークが起きやすくなります。抑え方は後述の公式ベストプラクティスで扱います。
自動化する動線と手動に残す確認
自動化に向くのは、繰り返し実行する価値があり、期待結果が機械的に判定でき、仕様が頻繁に変わらない動線です。サインアップ・ログイン・購入・問い合わせ送信がその代表で、小規模なプロダクトなら、止まると困る順に1〜3本から始めるのが現実的です。
一方、リリースごとにデザインが変わる画面、数か月に一度しか動かない業務、表示崩れのように人の目で判断する確認は、自動テストの作成・修正にかかる時間と、手動確認の回数×時間を比べ、手動のほうが安ければ手動に残します。見た目の差分だけを機械で拾いたいなら、VRT(ビジュアルリグレッションテスト)とは?仕組み・ツールの選び方とPlaywright実装が別軸の手段です。
Playwrightで最初のE2Eテストを動かす手順
Playwrightプロジェクトの初期化とブラウザ別設定
新規に始めるなら、初期化コマンドが設定ファイル・サンプル・ブラウザの取得までをまとめて行います。Playwright 1.64.1はnpmの宣言でNode.js 20以上を要求し、Chromium 156.0.8078.4・Firefox 157.0・WebKit 27.2を取得します(公式リリースノート)。
npm init playwright@latest
npm i -D @playwright/[email protected] # この記事の検証と同じ版に固定する場合
npx playwright install
npx playwright --version # Version 1.64.1
ここでは、注文ボタンと注文APIだけを持つ検証用アプリを server.mjs として用意し、設定を playwright.config.ts、テストを tests/order.spec.ts に保存します。検証用アプリは次のとおりで、注文APIの応答を200〜1,199msでばらつかせています。
import http from 'node:http';
const port = Number(process.env.PORT || 47311);
const orders = [];
const html = `<!doctype html><html lang="ja"><meta charset="utf-8"><title>shop</title>
<button id="b" class="btn btn-primary">注文を確定する</button>
<p id="msg"></p><a href="/history">注文履歴</a>
<script>
document.getElementById('b').onclick = async () => {
const r = await fetch('/api/orders', {method:'POST'});
document.getElementById('msg').textContent = r.ok ? 'ご注文を受け付けました' : 'エラー';
};
</script></html>`;
http.createServer((req, res) => {
if (req.url === '/api/orders' && req.method === 'POST') {
const delay = 200 + Math.floor(Math.random() * 1000); // 200〜1199ms
setTimeout(() => { orders.push(Date.now()); res.writeHead(201); res.end('{}'); }, delay);
return;
}
if (req.url === '/history') {
res.writeHead(200, {'content-type':'text/html; charset=utf-8'});
res.end(`<!doctype html><meta charset="utf-8"><ul>${orders.map((_, i) => `<li>注文${i + 1}</li>`).join('')}</ul>`);
return;
}
res.writeHead(200, {'content-type':'text/html; charset=utf-8'}); res.end(html);
}).listen(port, '127.0.0.1');
設定では、テスト前にアプリを起動する webServer と、ブラウザごとの projects を決めます。1.64で追加された default: false を付けたプロジェクトは、引数なしの npx playwright test では走らず、明示したときだけ走ります。開発中はChromiumだけで速く回し、CIで3エンジンを回す使い分けが設定1つで書けます。
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
testDir: './tests',
use: { baseURL: 'http://127.0.0.1:47311' },
webServer: { command: 'node server.mjs', url: 'http://127.0.0.1:47311' },
projects: [
{ name: 'chromium', use: devices['Desktop Chrome'] },
{ name: 'firefox', use: devices['Desktop Firefox'], default: false },
{ name: 'webkit', use: devices['Desktop Safari'], default: false },
],
});
注文フローのテスト作成と実行
テストは利用者に見える役割と文言で要素を指定し、結果は条件が満たされるまで待つアサーションで判定します。
import { test, expect } from '@playwright/test';
test('注文を確定できる', async ({ page }) => {
await page.goto('/');
await page.getByRole('button', { name: '注文を確定する' }).click();
await expect(page.getByText('ご注文を受け付けました')).toBeVisible();
});
npx playwright test # chromiumだけ
npx playwright test --project="*" # 3エンジンすべて
npx playwright test --trace on --reporter=html # 操作ごとのトレースを保存
npx playwright show-report
上の設定とテストで --project="*" を付けると、chromium・firefox・webkitの3件がヘッドレスで成功しました(Node.js 26.5.0、Intel Mac)。トレースからは操作ごとのDOMとネットワークを追えます。CIでは全件ではなく失敗したテストだけを残す --trace retain-on-failure(設定なら trace: 'retain-on-failure')にしておくと、負荷を抑えつつ調査が速くなります。Playwright自体の仕組みはPlaywright(プレイライト)とは?仕組み・できること・Seleniumとの違いを解説、版の確認と更新はPlaywrightの最新バージョンは1.63|確認・更新方法とリリース履歴【2026年9月】で扱っています。
E2Eテストツールの選び分け(Playwright・Cypress・Selenium)
主要3ツールの版・ライセンス・動作要件
2026年11月3日にnpmレジストリで確認した各ツールの版と宣言上の要件は次のとおりです。
| ツール | 版(公開日) | ライセンス | Node.js要件 | 実行モデル |
|---|---|---|---|---|
| Playwright | 1.64.1(10月14日) | Apache-2.0 | 20以上 | ブラウザ外から制御 |
| Cypress | 16.2.1(10月28日) | MIT | 22・24・26以上 | ブラウザ内で実行 |
| Selenium WebDriver | 4.52.0(10月29日) | Apache-2.0 | 22.23.4・24.22.1・26.12.1以上 | WebDriver経由 |
Playwrightはブラウザの外からプロトコルで制御するため、複数タブ・複数オリジンを1本のシナリオで扱え、TypeScript・Python・Java・.NETで書けます。制約が無い新規案件では第一候補です。
Cypressはテストをブラウザ内で動かし、開発中のデバッグ体験に優れます。オリジンをまたぐ操作は cy.origin() で書けますが、公式リファレンスはコールバック内で cy.intercept()・cy.session() を呼ぶとエラーになること、外側の変数は参照できず args で渡す必要があることを明記しています。外部の認証基盤をまたぐ動線が多いなら、この制約を選定時に織り込んでください。Cypress 16系はNode.js 20を外しているため、CIのNode版も確認が要ります。書き方はCypress E2Eテストの使い方|インストールからcy.intercept・CI実行まで【Cypress 16対応】で扱っています。
SeleniumはW3C標準のWebDriverと対応言語の広さが資産で、JavaやC#の既存テスト基盤がある組織では引き続き有力です。既存のCypress資産があるならCypress継続、言語やレガシー環境の制約があるならSelenium、と考えれば迷いません。Seleniumの書き方はSeleniumとは?使い方をPythonで解説|4.51対応・ChromeDriverの手動設定が要らない書き方を参照してください。
ブラウザを使わず標準テストランナーで書くE2E
守りたいのがAPIとデータベースの状態遷移で、画面操作が本質でないなら、言語の標準テストランナーからHTTPを投げるだけでE2Eは成立します。Goなら標準ライブラリだけで go test のテストとして書けます。次の order_test.go は、接続先を環境変数 BASE_URL で受け取り、注文APIが201を返すかを確かめます。
package e2e
import (
"net/http"
"os"
"strings"
"testing"
)
func TestOrderFlow(t *testing.T) {
baseURL := os.Getenv("BASE_URL") // 例: http://127.0.0.1:47311
body := strings.NewReader(`{"item":"A-001","qty":1}`)
res, err := http.Post(baseURL+"/api/orders", "application/json", body)
if err != nil {
t.Fatal(err)
}
defer res.Body.Close()
if res.StatusCode != http.StatusCreated {
t.Fatalf("want 201, got %d", res.StatusCode)
}
}
前述の検証用アプリを起動した状態で BASE_URL=http://127.0.0.1:47311 go test -v を実行すると、Go 1.27.2で PASS になりました。ブラウザを起動しないので速く、レンダリング待ちによるフレークも起きません。実装担当者が普段のテストと同じ書き方でE2Eを持てる点も利点です。その代わり、画面のバリデーションやフロントエンドの状態は一切検証できません。決済の状態遷移は標準テストランナー、入力フォームの見え方はブラウザ自動化ツール、と守る対象で分けるのが無駄のない構成です。
クラウド実行基盤・商用ツールに費用を払う条件
BrowserStackやSauce Labsのようなクラウド実行基盤、MagicPodやmablのようなノーコード・AI補助の商用ツールに払う価値が出るのは、次のいずれかに当てはまるときです。
- 検証するブラウザ・OS・実機の組み合わせが多く、自前で端末を維持するより安い
- 並列度を上げたいが、CI基盤を増強する人手がない
- テストを書くのが非エンジニアで、記録・再生型の作成が要る
課金は並列枠か実行時間が単位の体系が中心で、価格は改定されるため比較時は各社の公式料金ページで確認してください。国産ツールの料金体系の例はMagicPodとは?料金・できること・使い方とAI自動修復の注意点【2026年9月時点】にあります。対象がChromiumのみ、本数が数十件、書き手が全員エンジニアなら、まずOSSとGitHub Actionsで始める候補になります。そのうえで、CIの実行時間と同時実行数の上限に収まるかを確かめてください。
公式ドキュメントに学ぶエンドツーエンドテストのベストプラクティス
役割ベースとテスト専用属性によるセレクタ指定
Playwright公式のベストプラクティスは、XPathやCSSセレクタより利用者に見える属性を優先するよう求め、page.locator('button.buttonIcon.episode-actions-later') のようなクラス依存の指定を壊れやすい例に挙げています。推奨は page.getByRole('button', { name: 'submit' }) のように役割と表示名で特定する書き方です。
Cypress公式は別の道筋で同じ問題に対処し、id・class・タグ名を避けて data-cy 属性を付ける方式を「あらゆる変更から切り離される」最良の選択としています。どちらも、見た目のリファクタリングがテストの失敗に化けない状態を作るのが狙いです。セレクタを画面ごとのクラスに閉じ込める設計はPage Object Model(POM)とは?Playwright・Seleniumの実装例と保守コストの実測で扱っています。
固定待機とweb-first assertionの比較:500ms待機は20回中13回失敗
Cypress公式は cy.wait(Number) による任意の秒数待機をアンチパターンとし、eslint-plugin-cypress の cypress/no-unnecessary-waiting ルールで実行前に検出できると案内しています。Playwrightでは toBeVisible() などのweb-first assertionが、条件が満たされるまで自動で待ちます。
差を数字で示すため、注文APIの応答を200〜1,199msでばらつかせた検証用アプリに、2種類のテストをPlaywright 1.64.1で各20回(--repeat-each=20、4ワーカー)実行しました。
// NG: 500ms待てば終わっているはず、という前提で判定する
await page.waitForTimeout(500);
expect(await page.getByText('ご注文を受け付けました').isVisible()).toBe(true);
// OK: 表示されるまで待ってから判定する
await expect(page.getByText('ご注文を受け付けました')).toBeVisible();
この20回では固定待機が13回失敗し、web-first assertionは20回すべて成功しました。応答時間を乱数で決めているため、固定待機の失敗回数は実行するたびに変わります。固定待機を延ばせば失敗は減りますが、速い環境では毎回その秒数を無駄にし、遅いCIではなお足りません。フレークの調査では、まず waitForTimeout と cy.wait(数値) を検索するのが早道です。
shuffleオプションによるテストの順序依存の検出
両公式とも、テストを互いに依存させないことを求めています。Cypress公式は後片付けを after・afterEach に置くことも避けるよう書いています。テストが途中で止まると後片付けが走らないため、状態の初期化はテストの前(beforeEach)で行うのが筋です。
Playwright 1.64で追加された --shuffle は、実行順を乱数で入れ替えて隠れた依存を見つけるオプションです。ただし公式のCLIリファレンスのとおり、入れ替わるのはファイルの順番と、並列モードのテストだけです。「注文を1件作る」テストと「注文履歴に1件表示される」テストを同じファイルに置き、前者に依存させた状態で確かめると、差ははっきり出ました。
| 実行コマンド(1ワーカー) | シード1〜6の結果 |
|---|---|
--shuffle のみ |
6回とも成功(順序が変わらない) |
--fully-parallel --shuffle |
3回失敗(シード1・2・4) |
同じファイル内の依存まで洗い出すには、fullyParallel を有効にした状態で回す必要があります。失敗したら表示されたシードを --shuffle 2 のように渡せば同じ順序を再現できます。共有の設定画面のように同時に触れられない資源は、1.63で入った lock オプション(test('…', { lock: 'user-settings' }, …))で、その組だけ直列にできます。
制御できない外部サービスの代替と接続確認の分離
Playwright公式は「自分が制御するものだけをテストする」とし、外部サイトやサードパーティのサーバーへのリンクを検証しないよう求めています。Cypress公式も、自分が制御しないサイトの訪問を避け、サードパーティのAPIは cy.request() で扱うよう書いています。決済代行のテスト環境が落ちただけで自社のCIが赤くなる構成は、テストへの信頼を自ら下げます。外部との接続そのものは、システム統合テストや契約テストで別に確かめるのが筋です。
フレークテストとCI実行時間を抑える運用
フレークの切り分け順序とリトライの使い方
フレークを放置すると、チームはテスト結果を信用しなくなります。切り分けは、固定待機と非同期の同期漏れ→テスト間のデータ共有→アニメーションや描画完了前の操作→CIマシンの性能差やネットワーク遅延、の順で見ます。前の3つはテストコードで直せる問題です。
リトライは切り分け中の暫定策として使います。Playwrightの retryStrategy(1.62〜)は既定の 'immediate' に加え、'isolated' を指定すると、TestConfigのリファレンスどおり失敗したテストを全テストの終了後に単一ワーカーで1件ずつ再実行します。「並列だと落ち、単独なら通る」なら、他テストとの干渉か、並列実行時の負荷による遅延が疑わしいと分かります。リトライ回数を増やして緑にするだけの運用は検出力を落とすので、原因の記録と期限をセットにしてください。
シャーディングとプルリクエスト時の実行範囲
本数が増えたら、実行を分割してCIの複数ジョブに並べます。Playwrightは --shard を「何番目/全体数」の形で受け取るので、4分割なら次の4行を別々のCIジョブで1行ずつ実行します。
npx playwright test --shard=1/4
npx playwright test --shard=2/4
npx playwright test --shard=3/4
npx playwright test --shard=4/4
もう1つ効くのが、全件をプルリクエストごとに回さない判断です。主要動線の数本だけをプルリクエスト時に走らせ、全件はマージ後か夜間に回せば、開発の待ち時間を増やさずにリグレッションテスト(回帰テスト)とは?目的・範囲選定・自動化と実施判断を解説の役割を保てます。ワークフローの書き方と失敗時の直し方はGitHub Actionsでビルド・自動テストを設定する方法|build.ymlの書き方と失敗の直し方を参照してください。
E2Eテストを内製するか外注するかの判断基準
内製が成立する条件と外注が合理的な条件
外注で失敗する典型は、テストの作成だけを切り出して発注し、保守の担い手を決めないまま納品を受けるパターンです。E2Eは仕様変更のたびに直す資産なので、見積もりでは作成費に加えて、改修1回あたりの修正時間に運用期間を掛けた維持費を並べて比べます。内製が成立するのは、テストコードを読み書きできる開発者が常にいて、機能追加のプルリクエストと同じ流れでテストも直せる体制があるときです。判断材料は、直近の改修で壊れたテストの本数と修正にかかった時間です。それが機能改修のプルリクエストの作業時間に収まっていれば、内製で回ります。
外注が合理的なのは、対象ブラウザや端末の組み合わせが多く検証工数が一時的に跳ね上がるとき、リリース前の受け入れ確認だけを回したいとき、社内にテスト設計の経験者がいない立ち上げ期です。立ち上げ期に頼む場合も、テストコードを自社リポジトリに置いて改変できる権利を契約で確保し、CIの実行環境と手順書まで引き継がないと、次の改修で外注先に頼り続けるか作り直すかの二択になりがちです。CIへの組み込みまで含めて立ち上げたい場合は、DevOps・CI/CD導入支援のように、パイプライン構築とセットで依頼する形もあります。
外注時に取り決める成果物と引き継ぎ範囲
発注前に合意するのは、本数ではなく引き継げるかどうかに関わる項目です。使用ツールと版、テストコードのリポジトリの所有者(著作権と二次利用の範囲)、セレクタの規約、テストデータの準備方法、CIでの実行手順書、検収後の瑕疵対応期間とフレーク発生時の対応範囲を書面にします。
なかでもセレクタの規約は、実装側のHTMLに data-* 属性を足す作業が伴うため、テスト側だけでは決められません。ここが曖昧だと、役割と表示名で特定できない要素はCSSクラスに頼るしかなくなり、デザイン修正のたびにその部分のテストが壊れます。「テスト専用属性の付与は自社の実装タスク」と発注時に決めておくのが、外注の成否を分ける一手です。
よくある質問
E2Eとは何の略で、どういう意味ですか?
End-to-Endの略で、「端から端まで」を意味します。テストの文脈では、利用者の操作の入口から業務の完了までを、システムを分解せずに通しで確かめることを指します。JSTQBのテストレベルでは、主にシステムテストの段階で行うテストの形です。
E2Eテストと結合テスト(統合テスト)は何が違いますか?
検証の焦点と範囲が違います。結合テストはモジュール間やAPI間のインターフェースを確かめ、目的に応じて実物かモックを使います。E2Eテストは利用者の操作の入口から業務の完了までを通しで流し、つながった状態で業務が終わるかを確かめます。
E2Eテストはどのツールから始めるのがよいですか?
制約が無ければPlaywright(2026年11月3日時点で1.64.1、Apache-2.0)が第一候補です。Cypressの資産があるなら継続、JavaやC#の既存基盤に載せるならSelenium WebDriverが現実的です。
E2Eテストはすべて自動化すべきですか?
すべきではありません。自動化するのは繰り返す価値があり、期待結果を機械的に判定できる主要動線だけです。デザインが頻繁に変わる画面や、人の目で判断する表示の確認は、自動化の作成・修正時間と手動確認の時間を比べて決めます。
E2Eテストが不安定で失敗し続ける場合はどうすればよいですか?
固定待機の排除、テスト間のデータ共有の解消、セレクタの役割ベースかテスト専用属性への置き換え、の順に直してください。順序依存が疑わしいときは、Playwrightなら --fully-parallel --shuffle で実行順を乱して確かめられます。リトライは原因を調べる時間を稼ぐ暫定策にとどめます。