测试重试是一种在测试失败时自动重新运行测试的方法。当测试不稳定并且间歇性失败时,这非常有用。测试重试在 配置文件 中配置。
失败
Playwright Test 在工作进程中运行测试。这些进程是操作系统进程,独立运行,由测试运行器编排。所有工作线程都有相同的环境,并且每个工作线程都启动自己的浏览器。
考虑以下片段:
import { test } from '@playwright/test';
test.describe('suite', () => {
test.beforeAll(async () => { / ... / });
test('first good', async ({ page }) => { / ... / });
test('second flaky', async ({ page }) => { / ... / });
test('third good', async ({ page }) => { / ... / });
test.afterAll(async () => { / ... / });
});
当所有测试通过后,它们将在同一个工作进程中按顺序运行。
工作进程启动
beforeAll 钩子运行
first good 次通过
second flaky 次通过
third good 次通过
afterAll 钩子运行
如果任何测试失败,Playwright Test 将丢弃整个工作进程以及浏览器,并启动一个新的工作进程。从下一个测试开始,测试将在新的工作进程中继续进行。
工作进程 #1 启动
beforeAll 钩子运行
first good 次通过
second flaky 失败
afterAll 钩子运行
工作进程 #2 启动
beforeAll 钩子再次运行
third good 次通过
afterAll 钩子运行
如果启用 retries,第二个工作进程将通过重试失败的测试来启动,并从那里继续。
工作进程 #1 启动
beforeAll 钩子运行
first good 次通过
second flaky 失败
afterAll 钩子运行
工作进程 #2 启动
beforeAll 钩子再次运行
重试 second flaky 并通过
third good 次通过
afterAll 钩子运行
该方案非常适合独立测试,并保证失败的测试不会影响健康的测试
重试
Playwright 支持测试重试。启用后,失败的测试将重试多次,直到通过,或达到最大重试次数。默认情况下,不会重试失败的测试。
Give failing tests 3 retry attempts
npx playwright test --retries=3
你可以在配置文件中配置重试次数:
playwright.config.ts
import { defineConfig } from '@playwright/test';
export default defineConfig({
// Give failing tests 3 retry attempts
retries: 3,
});
Playwright 测试将测试分类如下:
"passed" - 第一次运行时通过的测试;
"flaky" - 第一次运行失败但重试时通过的测试;
"failed" - 第一次运行失败且所有重试均失败的测试。
Running 3 tests using 1 worker
✓ example.spec.ts:4:2 › first passes (438ms)
x example.spec.ts:5:2 › second flaky (691ms)
✓ example.spec.ts:5:2 › second flaky (522ms)
✓ example.spec.ts:6:2 › third passes (932ms)
1 flaky
example.spec.ts:5:2 › second flaky
2 passed (4s)
你可以使用 testInfo.retry 在运行时检测重试,任何测试、钩子或夹具都可以访问该重试。下面是一个在重试之前清除某些服务器端状态的示例。
import { test, expect } from '@playwright/test';
test('my test', async ({ page }, testInfo) => {
if (testInfo.retry)
await cleanSomeCachesOnTheServer();
// ...
});
你可以使用 test.describe.configure() 指定对特定测试组或单个文件的重试。
import { test, expect } from '@playwright/test';
test.describe(() => {
// All tests in this describe group will get 2 retry attempts.
test.describe.configure({ retries: 2 });
test('test 1', async ({ page }) => {
// ...
});
test('test 2', async ({ page }) => {
// ...
});
});