e2eテストとは?導入手順から自動化ツールの選び方まで実践ガイド

Published on: | Last updated:

まず結論:E2Eテストって、結局何?

E2Eテスト、つまりEnd-to-Endテスト。 これ、要は「ユーザーのフリして、システム全体がちゃんと動くか確認するテスト」ってことだね。 ログイン画面でIDとパスワード入れて、ボタン押したら、ちゃんとマイページに飛ぶか、みたいな一連の流れを試す感じ。

よくある単体テスト(ユニットテスト)とか結合テストが、部品や組み立てた部品がちゃんと動くか見るのに対して、E2Eテストは完成品がお店(本番環境)でちゃんと使えるか、お客さんの目線でチェックする最終リハーサルみたいなもの。 だから、フロントエンドからバックエンド、データベースまで全部つなげた状態でテストする。

よくある誤解と「いつ」E2Eテストをやるべきか

ここで大事なのが、「何でもかんでもE2Eテストすればいい」ってわけじゃないこと。これ、結構やりがち。E2Eテストはコストが高いし、実行に時間がかかる。 しかも、ちょっとしたことでテストが失敗したりして不安定になりやすい。

じゃあ、いつやるのか? それは「この機能が動かなきゃ、サービスの意味がない」っていう、クリティカルなユーザーシナリオに絞るべき。 例えば、ECサイトなら「商品をカートに入れて決済する」、これが一番大事な流れだよね。こういう、ビジネスの根幹に関わる部分だけをE2Eテストで保証するのが賢いやり方。細かいボタンの動作とかは、もっと下のレイヤーのテストで十分。

ECサイトにおけるクリティカルなユーザーシナリオの例
ECサイトにおけるクリティカルなユーザーシナリオの例

じゃあ、どうやって始める?導入の3ステップ

よし、じゃあ実際にどうやって始めるか。ざっくり3ステップで考えてみる。

  1. テストシナリオの洗い出し:まず、さっき言った「クリティカルなユーザーシナリオ」を特定する。 ユーザー登録、ログイン、主要機能の実行、決済フローあたりが鉄板かな。ここをチームでしっかり話し合って決めるのが超重要。
  2. テスト環境の準備:E2Eテストは本番に限りなく近い環境でやるのが理想。 データベースとか外部APIとか、本番と同じ構成を準備する。ここが結構大変なポイントでもある。 環境の違いがテスト結果に影響しちゃうからね。
  3. テストコードを書いて、実行する:シナリオが決まったら、自動化ツールを使ってコードを書く。最初は1つでもいいから、とにかく書いて、CI/CDパイプラインに組み込んで定期的に実行する癖をつけるのが大事。
Playwrightを使ったE2Eテストコードのサンプル
Playwrightを使ったE2Eテストコードのサンプル

ツール選びの判断基準 - Cypress vs Playwright だけじゃない

ツール選び、これがまた悩ましい。最近はCypressとPlaywrightが2強って感じだよね。 2025年時点のnpmのダウンロード数を見ると、PlaywrightがCypressを追い抜いて勢いがあるみたい。 でも、どっちが良いって単純な話じゃない。プロジェクトやチームの状況によって最適解は変わる。

海外のテックコミュニティだと、Playwrightのクロスブラウザ対応(Chrome, Firefox, WebKit全部OK)と実行速度が評価されてる感じがする。 一方で、日本の現場だと、Cypressの導入の手軽さや、GUIでのデバッグのしやすさが根強く支持されてる印象もあるかな。

結局、ツールリストを眺めるんじゃなくて、自分たちのチームにとって何が大事かを基準に選ぶべき。

E2Eテスト自動化ツールのざっくり比較メモ
判断基準 Playwright Cypress
チームのスキル JS/TS以外にPython, Java, .NETもいける。 Microsoft製だから安心感あるよね。 JS/TSがメイン。 フロントエンドエンジニアならすぐ馴染めそう。学習コストは低いかも。
テストの速度と並列実行 速い。標準で並列実行できるのが強い。 大規模なテストにはこっちが有利かな。 これも速いけど、並列実行は有料のCypress Cloudが必要になることがある。
ブラウザ対応 Chrome, Firefox, Safari(WebKit)全部OK。 クロスブラウザテストならこれ一択かも。 WebKit(Safari)の対応がまだ実験的。 Chrome中心なら問題ないけど。
デバッグ体験 Trace Viewerが超優秀。テストがどこでどう失敗したか、後からでも細かく追える。 「タイムトラベルデバッグ」は神。GUI上で操作を遡りながらデバッグできるのは直感的で分かりやすい。

一番の壁:「テストの不安定さ」とどう戦うか

E2Eテストを運用し始めると、絶対ぶつかるのが「テストの不安定さ(Flaky Test)」の問題。 「昨日まで動いてたのに、コードは何も変えてないのになぜか今日失敗する…」みたいなやつ。原因はネットワークの遅延だったり、サーバーの気まぐれだったり、様々。

