ARCHIVE / INITIALIZING000%
正在载入档案界面SYS.07
Interview Prep

端到端与回归测试

关键用户旅程、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都属于异步链路。等待策略按优先级排列如下:

  1. 等待明确的业务事件或终态;
  2. 轮询状态API,带Deadline和退避;
  3. 等待可观察UI条件;
  4. 固定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、错误处理
EvidenceGold Evidence召回、Citation可解析
AnswerCorrectness、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:

FlakyRate⁡=#tests with inconsistent outcomes#tests executed repeatedly\operatorname{FlakyRate} =\frac{\#\text{tests with inconsistent outcomes}}{\#\text{tests executed repeatedly}}

治理流程包括自动隔离、保留证据、指定Owner、修复根因和恢复门禁。Retry只能帮助收集波动证据,首次失败后重试通过仍应记录为Flaky事件,而不能直接视为稳定通过。

若Agent Case本身属于统计测试,应明确运行nn次并以成功率判定,不应将设计中的概率性误判为传统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和统计阈值。

参考