名称:端到端测试 描述:运行端到端测试,修复不稳定和过时的测试,根据规范识别缺陷。用于运行端到端测试、调试测试失败或修复不稳定测试。未经规范支持,绝不更改源代码逻辑或API。
端到端测试
原则(始终有效)
在处理端到端测试、测试失败或测试不稳定性时,这些原则始终适用:
失败分类
每个端到端失败都属于以下恰好一种情况:
A. 不稳定(测试基础设施问题)
- 竞态条件、依赖时间的断言
- UI变更后选择器过时
- 缺少等待、等待目标不正确
- 网络时序、模拟设置顺序
- 症状:重试通过,间歇性失败
B. 过时(测试不再匹配实现)
- 测试断言已被故意更改的旧行为
- 选择器引用已移除/重命名的元素
- API合约已更改,测试未更新
- 症状:一致失败,应用程序工作正常
C. 缺陷(实现不匹配规范)
- 测试正确断言规范定义的行为,代码错误
- 仅当存在规范可验证时才归类为缺陷
- 如果不存在规范,归类为“未验证失败”并报告给用户
按类别修复规则
不稳定修复:
- 用自动等待定位器替换
waitForTimeout - 用
getByRole/getByLabel/getByTestId替换脆弱的CSS选择器 - 用
expect()网页优先断言修复竞态条件 - 修复模拟/路由设置顺序(在导航之前)
- 绝不添加任意延迟 - 修复底层等待问题
- 绝不削弱断言 以使不稳定测试通过
- 绝不在断言周围添加重试循环 - 使用框架内置的重试机制
过时修复:
- 更新测试断言以匹配当前(正确)行为
- 更新选择器以匹配当前DOM/API
- 绝不更改源代码 - 实现是正确的,测试是过时的
缺陷修复:
- 引用定义预期行为的规范部分
- 修复源代码以匹配规范
- 修复完成前必须存在单元测试
- 如果存在单元测试,运行它们以确认
- 如果不存在单元测试,先编写它们(TDD)
- 绝不更改端到端断言 以匹配有缺陷的代码
- 未经规范支持,绝不更改API合约或接口
- 如果不存在规范,询问用户:是缺陷还是过时测试?
源代码边界
端到端测试修复不得更改:
- 应用程序逻辑或业务规则
- API合约、请求/响应结构
- 数据库模式或迁移
- 配置默认值
唯一例外:缺陷修复,其中规范明确定义了正确行为,并且单元测试覆盖了修复。
工作流程(当明确运行端到端测试时)
步骤1:发现测试基础设施
- 查找端到端配置:
playwright.config.ts、vitest.config.ts或项目特定设置 - 阅读
package.json获取规范的端到端命令 - 检查是否需要开发服务器或Tilt环境并正在运行
- 查找规范文件:
*.spec.md、docs/*.spec.md- 缺陷决策的真相来源
步骤2:运行测试
使用最小报告器运行以避免上下文溢出:
# Playwright
yarn playwright test --reporter=line
# 或项目特定
yarn test:e2e
如果指定了过滤器,则应用它:
yarn playwright test --reporter=line -g "transfer"
yarn test:e2e -- --grep "transfer"
将失败解析为:
| 测试 | 文件 | 错误 | 类别 |
|---|---|---|---|
登录流程 |
auth.spec.ts:42 |
等待选择器超时 | 待定 |
步骤3:分类
对于每个失败:
- 阅读测试文件
- 阅读它执行的源代码
- 检查对应的规范文件
- 分配类别:不稳定、过时、缺陷或未验证
步骤4:按类别修复
按照上述原则应用修复,顺序如下:
- 不稳定 - 首先修复测试基础设施问题(解除其他测试的阻塞)
- 过时 - 更新过时的断言
- 缺陷 - 使用规范 + 单元测试门控进行修复
步骤5:重新运行并报告
所有修复后,重新运行套件:
## 端到端测试结果
**运行**:`yarn test:e2e` 于 <日期>
**结果**:X/Y 通过
### 已修复
- 不稳定:`auth.spec.ts:42` - 将 waitForTimeout 替换为 getByRole 等待
- 过时:`profile.spec.ts:88` - 在标题重新设计后更新选择器
- 缺陷:`transfer.spec.ts:120` - 根据 SPEC.md#transfers 修复金额验证
### 剩余失败
- 未验证:`settings.spec.ts:55` - 无规范,需要用户决策
### 新增单元测试
- `src/transfer.test.ts` - 金额验证边界情况(覆盖缺陷修复)