端到端与回归测试
关键用户旅程、Playwright隔离、异步等待、Trace证据、Flaky治理,以及 Agent 端到端如何验证工具与副作用。
端到端与回归测试
端到端测试从系统外部入口出发,经过真实装配,验证用户关注的结果。它最接近生产环境,但执行成本高、速度慢且失败定位困难。因此,E2E应集中保护关键用户旅程,不适合覆盖所有低层分支。
1. E2E测试什么
一个电商E2E可能是注册、搜索、下单、支付;AgentOps则是:
创建Incident
→ 多Agent检索与工具调用
→ SSE显示阶段进度
→ 生成带Citation的RCA
→ 用户确认修复动作
→ 状态和审计记录落库
E2E验证系统能否交付外部价值,不负责穷举每个Parser边界;这些边界应在Unit与Integration层完成覆盖。
2. 选择关键旅程
优先覆盖:
- 最高业务价值;
- 最不可逆副作用;
- 跨组件最多但必须工作的主链路;
- 曾经产生严重生产缺陷的路径;
- 发布后必须立即确认的Smoke Path。
每条旅程写清:Persona、前置状态、动作、可观察结果、允许时间、数据清理和失败证据。
3. UI E2E与API E2E
API E2E绕过浏览器,速度更快、定位更清楚;UI E2E验证前端装配、浏览器行为和真实交互。组合策略:
大量Service/API层旅程
+ 少量UI关键路径
+ 前端组件测试覆盖交互细节
不要用UI点击三十页表单只为验证后端状态机的一个分支。
4. Playwright隔离
Playwright为每个Test创建独立Browser Context,隔离Cookie、Local Storage和Session Storage。测试数据也要隔离:
run_id + worker_id + test_id
→ 独立用户、Tenant、任务和对象前缀
优先从隔离的初始状态创建测试数据,而不是在测试后执行复杂清理。清理逻辑容易遗漏,测试中断还可能将不完整数据遗留给后续Case。
Locator与Auto-wait
按用户可见Role、Label和Text定位,少依赖DOM层级和CSS类:
await page.getByRole('button', { name: '开始诊断' }).click();
await expect(page.getByText('诊断完成')).toBeVisible();
使用可重试Assertion和业务条件,避免固定sleep(3000)。睡三秒既可能浪费2.9秒,也可能在CI慢时少睡一秒,属于两头得罪。
5. 异步系统如何等待
Agent、队列和SSE都属于异步链路。等待策略按优先级排列如下:
- 等待明确的业务事件或终态;
- 轮询状态API,带Deadline和退避;
- 等待可观察UI条件;
- 固定Sleep。
deadline = now + 30s
while now < deadline:
state = GET /incidents/{id}
if state is terminal: assert state
wait with bounded backoff
超时失败应输出最后状态、事件Cursor、Trace ID和Server日志链接,而不是一句“元素未出现”。
6. SSE E2E
至少覆盖:
- 首次连接收到实时事件;
- 中途断线,重连携带
Last-Event-ID; - 断线期间事件完整补放且无重复应用;
- 超过Retention返回
resync_required; - 心跳通过代理及时Flush;
- 页面关闭不取消后台任务;
- 显式取消能传播到Worker并进入终态。
可以在Test Proxy中主动切断连接,以可重复方式验证断线恢复,不能仅依赖一次人工网络中断操作。
7. Agent E2E不能只看最终答案
一次Agent旅程至少断言五层:
| 层 | 断言 |
|---|---|
| Task | 最终状态、停止原因、总预算 |
| Trajectory | 使用允许工具、无循环、关键步骤出现 |
| Tool | 参数、权限、Approval、错误处理 |
| Evidence | Gold Evidence召回、Citation可解析 |
| Answer | Correctness、Faithfulness、格式与拒答 |
最终答案正确但调用了越权Tool,测试必须失败;答案措辞不同但事实、引用和结构正确,测试不应因字符串变化失败。
一个Agent E2E Case
case_id: payment_pool_exhausted
setup:
loki_fixture: payment-timeout.jsonl
prometheus_fixture: db-pool-high.yaml
input: "支付服务大量超时,定位原因"
expected:
required_tools: [query_metrics, search_logs]
forbidden_tools: [restart_workload]
gold_evidence: [metric_pool_wait, log_conn_timeout]
terminal_status: succeeded
max_tool_calls: 6
max_cost_usd: 0.08
Answer使用Rubric评分,工具和预算使用精确断言。
8. 回归测试构建
回归集来源:生产缺陷、Support Ticket、代码变更风险、模型升级差异、红队样本和历史Flaky。每个缺陷先缩成最低层Case:
生产E2E失败
→ 保存Trace与Fixture
→ 找到最小失败边界
→ 加Unit / Integration回归
→ 保留一条高价值E2E Smoke
回归集需要去重、分层,并标注Owner和过期条件。若不清理废弃功能对应的Case,测试套件会持续增加不再具备业务价值的维护成本。
9. Flaky Test不是“重跑就好”
Flaky是同一代码与输入下,测试非确定地Pass或Fail。来源:
- 时间与固定Sleep;
- 共享数据和执行顺序;
- 未等待的异步任务;
- 网络与第三方依赖;
- 随机数未记录Seed;
- 资源不足与并行竞争;
- 模型采样波动。
Flaky Rate:
治理流程包括自动隔离、保留证据、指定Owner、修复根因和恢复门禁。Retry只能帮助收集波动证据,首次失败后重试通过仍应记录为Flaky事件,而不能直接视为稳定通过。
若Agent Case本身属于统计测试,应明确运行次并以成功率判定,不应将设计中的概率性误判为传统Flaky Test。
10. Trace、截图和失败证据
E2E失败自动保存:
- Browser Trace、Screenshot、Video;
- Network HAR与Console;
trace_id、Task Timeline、SSE Event;- Tool Call及脱敏参数;
- Model、Prompt、Schema和Knowledge Version;
- 数据Fixture版本与随机Seed;
- Server Logs和关键Metric窗口。
证据保留期要受数据合规约束,不能为了Debug把用户Secret写进CI Artifact。
11. 发布与线上验证
发布后跑Synthetic Smoke:主页、登录、创建只读诊断、查询状态。不在生产自动执行真实重启或发消息。写操作使用Sandbox Tenant、Dry-run或影子资源。
Canary比较:错误率、P95/P99、Agent Task Success、Tool Error、成本和拒答率。门禁应同时有最小样本和观察窗口,三次请求全成功不能说明世界和平。
12. Agent辅助传统E2E
Agent可以:
- 从需求和OpenAPI生成候选旅程;
- 分析DOM与Trace提出更稳Locator;
- 对失败Cluster归因;
- 把生产Trace缩成Fixture;
- 检查Case是否遗漏权限、取消和异常分支。
但Agent生成的UI脚本必须经过Review,尤其禁止自动触发生产环境中的高风险操作。测试Agent不得持有不受限制的管理员Token,也不得在生产环境中进行无边界探索。
13. 面试速答
为什么E2E数量要少
组件多、速度慢、维护贵、定位差。用它保护关键旅程,边界与异常下沉到更低层。
如何处理E2E Flaky
隔离数据、使用事件驱动等待、冻结可控时间、保存Trace并统计Flaky Rate;Retry不得掩盖首次失败。
Agent E2E怎样断言
精确断言任务、工具、权限、副作用和预算;对答案使用Evidence、Invariant、Rubric和统计阈值。