Фикстуры в Playwright Test

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

Что такое фикстуры?

Фикстуры в Playwright Test представляют собой функции или объекты, которые выполняются перед запуском теста (или группы тестов) для настройки необходимых условий и данных. После выполнения тестов фикстуры могут быть использованы для очистки или восстановления состояния.

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

Объявление фикстур

Фикстура в Playwright Test может быть определена с помощью функции test, используя метод test.fixture(). В этой функции можно описать, какие именно действия необходимо выполнить до и после теста.

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

test('simple test', async ({ page }) => {
  await page.goto('https://example.com');
  // Выполнение тестовых шагов
});

В данном примере фикстура page предоставляется Playwright Test по умолчанию. Это встроенная фикстура, которая передает объект страницы в тест, готовый к взаимодействию.

Типы фикстур

Playwright Test поддерживает несколько типов фикстур, которые могут использоваться в зависимости от объема и области применения.

1. Локальные фикстуры

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

Пример:

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

test('тест с локальной фикстурой', async ({ page }) => {
  // Пример локальной фикстуры, создание элемента на странице
  await page.goto('https://example.com');
  const title = await page.title();
  expect(title).toBe('Example Domain');
});

2. Глобальные фикстуры

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

Пример глобальной фикстуры:

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

test.describe('Глобальная фикстура', () => {
  test.beforeAll(async () => {
    // Инициализация глобальных данных
  });

  test.afterAll(async () => {
    // Очистка глобальных ресурсов
  });

  test('тест с глобальной фикстурой', async ({ page }) => {
    await page.goto('https://example.com');
    const title = await page.title();
    expect(title).toBe('Example Domain');
  });
});

3. Фикстуры с параметрами

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

Пример фикстуры с параметрами:

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

const testData = [
  { url: 'https://example.com', title: 'Example Domain' },
  { url: 'https://playwright.dev', title: 'Playwright' },
];

test.each(testData)('Проверка заголовка страницы %s', async ({ page }, { url, title }) => {
  await page.goto(url);
  const pageTitle = await page.title();
  expect(pageTitle).toBe(title);
});

Использование async в фикстурах

Фикстуры могут быть асинхронными, что позволяет выполнять операции, такие как запросы к базе данных или ожидание ответа от внешних сервисов. Playwright Test поддерживает асинхронные функции в качестве фикстур, обеспечивая синхронизацию с выполнением тестов.

Пример асинхронной фикстуры:

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

test('Асинхронная фикстура', async ({ page }) => {
  await page.goto('https://example.com');
  const title = await page.title();
  expect(title).toBe('Example Domain');
});

Взаимодействие с фикстурами через параметры

Фикстуры в Playwright Test можно передавать в параметры теста. Таким образом, можно разделить код и сделать его более гибким и удобным для масштабирования.

Пример с передачей фикстуры в параметры:

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

test('Фикстуры через параметры', async ({ page }) => {
  const customData = { message: 'Hello, Playwright!' };

  await page.goto('https://example.com');
  // Использование данных из фикстуры
  expect(await page.evaluate(() => document.title)).toBe('Example Domain');
  expect(customData.message).toBe('Hello, Playwright!');
});

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

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

Пример работы с API в фикстуре:

import { test, expect } from '@playwright/test';
import axios from 'axios';

test.describe('Работа с API', () => {
  let apiData;

  test.beforeAll(async () => {
    const response = await axios.get('https://jsonplaceholder.typicode.com/todos/1');
    apiData = response.data;
  });

  test('Тестирование API данных', async ({ page }) => {
    expect(apiData).toHaveProperty('id');
    expect(apiData.id).toBe(1);
  });
});

Очистка и восстановление состояния

При использовании фикстур важно учитывать, что после выполнения теста нужно восстанавливать начальное состояние или очищать ресурсы. Playwright Test предоставляет методы beforeEach, afterEach, beforeAll и afterAll для выполнения действий до и после выполнения тестов.

Пример использования методов очистки:

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

test.describe('Очистка состояния', () => {
  test.beforeAll(async () => {
    // Подготовка перед выполнением всех тестов
  });

  test.afterAll(async () => {
    // Очистка после всех тестов
  });

  test('Очистка перед каждым тестом', async ({ page }) => {
    await page.goto('https://example.com');
    const title = await page.title();
    expect(title).toBe('Example Domain');
  });
});

Заключение

Фикстуры в Playwright Test позволяют организовать тестирование с минимальными затратами времени на подготовку и очистку данных. Правильное использование фикстур улучшает читаемость и поддержку тестов, повышает их гибкость и позволяет избежать дублирования кода. Playwright Test предоставляет гибкие механизмы для работы с фикстурами, что делает тестирование более эффективным и удобным.