name: dyad:deflake-e2e description: 通过反复运行和调查失败来识别和修复不稳定的端到端测试。
修复不稳定的E2E测试
通过反复运行和调查失败来识别和修复不稳定的端到端测试。
参数
$ARGUMENTS: (可选) 特定的E2E测试文件以修复不稳定(例如,main.spec.ts或e2e-tests/main.spec.ts)。如果未提供,将提示修复整个测试套件。
指令
-
检查是否提供了特定测试:
如果
$ARGUMENTS为空或未提供,询问用户:“未提供特定测试。您想修复整个E2E测试套件吗?这可能需要很长时间,因为每个测试将运行10次。”
等待用户确认后再继续。如果他们拒绝,请他们提供特定的测试文件。
-
安装依赖项:
npm install -
构建应用二进制文件:
npm run build重要: 在运行E2E测试之前,此步骤是必需的。E2E测试针对构建的二进制文件运行。如果您对应用代码(
e2e-tests/外的任何内容)进行了任何更改,必须在再次运行E2E测试前重新运行npm run build,否则您将测试旧版本。 -
重复运行测试以检测不稳定性:
对每个测试文件,运行10次:
PLAYWRIGHT_RETRIES=0 PLAYWRIGHT_HTML_OPEN=never npm run e2e -- e2e-tests/<testfile>.spec.ts --repeat-each=10重要:
PLAYWRIGHT_RETRIES=0是必需的,以禁用自动重试。否则,在CI环境(其中CI=true)中默认有2次重试,导致不稳定测试在重试时通过并被错误地跳过为“非不稳定”。注意:
- 如果
$ARGUMENTS提供时没有e2e-tests/前缀,添加它 - 如果
$ARGUMENTS提供时没有.spec.ts后缀,添加它 - 如果一个测试在10次运行中至少失败一次,则被视为不稳定
- 如果
-
对于每个不稳定测试,使用调试日志进行调查:
使用Playwright浏览器调试运行失败测试:
DEBUG=pw:browser PLAYWRIGHT_RETRIES=0 PLAYWRIGHT_HTML_OPEN=never npm run e2e -- e2e-tests/<testfile>.spec.ts分析调试输出以理解:
- 时序问题(竞态条件、元素未就绪)
- 动画/过渡干扰
- 网络时序变异性
- 测试间状态泄漏
- 快照比较差异
-
修复不稳定测试:
遵循Playwright最佳实践的常见修复:
- 在与元素交互之前使用
await expect(locator).toBeVisible() - 对于网络相关测试,使用
await page.waitForLoadState('networkidle') - 使用稳定选择器(data-testid、role、text)而不是易碎的CSS选择器
- 为动画添加显式等待:
await page.waitForTimeout(300)(谨慎使用) - 对于视觉测试,使用
await expect(locator).toHaveScreenshot()选项,如maxDiffPixelRatio - 确保适当的测试隔离(测试前/后清理状态)
重要: 不要更改任何应用代码。假设应用代码是正确的。仅修改测试文件和快照基线。
- 在与元素交互之前使用
-
如果需要,更新快照基线:
如果不稳定性是由于合法的视觉差异:
PLAYWRIGHT_RETRIES=0 PLAYWRIGHT_HTML_OPEN=never npm run e2e -- e2e-tests/<testfile>.spec.ts --update-snapshots -
验证修复:
重新运行测试10次以确认不再不稳定:
PLAYWRIGHT_RETRIES=0 PLAYWRIGHT_HTML_OPEN=never npm run e2e -- e2e-tests/<testfile>.spec.ts --repeat-each=10测试应在所有10次运行中一致通过。
-
总结结果:
向用户报告:
- 哪些测试被识别为不稳定
- 导致不稳定性的原因
- 应用了哪些修复
- 验证结果(所有10次运行通过)
- 任何无法修复且需要进一步调查的测试