Tester Armyの「e2e」とは
自然言語で書くE2Eテストと録画リプレイ、Playwrightとの違い・使い方
Tester Army の e2e を解説。自然言語で目標を書くとAIが操作し、録画リプレイでモデル費用を抑えるOSSのE2Eフレームワークです。npx e2e init の最短手順、CI、モバイル、Playwright・Cypress・Maestroとの比較、注意点まで。【2026年10月】
Tester Army の e2e(github.com/tester-army/e2e)は、Webとモバイルアプリ向けのオープンソースのE2Eテストフレームワークです。「アップグレードを完了する」のように自然言語で目標を書くと、AIエージェントが実際の画面を操作し、結果は従来どおりのロケーターとアサーションで検証します。ライセンスは Apache-2.0。開発は1.0に向けて進行中(pre-1.0)で、2026年10月第2週の GitHub Trending 週間ランキングで約6,400スターを集め、累計は約9,000スターです。
なお「e2e」は一般名詞でもあるため、本記事では「Tester Army の e2e」と表記します。
Tester Army の e2e で何ができるか
- 自然言語のステップ: agent.act('…') で目標を書くと、エージェントが画面を見て操作する。agent.assert / agent.waitFor / agent.extract で画面の状態を判定・抽出もできる
- 通常のテストと同居: screen.getByRole(...) などのロケーターと expect を同じテストに書ける。エージェントのステップが1つもないテストは、モデルを一切使わない
- 録画リプレイ: 後続のチェックで検証できた agent.act の操作が記録され、次回以降はモデル呼び出しなしで再生される。画面が変わった時だけエージェントに戻る
- Web: エンジンは Playwright(Chromium / Firefox / WebKit)
- モバイル: iOSシミュレーター・Androidエミュレーターを agent-device 経由で操作
- モデルは持ち込み: サブスクリプション、APIキー、ローカルモデルのいずれか。Claudeのサブスクリプションは非対応で、Claude を使う場合はAPIプロバイダ経由
- 追加パッケージ: GitHub PRコメントのレポーター(@e2e-dev/github)、ホスト型ブラウザ(Kernel など)、ホスト型シミュレーター(EAS Simulators)
エージェントと録画リプレイの流れ
e2e の特徴は、AIを「毎回動かす」のではなく「最初の1回に使い、結果を録画する」設計にあることです。流れを図にまとめました。

