まず結論:E2Eテストって、結局何?
E2Eテスト、つまりEnd-to-Endテスト。 これ、要は「ユーザーのフリして、システム全体がちゃんと動くか確認するテスト」ってことだね。 ログイン画面でIDとパスワード入れて、ボタン押したら、ちゃんとマイページに飛ぶか、みたいな一連の流れを試す感じ。
よくある単体テスト(ユニットテスト)とか結合テストが、部品や組み立てた部品がちゃんと動くか見るのに対して、E2Eテストは完成品がお店(本番環境)でちゃんと使えるか、お客さんの目線でチェックする最終リハーサルみたいなもの。 だから、フロントエンドからバックエンド、データベースまで全部つなげた状態でテストする。
よくある誤解と「いつ」E2Eテストをやるべきか
ここで大事なのが、「何でもかんでもE2Eテストすればいい」ってわけじゃないこと。これ、結構やりがち。E2Eテストはコストが高いし、実行に時間がかかる。 しかも、ちょっとしたことでテストが失敗したりして不安定になりやすい。
じゃあ、いつやるのか? それは「この機能が動かなきゃ、サービスの意味がない」っていう、クリティカルなユーザーシナリオに絞るべき。 例えば、ECサイトなら「商品をカートに入れて決済する」、これが一番大事な流れだよね。こういう、ビジネスの根幹に関わる部分だけをE2Eテストで保証するのが賢いやり方。細かいボタンの動作とかは、もっと下のレイヤーのテストで十分。
じゃあ、どうやって始める?導入の3ステップ
よし、じゃあ実際にどうやって始めるか。ざっくり3ステップで考えてみる。
- テストシナリオの洗い出し:まず、さっき言った「クリティカルなユーザーシナリオ」を特定する。 ユーザー登録、ログイン、主要機能の実行、決済フローあたりが鉄板かな。ここをチームでしっかり話し合って決めるのが超重要。
- テスト環境の準備:E2Eテストは本番に限りなく近い環境でやるのが理想。 データベースとか外部APIとか、本番と同じ構成を準備する。ここが結構大変なポイントでもある。 環境の違いがテスト結果に影響しちゃうからね。
- テストコードを書いて、実行する:シナリオが決まったら、自動化ツールを使ってコードを書く。最初は1つでもいいから、とにかく書いて、CI/CDパイプラインに組み込んで定期的に実行する癖をつけるのが大事。
Playwrightを使ったE2Eテストコードのサンプル" width="800" height="480" loading="lazy" decoding="async" style="max-width:95%;height:auto;cursor:pointer" class="no_autoresize">
ツール選びの判断基準 - Cypress vs Playwright だけじゃない
ツール選び、これがまた悩ましい。最近はCypressとPlaywrightが2強って感じだよね。 2025年時点のnpmのダウンロード数を見ると、PlaywrightがCypressを追い抜いて勢いがあるみたい。 でも、どっちが良いって単純な話じゃない。プロジェクトやチームの状況によって最適解は変わる。
海外のテックコミュニティだと、Playwrightのクロスブラウザ対応(Chrome, Firefox, WebKit全部OK)と実行速度が評価されてる感じがする。 一方で、日本の現場だと、Cypressの導入の手軽さや、GUIでのデバッグのしやすさが根強く支持されてる印象もあるかな。
結局、ツールリストを眺めるんじゃなくて、自分たちのチームにとって何が大事かを基準に選ぶべき。
| 判断基準 | 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みたいなツールを使ったりして、特に不安定なテストから優先的に修正していくのが効率的。
E2Eテストは、導入も運用も正直大変。でも、これを乗り越えると「自信を持ってリリースできる」という大きな安心感が手に入る。 小さく始めて、チームで育てていくのが成功の秘訣だと思うな。
