Spec-Zone.ru › Playwright

Повторные прогоны

Введение​

Повторные прогоны тестов — это способ автоматического повторного выполнения теста при его сбое. Это полезно, когда тест нестабилен и периодически завершается ошибкой. Настройка повторных прогонов выполняется в файле настройки.

Ошибки​

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

Вы можете настроить повторные прогоны в файле конфигурации:

import { defineConfig } from '@playwright/test';

export default defineConfig({
  // Give failing tests 3 retry attempts
  retries: 3,
});

Playwright Test будет категоризировать тесты следующим образом:

  • "пройденные" — тесты, которые прошли при первом запуске;
  • "нестабильные" — тесты, которые завершились ошибкой при первом запуске, но прошли при повторном запуске;
  • "не пройденные" — тесты, которые завершились ошибкой при первом запуске и завершились ошибкой при всех повторных прогонах.
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 }) => {
    // ...
  });
});

Последовательный режим​

Используйте test.describe.serial(), чтобы сгруппировать зависимые тесты и гарантировать, что они будут выполняться вместе и в определенном порядке. Если один из тестов завершится ошибкой, все последующие тесты будут пропущены. Все тесты в группе повторяются вместе.

Рассмотрим следующий фрагмент, использующий test.describe.serial:

import { test } from '@playwright/test';

test.describe.configure({ mode: 'serial' });

test.beforeAll(async () => { /* ... */ });
test('first good', async ({ page }) => { /* ... */ });
test('second flaky', async ({ page }) => { /* ... */ });
test('third good', async ({ page }) => { /* ... */ });

При запуске без повторных прогонов все тесты после ошибки пропускаются:

  • Процесс-рабочий поток #1:
    • beforeAll запускается
    • first good проходит
    • second flaky завершается ошибкой
    • third good полностью пропущен

При запуске с повторными прогонами все тесты повторяются вместе:

  • Процесс-рабочий поток #1:
    • beforeAll запускается
    • first good проходит
    • second flaky завершается ошибкой
    • third good пропущен
  • Процесс-рабочий поток #2:
    • beforeAll запускается снова
    • first good проходит снова
    • second flaky проходит
    • third good проходит

примечание

Обычно лучше сделать тесты изолированными, чтобы они могли эффективно выполняться и повторяться независимо.

Использование одной страницы между тестами​

Playwright Test создает изолированный объект Page для каждого теста. Однако, если вам нужно использовать один объект Page между несколькими тестами, вы можете создать свой собственный в test.beforeAll() и закрыть его в test.afterAll().

  • TypeScript
  • JavaScript
import { test, type Page } from '@playwright/test';

test.describe.configure({ mode: 'serial' });

let page: Page;

test.beforeAll(async ({ browser }) => {
  page = await browser.newPage();
});

test.afterAll(async () => {
  await page.close();
});

test('runs first', async () => {
  await page.goto('https://playwright.dev/');
});

test('runs second', async () => {
  await page.getByText('Get Started').click();
});
// @ts-check

const { test } = require('@playwright/test');

test.describe.configure({ mode: 'serial' });

/** @type {import('@playwright/test').Page} */
let page;

test.beforeAll(async ({ browser }) => {
  page = await browser.newPage();
});

test.afterAll(async () => {
  await page.close();
});

test('runs first', async () => {
  await page.goto('https://playwright.dev/');
});

test('runs second', async () => {
  await page.getByText('Get Started').click();
});

© 2024 Microsoft
Licensed under the Apache License, Version 2.0.
https://playwright.dev/docs/test-retries

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API