インストール
アプリのディレクトリで次を実行します。ウィザードがエンジン(Web か モバイル)とモデル(サブスクリプション・プロバイダ・なし)を聞き、設定ファイルとサンプルテストを作り、依存関係を追加します。既存のファイルは上書きしません。
npx e2e init # npm
pnpm dlx e2e init # pnpm
bunx e2e init # bun公式ドキュメントの要件は Node.js 24.8 以上(Node.js 22 なら 22.22.3 以上)で、Windows では WSL 上で実行します。
最短手順 — 最初のテストを動かす
init は e2e.config.ts と tests/example.e2e.ts を生成します。設定ファイルは次のような形です(公式クイックスタートのWeb例)。
// e2e.config.ts
import type { E2EConfig } from 'e2e';
import { web } from '@e2e-dev/web';
import { gateway } from 'ai';
export default {
agents: { default: { model: gateway('openai/gpt-6-luna-fast') } },
targets: [{ engine: web(), app: { url: 'http://localhost:3000' } }],
} satisfies E2EConfig;生成されるサンプルテストはモデルを呼ばないため、APIキーなしで動きます。開発サーバーを http://localhost:3000 で起動して実行してください。エージェントを使うテストは、READMEにある次の形で書きます。
// tests/checkout.e2e.ts
import { test, expect } from 'e2e';
test('a member upgrades to Pro', async ({ app, agent, screen }) => {
await app.open('/settings/billing');
await agent.act('upgrade the workspace to the Pro plan');
await agent.assert('the invoice preview shows a prorated amount');
await expect(screen.getByRole('status')).toContainText('Pro');
});npx e2e run # 全テスト
npx e2e run tests/agent.e2e.ts # 1ファイルだけ
npx e2e run --headed # ブラウザを表示して実行
npx e2e run --no-cache # 録画を使わずエージェントに実行させる
npx e2e run --shard 2/3 --reporter list,junit # CI向けエージェントのステップを使うには、設定ファイルでモデルを指定する必要があります(既定値はありません)。ゲートウェイ(Vercel AI Gateway、OpenRouter)、プロバイダのAPIキー、ローカルやセルフホストのサーバーから選べ、ツール呼び出しと画像入力に対応したモデルが推奨されています。サブスクリプションを使う場合は npx e2e login <provider> でサインインします(openai、github-copilot など)。
CI と GitHub Actions
CIはNodeが動けばどのサービスでも使えます。公式のGitHub Actionsの例は、PRとmainへのpushで実行し、Chromiumをインストールして npx e2e run を list と junit レポーターで走らせ、失敗時もレポートと成果物をアップロードする構成です。モデルのキー(例: AI_GATEWAY_API_KEY)はリポジトリのシークレットから渡します。@e2e-dev/github を使うと、実行結果を1つのPRコメントに投稿し、再実行時は更新します。フォークからのPRはトークンが読み取り専用のため、コメントは投稿されません。
モバイルはiOSが macOS ランナー(xcodebuildでビルドしてシミュレーターで実行)、Androidが Ubuntu ランナー(KVMを有効にしてエミュレーターで実行)の2ジョブ構成の例が用意されています。
録画リプレイとコスト — なぜモデル費用が膨らみにくいか
AIにテストさせる際の最大の懸念は、実行のたびにトークンを消費することです。e2e は、後続のチェックで検証できた agent.act の操作を .e2e/cache/ にJSONで記録し、次回はその操作を再生します。再生したステップはモデル呼び出しがなく、トークン費用はゼロです。公式ドキュメントの例では、初回が3回のモデル呼び出し、2回目はゼロでした。
- 再生されるのは検証済みの agent.act だけ。agent.assert / agent.waitFor / agent.extract は、内蔵エージェントでは毎回モデルを呼ぶ
- キャッシュが外れる条件: テスト名・ターゲット名・指示文・パラメーター・エージェント設定・アプリの識別子の変更。実行ごとに変わる値(タイムスタンプ、毎回違うメールアドレス)は unique() で包まないと外れる。モデルを変えても外れない
- 再生に失敗したらエージェントが引き継ぎ、検証に失敗した記録は削除される
- 記録の扱い: e2e init は .e2e/cache/ を .gitignore に追加する。共有するならコミットできるが、入力した値はそのまま保存されるのでレビューが必要。秘密情報はキー名のみ保存される
- CIでは --strict-cache: 記録が古くなるとエージェントが静かに引き継いで毎回課金されるため、古いステップを REPLAY_STALE で失敗させる設定が公式に推奨されている
モバイル対応
モバイルエンジン(@e2e-dev/mobile)はiOSシミュレーターとAndroidエミュレーターを操作します。必要なのは、iOSならXcodeとシミュレーターのランタイム、AndroidならAndroid SDKとエミュレーターです。npx agent-device doctor で環境を確認できます。1ターゲットにつきプラットフォームを1つ指定し、ビルド成果物(.app または .apk)のパスを渡します。
// e2e.config.ts(モバイル)
import type { E2EConfig } from 'e2e';
import { mobile } from '@e2e-dev/mobile';
export default {
targets: [
{
name: 'ios',
engine: mobile({ platform: 'ios' }),
app: { bundleId: 'com.example.app', appPath: './build/MyApp.app' },
},
{
name: 'android',
engine: mobile({ platform: 'android' }),
app: { bundleId: 'com.example.app', appPath: './build/app-debug.apk' },
},
],
workers: 1,
} satisfies E2EConfig;公式のサンプルプロジェクトには Vite、Next.js、Astro、Expo、SwiftUI、Jetpack Compose、Kotlin Multiplatform、Flutter があります。モバイルアプリの品質保証全体の考え方はモバイルアプリのテストと品質保証を参照してください。実機はシミュレーター専用の操作(外観やネットワークの切り替えなど)が使えない点に注意が必要です。
既存ツールとの違い — Playwright・Cypress・Maestro・Stagehand・Browser Use
e2e はPlaywrightの置き換えというより、「壊れやすい操作の記述だけをエージェントに任せられるPlaywright系のランナー」という位置づけです。主なツールとの違いを表にまとめました。Playwright と e2e の欄は公式ドキュメントに基づきます。Cypress・Maestro・Stagehand・Browser Use は一般的な特徴の整理で、導入前に各公式情報で最新の機能を確認してください。
| ツール | 記述方法 | AI/LLM依存 | モバイル | コスト | 安定性・フレーク対策 | 向く用途 |
|---|---|---|---|---|---|---|
| Tester Army の e2e | TypeScript。自然言語のステップ+ロケーター | 任意(agentステップのみ。使わなければモデル不要) | iOS/Androidのシミュレーター・エミュレーター | OSS(Apache-2.0)。モデル費用は初回と再記録時のみ | 検証済みの操作を録画・再生。UI変更時はagentが引き継ぐ | UI変更が多いフローをWeb・モバイル共通の仕組みで回す |
| Playwright Test | TypeScriptなどのコード。ロケーター中心 | なし | 主にWeb(モバイルはエミュレーション中心) | OSS・モデル費用なし | 自動待機・トレース。UI変更時は手で修正 | 安定した画面の高速・厳密な回帰テスト |
| Cypress | JavaScript/TypeScript。コマンドチェーン | なし | なし(Webのみ) | OSS+有料クラウド | 自動リトライ。UI変更時は手で修正 | フロントエンド開発中のブラウザテスト |
| Maestro | YAMLのフロー | 基本なし | iOS/Android中心 | OSS+有料クラウド | 画面要素ベースで比較的安定 | モバイルの簡易なUIフロー |
| Stagehand / Browser Use | コード(act などのAI操作を呼ぶ) | 前提(毎回LLMがブラウザを操作) | 主にWeb | OSS+モデル費用(実行ごと) | LLMの判断に依存。キャッシュ機能を持つものもある | ブラウザ自動化・スクレイピング・探索的な操作 |
Playwrightから移行すべきか、併用か
結論として、全面移行より併用が現実的です。公式の移行ガイドも、同じプロジェクト内でPlaywrightと並走させ、1ファイルずつ移す方法を勧めています。@e2e-dev/web は固有の playwright-core を持つため、既存の @playwright/test のバージョンは変わらず、e2e は既定で tests/**/*.e2e.ts だけを拾います。
- 移すのは「頻繁に壊れるフロー」から: ウィザードやチェックアウトなど、UI変更でセレクターが壊れやすいもの。安定したテストはPlaywrightのままでよい
- 挙動の違い: 文字列の名前は完全一致・大文字小文字を区別、複数ヒットは LOCATOR_AMBIGUOUS エラー、テストのタイムアウト既定は120秒(Playwrightは30秒)
- 未対応の設定: globalSetup、fullyParallel、devices など一部の設定は現時点で欠けている
- 決定的にも書ける: page.getBy* を screen.getBy* に置き換えれば、エージェントなしの完全に決定的なテストにもできる
MCPサーバーのテストや評価を扱う考え方はMCPJam Inspectorの解説も参考になります。AIエージェント系の開発ツールを一覧で整理したClaude Code Templatesの記事とあわせて読むと、位置づけがつかみやすくなります。
導入時の注意
- pre-1.0: READMEに「APIと設定はマイナーリリース間で変わりうる」とある。バージョンを固定し、重要度の高いテストはPlaywrightを残す
- テレメトリー: 匿名の利用データ(実行したコマンド、エンジン、失敗箇所)が送信される。テスト内容・アプリ内容・認証情報は送られない。npx e2e telemetry disable または環境変数 E2E_TELEMETRY_DISABLED=1 で無効化できる
- LLMの非決定性: 初回の操作はモデルの判断に依存する。録画後は再現性が上がるが、assert などは毎回モデルが判定するため、判定が揺れる可能性は残る
- プロンプトの秘密情報: ランナーは登録済みのシークレットをモデルへの入力から伏せる。ただし、指示文やパラメーターに直接書いた値は録画に「入力したまま」保存される。本番の認証情報は書かない
- キャッシュのコミット: 共有する場合は変更された録画をPRでレビューする。CIでは --strict-cache で費用の静かな増加を防ぐ
- 再生範囲: 検証のないステップは録画されない。agent.act の後に必ずチェックを置く
よくある質問
Tester Army の e2e は無料で使えますか?
ライセンスはApache-2.0のオープンソースで、フレームワーク自体は無料です。エージェントのステップを使う場合は、持ち込むモデルのAPI費用やサブスクリプションが別途かかります。ホスト型ブラウザやシミュレーターの追加パッケージの料金は、調べた範囲では公開されていませんでした。
モデルを使わずに動かせますか?
動かせます。ロケーターとアサーションだけのテストはモデルを一切使いません。npx e2e init で「None」を選ぶこともでき、サンプルテストはAPIキーなしで実行できます。
ローカルモデルで使えますか?
ローカルやセルフホストのサーバーを設定できます。ただし公式はツール呼び出しと画像入力に対応したモデルを推奨しているため、小型モデルでは操作の精度が下がる可能性があります。
Claudeは使えますか?
Claudeのサブスクリプションは非対応と記載されています。Claude を使う場合はAPIプロバイダ経由で設定します。
画面が変わるとテストは壊れますか?
録画した操作が合わなくなると、エージェントが現在の画面から引き継いで目標を達成しようとし、成功すれば記録し直します。ただしCIの既定では静かに引き継ぐため、費用が増えます。--strict-cache なら古いステップを失敗として検出できます。
既存のPlaywrightテストはそのまま使えますか?
e2e のテストは別の @e2e-dev/web のAPIで書くため、既存のPlaywrightテストは自動変換されません。同じプロジェクト内で並走できるので、1ファイルずつ書き直す方法が公式に案内されています。
まとめ
Tester Army の e2e は、「AIに毎回テストさせる」のではなく「AIが最初の1回だけ操作し、録画して再生する」ことで、自然言語の書きやすさと、通常のテストに近い速度・費用を両立しようとするフレームワークです。Web(Playwright)とモバイル(シミュレーター・エミュレーター)を同じ書き方で扱え、モデルは自分で選べます。一方でpre-1.0でAPIが変わりうること、テレメトリーが既定で有効なこと、アサーションは毎回モデルを呼ぶことは押さえておく必要があります。まずはUI変更で壊れやすい1フローだけを npx e2e init で試し、Playwrightと並走させて録画リプレイの効果を測るのが現実的な入り方です。
この記事に関連する無料ツール(登録不要・その場で結果)
お気軽にご相談ください
お問い合わせ