e2e 实测:让 AI agent 写测试步骤、断言做裁判——Playwright 之上的 agentic 测试框架
e2e 实测:让 AI agent 写测试步骤、断言做裁判——Playwright 之上的 agentic 测试框架
端到端测试写了这么多年,模式一直没变:测试代码里写选择器,告诉浏览器点哪填什么。tester-army 开源的 e2e(约 1 万星,Apache-2.0)想改的是这件事——用自然语言描述目标,让 AI agent 决定怎么操作 app,再用断言检查结果。
它还有个更工程化的设计:agent 步骤一旦被后续断言验证过,动作会被记录下来,下次运行直接重放,不再调模型;不含 agent 步骤的测试完全不需要模型。我在本机把一个最小项目完整跑通了(3 条测试 6 条断言全过),这篇是实测记录。
一、它解决什么问题
e2e 的定位是"next generation e2e framework":你写 agent.act('自然语言') 描述要做什么,模型决定点哪;写 expect(...).toBeVisible() 这类断言做裁判。混合测试(agent 步骤 + 确定性断言配对)是它主推的范式。
关键是成本控制:agent 步骤的"学费"只付一次——通过断言验证的动作会被固化成确定性步骤重放;纯断言测试零模型成本。模型可自带订阅/API key/本地模型。
二、和 Playwright 是什么关系
先说结论:不是替代品,是叠加上层。
- web 引擎
@e2e-dev/web底层就是 Playwright(Chromium/Firefox/WebKit),断言 API 形状(getByRole/getByLabel/toHaveText/toBeVisible)和 Playwright 高度一致——会 Playwright 就会 e2e; - 差异只在"谁操作 app":Playwright 全部由测试代码写选择器;e2e 允许 agent 用自然语言驱动,并把动作录成可重放步骤。
所以它是个 runner + agentic 层,不是又一个浏览器驱动。
三、我的实测:3 条测试 6 条断言,15.94 秒全过
被测对象是一个本地 3 行静态页(h1"Say hello" + Name 输入框 + Greet 按钮 + 错误/问候两个 role 区域),由 11 行 node 静态服务器伺服。
e2e.config.ts(真实内容):
import type { E2EConfig } from 'e2e';
import { web } from '@e2e-dev/web';
export default {
targets: [
{
engine: web(),
app: {
url: 'http://localhost:5399',
command: { executable: 'node', args: ['server.js'], reuseExisting: true },
},
},
],
} satisfies E2EConfig;
tests/minimal.e2e.ts(真实内容,注意:纯确定性测试不需要配 agents/model/API key):
import { test } from '@e2e-dev/web';
import { expect } from 'e2e';
test('shows the greeting form', async ({ app, screen }) => {
await app.open('/');
await expect(screen.getByRole('heading', 'Say hello')).toBeVisible();
await expect(screen.getByLabel('Name')).toBeVisible();
});
test('asks for a name when the field is empty', async ({ app, screen }) => {
await app.open('/');
await screen.getByRole('button', 'Greet').click();
await expect(screen.getByRole('alert')).toHaveText('Enter a name first.');
});
test('greets the name you type', async ({ app, screen }) => {
await app.open('/');
await screen.getByLabel('Name').fill('Ada');
await screen.getByRole('button', 'Greet').click();
await expect(screen.getByRole('status')).toHaveText('Hello, Ada!');
});
运行(Windows 下注意,见坑 5):
node node_modules/e2e/dist/cli/bin.js run
真实输出:
RUN e2e v0.16.0
✓ target "web" command ready 504ms
✓ web tests/minimal.e2e.ts (3 tests) 3.44s
✓ shows the greeting form 1.34s
✓ asks for a name when the field is empty 1.06s
✓ greets the name you type 1.04s
Test Files 1 passed (1)
Tests 3 passed (3)
Duration 15.94s (startup 504ms)
runner 自动拉起被测服务并等 URL 可达("command ready 504ms"),总耗时 15.94 秒。
四、架构与包矩阵
npm 发包是一个矩阵:e2e(SDK+runner+CLI)、@e2e-dev/web(浏览器引擎)、@e2e-dev/mobile(iOS/Android 模拟器)、@e2e-dev/github(PR 评论 reporter)、@e2e-dev/smol(托管浏览器/microVM)、@e2e-dev/decision(语义决策执行器)等。
两个贴心细节:docs 随包分发(node_modules/e2e/docs 30+ 页,coding agent 可离线读);telemetry 默认开但可关(npx e2e telemetry disable 或 E2E_TELEMETRY_DISABLED=1)。
五、六个坑(全部实测)
- peer 版本错配会直接崩:
e2e@0.15.2+@e2e-dev/web@0.11.2跑起来报CONFIG_LOAD_FAILED: does not provide an export named 'rejectUnknownOptions'——web 包按 e2e 0.16 的导出构建,peer 范围却写 >=0.15.0。对策:核心包和引擎包一起升到匹配小版本(e2e@^0.16.0解决); - Windows 下 esbuild postinstall 被断:
npm install报 spawn 失败、整包回滚。对策:npm install --ignore-scripts(esbuild 二进制本身可运行,是安装脚本被拦截,不是二进制坏); - Playwright 浏览器 CDN 被墙:直连
cdn.playwright.dev下载进程被 SIGTERM。对策:PLAYWRIGHT_DOWNLOAD_HOST=https://cdn.npmmirror.com/binaries/playwright镜像源,33 秒下完; - reuseExisting: true 会"张冠李戴":5173 端口被机器上别的项目 vite 占用,runner 直接复用,3 个测试全挂(快照显示打开的是 Vite 欢迎页)。对策:独占端口(5399)后全绿——共享开发机上先用 netstat 确认端口;
- .bin/e2e 不能 node 执行:它是 sh 脚本,node 跑会 SyntaxError。用
node node_modules/e2e/dist/cli/bin.js run(Node 入口已验证); - 网络不稳:clone 前 4 次 502,第 5 次成功——GitHub/npm 访问保持重试。
六、适合谁,边界在哪
适合:熟悉 Playwright 断言 API、想给关键路径叠一层"自然语言 agent 步骤"的团队;CI PR 场景友好(reporter + 无 agent 步骤零成本)。
边界:纯确定性测试场景它相对 Playwright 只是多一层 runner;agent 步骤需要模型 key 或本地模型;未到 1.0——README 自述"APIs and config can still change between minor releases";交互式 npx e2e init、agent 测试实跑、移动引擎、reporter 本次未验证(无 key 环境)。
七、小结
e2e 的思路值得借鉴:把"操作 app"这件最脆的工作交给模型、把"验证结果"留给断言、把"重复成本"用录制重放消掉——三层各用其长。对 Playwright 熟手,迁移成本几乎为零(API 形状一致);对 agentic testing 观望的人,它的混合范式是个低风险入口。Apache-2.0,但记住:API 还没到 1.0。
参考与署名:本文实测项目为 tester-army/e2e(Apache License 2.0,实测版本 e2e@0.16.0 + @e2e-dev/web@0.11.2);文中配置与测试代码均为本次实跑自写;运行环境 Node.js 22.22.2 / Windows。
- 点赞
- 收藏
- 关注作者
评论(0)