工程效率与质量 / 进阶

Playwright 稳定性实践:消灭等待、串扰和偶发失败

用可观察条件替代固定等待,隔离测试数据,并为偶发失败保留可诊断证据。

不要用 timeout 猜页面何时完成

固定等待把测试和机器速度绑在一起:本地浪费时间,CI 仍可能不够。等待用户真正能观察到的状态,例如按钮可用、响应完成或结果列表出现。Playwright 的定位器断言会自动重试。

EXAMPLE / 01Playwright
await page.getByRole('button', { name: '创建订单' }).click();
await expect(page.getByTestId('order-status'))
  .toHaveText('已创建');
await expect(page).toHaveURL(/\/orders\/\d+$/);

每条用例拥有自己的数据

并行测试若共享账号、购物车或固定订单号,就会彼此覆盖。通过 API 在 beforeEach 中创建最小数据,为资源名加入 workerIndex 或随机后缀,并在结束后按测试命名空间清理。

用例不依赖执行顺序;测试账号和业务资源可并行隔离;数据创建走稳定 API 而非重复 UI 操作;失败后清理逻辑仍会执行。

失败必须留下证据

在首次重试时保留 trace、截图、视频和浏览器控制台日志。重试只能用于收集证据,不能让红色结果悄悄变绿。按用例统计 flaky 次数,并为超过阈值的测试设置负责人和修复期限。

EXAMPLE / 03Playwright
export default defineConfig({
  retries: process.env.CI ? 2 : 0,
  use: {
    trace: 'on-first-retry',
    screenshot: 'only-on-failure',
    video: 'retain-on-failure'
  }
});