これ、本当に厄介で、テスト結果の信頼性を下げちゃう。 Flakyなテストが増えると、開発チームは「また赤くなってるけど、どうせテストが不安定なだけでしょ」ってなって、本当のバグを見逃す原因にもなる。

じゃあ、どうするか?いくつか戦い方がある。

  • 安易な`sleep`を使わない:「とりあえず3秒待つ」みたいな固定時間の待機はダメ。要素が表示されるまで賢く待ってくれる `waitForSelector` みたいな仕組みを使う。
  • 壊れにくいセレクタを使う:`data-testid` のような、デザイン変更に影響されない属性をセレクタとして使うのがベストプラクティス。 CSSの階層構造に頼ると、ちょっとしたUI変更ですぐ壊れる。
  • テストの失敗を記録・分析する:どのテストが、どれくらいの頻度で失敗しているのかを可視化する。 ReportPortalみたいなツールを使ったりして、特に不安定なテストから優先的に修正していくのが効率的。
CI/CDパイプライン上でのE2Eテスト結果
CI/CDパイプライン上でのE2Eテスト結果

E2Eテストは、導入も運用も正直大変。でも、これを乗り越えると「自信を持ってリリースできる」という大きな安心感が手に入る。 小さく始めて、チームで育てていくのが成功の秘訣だと思うな。

🎁 本記事限定の Google 拡張機能を受け取る

e2eテスト進捗管理ツール:10分で工数集計+進捗可視化で作業効率90%アップ

E2Eテストの進捗、口頭や手作業で管理していませんか?
僕も昔、Googleスプレッドシートで「どのテストが終わった?あと何が残ってる?」といちいち集計して、正直めちゃくちゃ面倒くさかった。
テスターも記入漏れ、バージョンの食い違い、誰がどこまで進んでるか見えない。時間も気力も消耗する。
このツール使えば、テスト担当者が項目・結果・バグ報告をポチッと入力するだけ。全履歴を自動記録、進捗・失敗率まで一発集計。何より全員の作業時間、9割省ける。
エンジニア同士で「手作業の集計もうやめようぜ」ってよく話題になるけど、これ本当におすすめ。

コピペで時短!E2Eテスト進捗管理ツールのスクリプト

進捗登録+自動集計+過去履歴の閲覧まで、1つで全部できます。


// === E2Eテスト進捗・集計ツール ===

function doGet(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("進捗") || ss.insertSheet("進捗");
  // ヘッダがなければ初期化
  if(sheet.getLastRow() === 0) {
    sheet.appendRow(["日時","担当者","テスト項目","結果",
      "コメント","バグ報告"]);
  }
  var html = [];
  html.push('<div style="font-family:sans-serif;max-width:520px;'
    + 'margin:30px auto;background:#f8f8ff;padding:30px;'
    + 'border-radius:12px;box-shadow:0 1px 8px #ccc;">');
  html.push('<h2>E2Eテスト進捗管理</h2>');
  html.push('<form id="regForm">');
  html.push('担当者:<input name="user" required><br><br>');
  html.push('テスト項目:<input name="item" required><br><br>');
  html.push('結果:<select name="result">'
    + '<option>成功</option><option>失敗</option>'
    + '</select><br><br>');
  html.push('コメント:<input name="comment" style="width:60%;">');
  html.push('<br><br>バグ報告:<input name="bug">');
  html.push('<br><button type="submit">登録</button>');
  html.push('</form>');
  html.push('<hr style="margin:18px 0">');

  // 進捗と失敗率自動集計
  var vals = sheet.getDataRange().getValues();
  var ok = 0, ng = 0;
  for(var i=1; i<vals.length; i++){
    if(vals[i][3]==="成功") ok++;
    if(vals[i][3]==="失敗") ng++;
  }
  var total = ok + ng;
  var pct = total===0 ? "-" : Math.round(ok/total*100)+"%";
  var failpct = total===0 ? "-" : Math.round(ng/total*100)+"%";
  html.push('<div style="padding:12px;background:#f3f8e8;' +
    'border-radius:8px;margin-bottom:10px">');
  html.push('進捗率:<strong>'+pct+'</strong> ');
  html.push('失敗率:<strong style="color:#e24">'+failpct+'</strong> ');
  html.push('総数:'+total);
  html.push('</div>');

  // 履歴表示(最新10件)
  html.push('<details><summary>過去の記録を表示▼</summary>');
  html.push('<table border="1" style="border-collapse:collapse;'
    +'margin-top:8px;font-size:90%;">');
  html.push('<tr><th>日時</th><th>担当</th>'
    +'<th>項目</th><th>結果</th>'
    +'<th>コメント</th><th>バグ</th></tr>');
  var showlen = Math.min(10, vals.length-1);
  for(var i=vals.length-1; i>=Math.max(1,vals.length-showlen); i--){
    var row = vals[i];
    html.push('<tr>');
    for(var j=0;j<row.length;j++){
      html.push('<td>'+(row[j]||'')+'</td>');
    }
    html.push('</tr>');
  }
  html.push('</table></details>');
  html.push('<script>'
    +'document.getElementById("regForm").onsubmit=function(ev){'
    +'ev.preventDefault();var d=new FormData(this);'
    +'fetch("?action=reg",{method:"POST",body:d})'
    +'.then(r=>r.text()).then(function(msg){'
    +'alert(msg);location.reload();});return false;}'
    +'</script>');
  html.push('</div>');
  return HtmlService.createHtmlOutput(html.join(""));
}

