📌 项目地址:tester-army/e2e | ⭐ 2,786 颗星 | 🔧 TypeScript | 📜 未标注

先看代码

// 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');
});

这几行基本说清了 e2e 的思路。app.open 打开页面,agent.act 用一句自然语言让 agent 完成操作,agent.assert 做语义层面的验证,最后 screen.getByRole 加 expect 做精确断言。

写传统 E2E 测试最痛苦的部分是中间步骤。为了验证“升级 Pro 后发票显示按比例计费”,你得先写一长串点击:进设置、找计费页、选套餐、确认。这些步骤不是测试重点,却占了代码的大头,UI 一改全断。

e2e 把这层脏活交给 agent:你只说“把 workspace 升级到 Pro”,怎么点过去它自己想。但最终验证不用自然语言,还是靠 getByRole 这类定位器做确定性断言。agent 负责“到达”,定位器负责“验证”,边界分得很清楚。

最重要的设计:跑过一次就不再调模型

README 里这句话值得单独摘出来:

An agent step that a later assertion verifies records its actions, and the next run replays them with no model calls until the app changes.

被后续断言验证过的 agent 步骤会把操作录下来,下次运行直接回放,零模型调用。只有应用本身变了,agent 才重新出马。

这一点直接命中 LLM 测试框架跑 CI 时的两个问题。一是成本:每条用例都调模型,几千条跑下来账单吓人。二是稳定性:模型每次可能走不同路径,结果没法复现。录制回放把模型调用压缩到首次运行和应用变更之后,日常 CI 里跑的就是确定的回放脚本。

另一个细节:不含 agent 步骤的测试完全不需要模型。可以只在少数难写的流程里用 agent,其余当普通测试框架用。模型自带,订阅、API key、本地模型都行,框架不绑定某一家。

上手

npx e2e init

init 是交互式的,问你选哪个引擎(web 或 mobile)、哪个模型 provider,然后生成配置和示例测试。剩下的看官方 quickstart(e2e.tester.army/docs/quickstart)。

一个少见的细节:e2e 包把全部文档打进发布包,coding agent 可以直接读 node_modules/e2e/docs 离线查阅。用 e2e 写测试的团队大概率也在用 AI 辅助编程,这个设计省了 agent 联网查文档的功夫。

包结构

包 用途
e2e SDK、runner 和 CLI
@e2e-dev/web 浏览器引擎,基于 Playwright 驱动 Chromium、Firefox、WebKit
@e2e-dev/mobile iOS/Android 引擎,通过 agent-device 驱动模拟器和仿真器
@e2e-dev/github reporter,把结果发成 PR 评论
@e2e-dev/kernel 为 web 引擎提供托管浏览器
@e2e-dev/eas 托管的 iOS 模拟器和 Android 仿真器,供 mobile 引擎用
@e2e-dev/decision decision-model 执行器,处理有界的语义操作和断言

web 引擎底层是 Playwright,浏览器覆盖和 Playwright 一致。移动端走模拟器和仿真器,配 @e2e-dev/eas 可以用托管设备,省掉本地环境配置。

引入前要留意的点

  • 还没到 1.0。README 明确说 API 和配置在 minor 版本之间仍可能变化,现在引入要评估升级成本。
  • 遥测默认开启。CLI 发送匿名使用数据,包括跑了哪些命令、哪些引擎、在哪一步失败,不含测试内容、应用内容和凭据。关闭方式:npx e2e telemetry disable,或设置环境变量 E2E_TELEMETRY_DISABLED=1。每个上报字段在官方 telemetry 文档里列出。

我的判断

2,786 star,对一个还没到 1.0 的测试框架来说不算低。它真正的赌注是“agent 步骤 + 录制回放”这个组合:AI 负责生成路径,断言负责锁定结果,回放负责让 CI 可复现。如果你的测试代码里大量篇幅花在“怎么到达那个页面”上,值得一试。安全问题不要开公开 issue,按仓库 SECURITY.md 发邮件到 security@tester.army。有问题可以去项目的 Discord 问。

这篇文章对你有帮助吗?

发表回复