☰
如何在e2e测试中混合AI智能体与确定性断言?3步搞定完整指南
2026/10/7 9:57:32 网站建设 项目流程

如何在e2e测试中混合AI智能体与确定性断言?3步搞定完整指南

【免费下载链接】e2eNext generation e2e testing framework for web and mobile apps.项目地址: https://gitcode.com/GitHub_Trending/e2e6/e2e

e2e是一个面向 Web 与移动端的下一代端到端测试框架:用自然语言描述测试目标,AI 智能体自动驱动应用完成操作,再在同一测试里用传统定位器断言验证结果。本文将带你掌握混合 e2e 测试的最佳实践——既享受 AI 智能体的灵活性,又保留确定性断言的稳定性与零成本。

为什么要把两者混在一个测试里?

纯 AI 测试和纯脚本测试各有一半短板:

方案优点短板
只用 AI 智能体界面改版后仍能用每次运行都要调模型,贵且偶发"抖动"
只用定位器断言快、稳、零成本UI 一改动,脚本就大面积失败

e2e 的设计思路是分工协作:

  • agent.act('目标')—— 把"怎么做"交给模型,适合复杂、易变的多步操作(登录、结账、填表);
  • expect(screen.getByRole(...))—— 把"结果对不对"交给定位器,完全不经过模型,毫秒级且结果确定;
  • agent.assert('描述')—— 只读"判断型"断言,适合"布局正常""没有遮挡"这类无法用精确文本表达的检查。

官方文档一句话概括了这个原则:docs/goals.mdx —— "A test can freely mix both"(一个测试可以自由混用两者)。

核心玩法:agent 负责"做",断言负责"验"

以仓库自带的 Vite 示例项目为例,整个流程只有 3 步。下面是官方示例 examples/with-vite/tests/agent.e2e.ts 的核心片段:

test('the agent gets a greeting', { skip }, async ({ app, agent, screen }) => { await app.open('/'); // ① AI 智能体:自己判断该填哪个输入框、点哪个按钮 await agent.act('get the app to greet {name}', { params: { name: 'Grace' } }); // ② 确定性断言:精确文本检查,不调用任何模型 await expect(screen.getByRole('status')).toHaveText('Hello, Grace!'); // ③ AI 断言(可选):用"人的眼光"再确认一次 await agent.assert('the app greets Grace by name'); });

对应的演示应用页面长这样:

三个角色各司其职:

  1. agent.act只描述目标("让应用问候 Grace"),具体操作顺序由模型决定。输入值通过params传入,避免把测试数据拼进指令文本;
  2. expect定位器断言检查精确值(如Hello, Grace!),它自动重试直到通过或超时,且不产生任何模型调用;
  3. agent.assert作为兜底"语义层",验证那些难以写成精确匹配的结果(比如整体观感、错误提示是否友好)。

💡 小贴士:官方建议在每个agent.act后面紧跟一次验证(见 docs/cache.mdx:"Follow each act with a check of its outcome"),这不仅是好习惯,还直接决定缓存是否生效(下一节)。

稳定性与成本:回放缓存是关键加分项

混合写法的隐藏福利是replay cache(回放缓存):

  • 某个agent.act步骤执行成功后,若其后紧跟的断言通过了验证,运行器会把这步的完整操作序列记录下来;
  • 下次运行时直接回放这些操作,零模型调用,成本和速度等同于纯脚本测试;
  • 一旦 UI 变了(控件找不到或终态不匹配),智能体会从当前屏幕自动接管,跑完后再重新录制。

运行报告里会给出直观统计:

AI 4.1k tokens · 2 model calls · anthropic/claude-sonnet-4.5 Cache 4 replayed · 1 handed off · 1 missed

也就是说:首跑用 AI,之后绝大多数运行像确定性测试一样跑,而 UI 漂移时 AI 又随时补位。断言类调用(assert/waitFor/extract)则始终实时运行,保证"验证"永不走缓存。

如果想在 CI 上更严格地防止"陈旧录制被静默跳过",可以加上--strict-cache参数:录制失效的步骤会直接以REPLAY_STALE失败,而不是悄悄付费重跑模型。

实战建议清单

✅每个act只给一个目标——界面内的操作顺序交给模型,目标之间的顺序由你控制; ✅指令像说话一样写,优先使用界面上的原始文案; ✅精确值检查一律用expect,把模型调用留给真正模糊的判断; ✅密码等敏感值用Secret参数传入,模型永远看不到明文(安全模型见 docs/agent-steps.mdx); ✅每步act后紧跟一次验证断言,让回放缓存有"验收依据"; ✅ 快速上手用npx e2e init生成配置和示例测试,完整教程见 docs/quickstart.mdx。

延伸阅读

  • 混合策略入门:docs/goals.mdx(agent.act 与目标化写法)
  • 断言全家桶:docs/assertions.mdx(assert/waitFor/extract与定位器断言)
  • 智能体步骤原理:docs/agent-steps.mdx(模型看到什么、步骤如何结束、成本构成)
  • 回放缓存详解:docs/cache.mdx
  • 可运行示例:Vite 版 examples/with-vite/tests/agent.e2e.ts、Next.js 版 examples/with-next/tests/greeting.e2e.ts

一句话总结:让 AI 智能体负责"像人一样操作",让确定性断言负责"像测试一样验证",再配合回放缓存把成本压到最低——这就是 e2e 混合测试的核心配方。🚀

【免费下载链接】e2eNext generation e2e testing framework for web and mobile apps.项目地址: https://gitcode.com/GitHub_Trending/e2e6/e2e

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询