用途
该技能用于运行端到端(e2e)测试、调试测试失败以及修复不稳定的测试。它通过一套明确的分类与修复规则,帮助区分失败来自测试基础设施、过时测试还是真实代码缺陷,从而做出正确的修复决策。
失败分类法
每一次 e2e 失败被严格归为以下类别之一:
A. Flaky(测试基础设施问题)
- 竞态条件、时序相关断言、过期选择器、缺失等待
- 症状:重试后通过,间歇性失败
B. Outdated(测试不再匹配实现)
- 测试断言了被有意更改的旧行为;选择器引用已移除元素
- 症状:持续性失败,但应用本身工作正常
C. Bug(实现不符合规格)
- 测试正确断言了规格行为,代码有误
- 仅当存在可供校验的规格时,才归类为 Bug
- 若无规格,归类为“未验证失败(unverified failure)”并报告给用户
按类别的修复规则
Flaky 修复:
- 将 waitForTimeout 替换为自动等待定位器
- 将脆弱的 CSS 选择器替换为 getByRole/getByLabel/getByTestId
- 用 expect() web-first 断言修复竞态条件
- 修复 mock/路由设置顺序(应在导航之前)
- 绝不添加任意延迟——应修复底层等待
- 绝不在断言周围添加重试循环——使用框架内置重试
Outdated 修复:
- 更新测试断言以匹配当前(正确)行为
- 更新选择器以匹配当前 DOM/API
- 绝不更改源代码——实现是正确的,测试已过时
Bug 修复:
- 引用定义预期行为的规格章节
- 修复源代码以匹配规格
- 修复完成前必须有单元测试——缺失时先写(TDD)
- 绝不更改 e2e 断言以匹配有缺陷的代码
- 绝不在无规格支持的情况下更改 API 契约或接口
- 若无规格,询问用户:是 Bug 还是过时测试?
源代码边界
E2e 测试修复不得更改应用逻辑、API 契约、数据库架构或配置默认值。唯一例外:Bug 修复中规格明确定义了正确行为,且单元测试覆盖了该修复。
工作流程
步骤 1:发现测试基础设施
- 找到 e2e 配置:playwright.config.ts、vitest.config.ts 或项目特有设置
- 读取 package.json 获取规范的 e2e 命令
- 检查是否需要并已运行 dev server 或 Tilt 环境
- 查找规格文件:.spec.md、docs/.spec.md —— 作为 Bug 判定的真相来源
步骤 2:运行测试
# Playwright
yarn playwright test --reporter=line
# 或项目特有
yarn test:e2e
将失败解析为:测试、文件、错误、类别,例如:
| 测试 | 文件 | 错误 | 类别 |
|---|---|---|---|
| login flow | auth.spec.ts:42 | timeout waiting for selector | TBD |
步骤 3:分类 对每个失败:读取测试文件、读取其涉及的源代码、检查对应规格文件,分配类别(flaky / outdated / bug / unverified)。
步骤 4:按类别修复 按顺序应用修复:先 flaky(可解除其他测试阻塞),再 outdated,最后 bug。
步骤 5:重新运行并报告
## E2E Results
**Run**: `yarn test:e2e` on <date>
**Result**: X/Y passed
### Fixed
- FLAKY: `auth.spec.ts:42` - replaced waitForTimeout with getByRole wait
- OUTDATED: `profile.spec.ts:88` - updated selector after header redesign
- BUG: `transfer.spec.ts:120` - fixed amount validation per SPEC.md#transfers
### Remaining Failures
- UNVERIFIED: `settings.spec.ts:55` - no spec, needs user decision
### Unit Tests Added
- `src/transfer.test.ts` - amount validation edge cases (covers BUG fix)
更多关于异步处理、flake 分类与预检模式,参见 testing-best-practices。
适用场景
适用于需要运行、调试和修复端到端测试的开发团队,尤其是面对间歇性失败难以判断根因、或需要在不破坏源代码逻辑的前提下修复测试的场景。
限制
在缺少规格文件时,无法将失败归类为 Bug,只能标记为未验证失败并交由用户决定。该技能侧重于测试层面的修复规则与工作流,具体框架命令与配置取决于项目本身。