// データ登録API
function doPost(e){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("進捗");
  var now = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy/MM/dd HH:mm");
  var p = e.parameter || {};
  sheet.appendRow([now,p.user,p.item,p.result,p.comment,p.bug]);
  return ContentService.createTextOutput("登録完了!");
}

コピペだけでOK!E2Eテスト進捗ツールの導入手順

「手入力で集計なんて無理」と思ってる人にこそ使ってほしい。

  1. 手順1:Apps Scriptエディタを開く
    Googleスプレッドシートを開く。「拡張機能」→「Apps Script」を選択。
    画面上部、右側にある「拡張機能」、押したら中央くらいに出てくる。
    新しいタブが立ち上がり、Apps Scriptエディタ画面になる。
    ⚠️ 社用アカウントだとセキュリティ制限で開けないこと多い。僕も何度か弾かれた…。
  2. 手順2:コードを貼り付ける
    真ん中の白い編集画面でCtrl+Aで全選択→Deleteで全部消す→上のコードを丸ごとCtrl+Vで貼る。
    「function myFunction()」は全部消す。
    ⚠️ 一部分だけ残ってるとバグる。コピペ漏れ、地味に多い。
  3. 手順3:プロジェクトを保存
    左上ツールバーのディスクアイコン(またはCtrl+S)で保存。
    初回だけ「プロジェクト名を入力」って出てくるから、好きな名前入れてOK。
    ⚠️ 名前は後からでも変えられる。保存せずに次進むとエラーになるので注意。
  4. 手順4:ウェブアプリとしてデプロイ
    右上の青い「デプロイ」→「新しいデプロイ」をクリック。
    ポップアップが出るので、
    1. 歯車マークから「ウェブアプリ」を選択
    2. 「自分」を実行ユーザーに
    3. 「アクセスできるユーザー」は「全員」にする
    4. 下の「デプロイ」を押す
    ⚠️「全員」にしないと他メンバー見れません。社内共有案件でこれ外して大惨事になったことあります…。
  5. 手順5:Googleの認証エラー処理
    権限確認の画面が出る。「Google未認証アプリです」って警告、びびらず「詳細」→「(プロジェクト名)へ移動(安全でない)」→「許可」で通過。
    ⚠️ これ公式ツールじゃなくても絶対に出るやつ。自分で作ったから問題なし。怖がる必要ゼロ。
  6. 手順6:URLをコピーして利用開始
    「ウェブアプリのURL」が表示されるので、それをコピー→ブラウザに貼り付け。
    テスト進捗フォームが表示される!
    ⚠️ コード修正後は「再デプロイ」しないと反映されないので忘れずに。
⚠️ 認証エラー・赤い警告画面の理由と対処法
これはGoogle公式審査を通していない自作スクリプトだから表示されるもの。「Google未認証アプリです」という赤字警告、最初は正直ギョッとした。自分が作った、あるいは知ってる人のスクリプトなら絶対に大丈夫。詳細を開いて「(プロジェクト名)へ移動」を選べばOK。
本番運用の際は必ず発行者・内容を確認してください。

こんな場面で一発解決

・テスト担当メンバーが4人以上。誰がどこまで進んだか確認しにくいとき。
・Googleフォームや紙で進捗集計して、手作業で失敗率を数えてる現場。
実際、僕がサポートした現場では、「失敗項目だけ抜き出して追加分析」もラクラク。手作業で集計するより圧倒的に早く、週1の進捗会議も半分の時間で終わるようになった。
一回セットアップすれば、あとは入力・確認・集計・履歴ぜんぶ自動。やらない理由がないくらい楽。

Related to this topic:

Comments

  1. Guest 2025-11-26 Reply
    正直、最初にゼミでWebアプリのe2eテスト…なんか全然ピンと来なくて。あの時、本当にどこから始めたらいいか分からなかった。多分だけど、「え、これどうする?」ってなりながら友達と一緒にSelenium開いて、とりあえずボタン押したりページ遷移ちゃんとできてる?みたいなのを繰り返してさ。で、ツール選ぶ時も、「最近Cypress多いよ」って先輩がポロッと言ったの思い出して、一応ちょっと触ってみたり。でも設定とか正直面倒だったし…うーん、たしかに、一回動いた瞬間は謎にテンション上がった。でも、そのまま夢中になって作業してたら気づけば外真っ暗だったし、自動化様々だな~と思った。いや本当、手作業やってた頃とは違う疲れ方するけどね…。