Хуки before и after

В Playwright, как и в других фреймворках для автоматизации тестирования, хуки before и after играют важную роль в организации и настройке тестов. Эти хуки позволяют предварительно настроить тестовую среду, выполнить действия до или после каждого теста, а также провести необходимые очистки после выполнения тестов. Использование хуков значительно улучшает структуру тестов, повышая их гибкость и упрощая поддержку.

Хук before

Хук before выполняется один раз перед запуском тестов или набора тестов. Это идеальное место для выполнения операций, которые должны быть выполнены до начала тестирования, таких как:

  • Подключение к базе данных.
  • Инициализация серверов или приложений.
  • Загрузка тестовых данных.
  • Подготовка тестового окружения.

В Playwright можно использовать несколько вариантов этого хука, в зависимости от того, на каком уровне тестирования он нужен.

Пример использования before на уровне всего файла тестов:
const { test, before } = require('@playwright/test');

before(async () => {
  // Подключение к тестовому серверу
  await connectToTestServer();
});

test('Тест 1', async ({ page }) => {
  await page.goto('https://example.com');
  // Тестовый код...
});

В этом примере хук before выполняется один раз перед всеми тестами в файле. Это удобно, когда нужно подготовить общие ресурсы, которые могут быть использованы во всех тестах.

Пример использования before для каждого теста:
const { test, before } = require('@playwright/test');

test.beforeEach(async () => {
  // Выполнение действий перед каждым тестом
  await resetDatabase();
});

test('Тест 1', async ({ page }) => {
  await page.goto('https://example.com');
  // Тестовый код...
});

В данном случае хук beforeEach выполняется перед каждым тестом, что полезно, если необходимо подготовить тестовую среду перед каждым запуском.

Хук after

Хук after выполняется после выполнения тестов или набора тестов. Его используют для выполнения действий, которые должны быть выполнены после тестирования, таких как:

  • Очистка тестовых данных.
  • Завершение работы с внешними сервисами или базами данных.
  • Логирование результатов тестирования.
  • Завершение работы серверов или приложений.

Использование хука after помогает предотвратить утечку ресурсов и гарантирует, что тесты не оставляют за собой ненужных побочных эффектов.

Пример использования after на уровне всего файла тестов:
const { test, after } = require('@playwright/test');

after(async () => {
  // Завершение работы с тестовым сервером
  await disconnectFromTestServer();
});

test('Тест 1', async ({ page }) => {
  await page.goto('https://example.com');
  // Тестовый код...
});

Здесь хук after выполняется один раз после всех тестов в файле. Это удобно для очистки глобальных ресурсов.

Пример использования after для каждого теста:
const { test, afterEach } = require('@playwright/test');

test.afterEach(async () => {
  // Очистка базы данных после каждого теста
  await clearTestData();
});

test('Тест 1', async ({ page }) => {
  await page.goto('https://example.com');
  // Тестовый код...
});

Хук afterEach выполняется после каждого теста, что полезно для локальной очистки, которая требуется после каждого теста.

Задержки и асинхронность

Как и большинство операций в Playwright, хуки before и after поддерживают асинхронные операции. Если требуется выполнение асинхронной задачи, можно использовать async/await для ожидания выполнения операций до того, как продолжится выполнение тестов. Это особенно важно при работе с внешними ресурсами, такими как базы данных или веб-сервисы, где нужно гарантировать завершение действий до перехода к следующему тесту.

Пример с асинхронными операциями в хуках:

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

before(async () => {
  await setupDatabaseConnection();
});

after(async () => {
  await closeDatabaseConnection();
});

test('Тест 1', async ({ page }) => {
  await page.goto('https://example.com');
  // Тестовый код...
});

В этом примере setupDatabaseConnection и closeDatabaseConnection — асинхронные функции, которые обрабатывают подключения к базе данных. Благодаря хукам, тесты не начнут выполняться, пока не завершится настройка окружения, и не завершатся, пока не выполнится очистка.

Совмещение хуков before и after с различными уровнями тестов

Хуки могут быть использованы не только для выполнения глобальных операций, но и для настройки окружения на уровне каждого теста или набора тестов. В Playwright можно комбинировать хуки на различных уровнях — для всей тестовой сессии, группы тестов или для каждого теста отдельно. Такой подход позволяет гибко управлять подготовкой и очисткой ресурсов в зависимости от структуры тестов.

Пример с несколькими уровнями хуков:
const { test, before, after, beforeEach, afterEach } = require('@playwright/test');

before(async () => {
  await globalSetup();
});

after(async () => {
  await globalTeardown();
});

test.beforeEach(async () => {
  await setupTestData();
});

test.afterEach(async () => {
  await clearTestData();
});

test('Тест 1', async ({ page }) => {
  await page.goto('https://example.com');
  // Тестовый код...
});

В этом примере хуки выполняются на разных уровнях: глобальные настройки перед тестами и очистка данных после каждого теста. Это позволяет максимально гибко управлять выполнением тестов и упрощает создание более сложных сценариев.

Использование хуков для обработки ошибок

Хуки также могут быть полезны для обработки ошибок. Например, если тест завершился с ошибкой, можно использовать хук afterEach для логирования дополнительной информации, такой как скриншоты или логи браузера. Это помогает понять причину ошибки и ускоряет процесс диагностики.

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

test.afterEach(async ({ page }, testInfo) => {
  if (testInfo.status === 'failed') {
    await page.screenshot({ path: 'screenshot.png' });
    console.log('Тест не прошел. Сделан скриншот');
  }
});

test('Тест 1', async ({ page }) => {
  await page.goto('https://example.com');
  // Тестовый код...
});

В этом примере, если тест завершился с ошибкой, будет сделан скриншот страницы, что поможет в анализе проблемы.

Заключение

Хуки before и after в Playwright предоставляют мощный механизм для настройки и очистки тестового окружения. Эти хуки позволяют автоматизировать задачи, которые должны выполняться до или после тестов, обеспечивая гибкость и удобство при написании и поддержке тестов. Правильное использование хуков позволяет улучшить производительность тестов, сделать их более надежными и помочь при диагностике ошибок.