Fixtures для данных

Fixtures представляют собой неотъемлемую часть автоматизированного тестирования. В контексте Playwright, fixtures используются для подготовки и управления данными, необходимыми для выполнения тестов. Они позволяют создавать стабильные и воспроизводимые тестовые среды, что критически важно при тестировании сложных веб-приложений.

В Playwright fixtures могут быть связаны с данными, такими как пользователи, сессии, настройки или любые другие ресурсы, требующие подготовки перед тестами. Использование fixtures помогает уменьшить дублирование кода и упростить тестирование, делая его более гибким и масштабируемым.

Основные принципы использования Fixtures в Playwright

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

Playwright использует концепцию «setup» (подготовка) и «teardown» (завершение), что означает выполнение некоторой логики до и после каждого теста или набора тестов. Это позволяет гарантировать, что тесты будут запускаться в контролируемой и предсказуемой среде.

Типы Fixtures

Fixtures в Playwright можно классифицировать на несколько типов, в зависимости от их роли в тестировании:

  1. Персонализированные данные для тестов Это фикстуры, которые создаются непосредственно перед тестом, чтобы предоставить ему необходимые данные. Например, фикстура может создать пользователя в базе данных или передать в тест данные о продукте.

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

  3. Базовые ресурсы К этим фикстурам можно отнести любые объекты или ресурсы, которые необходимо подготовить перед запуском тестов, например, соединения с базами данных, моки API или файлы.

Как работают Fixtures в Playwright

Использование fixtures в Playwright обычно связано с механизмом test.extend, который позволяет определить, какие данные или объекты будут доступны в рамках тестов.

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

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');
});

Здесь в качестве фикстуры используется объект page, предоставляемый Playwright, который создается автоматически перед каждым тестом.

Более сложные примеры могут включать использование кастомных фикстур для подготовки данных:

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

// Фикстура для создания пользователя
test('Создание и удаление пользователя', async ({ page }) => {
  // Создание пользователя через API или UI
  const newUser = await createUserAPI();
  
  // Перейти на страницу и выполнить действия с новым пользователем
  await page.goto('https://example.com/login');
  await page.fill('input[name="username"]', newUser.username);
  await page.fill('input[name="password"]', newUser.password);
  await page.click('button[type="submit"]');
  
  // Проверить успешный вход
  expect(await page.locator('h1').textContent()).toBe('Welcome');
  
  // Удаление пользователя после теста
  await deleteUserAPI(newUser.id);
});

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

Модификация Fixtures через test.extend

Playwright позволяет создавать более гибкие фикстуры с использованием test.extend. Это позволяет переопределить или добавить новые данные или объекты для тестов в пределах одного теста или группы тестов.

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

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

// Расширение фикстуры для добавления пользовательских данных
const customTest = test.extend({
  userData: async ({}, use) => {
    const user = await createTestUser();
    await use(user); // передаем пользователя в тест
    await deleteTestUser(user.id); // удаляем пользователя после теста
  }
});

customTest('Тест с использованием расширенной фикстуры', async ({ page, userData }) => {
  await page.goto('https://example.com');
  await page.fill('input[name="username"]', userData.username);
  await page.fill('input[name="password"]', userData.password);
  await page.click('button[type="submit"]');
  expect(await page.locator('h1').textContent()).toBe('Welcome');
});

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

Параллельное выполнение с фикстурами

Playwright позволяет выполнять тесты параллельно, что ускоряет процесс тестирования. При этом важно учитывать, что фикстуры, связанные с данными, должны быть правильно настроены для обеспечения изоляции между параллельными тестами. Например, для обеспечения изолированности сессий браузеров или пользователей можно использовать отдельные контексты браузера для каждого теста.

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

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

test('Тест с параллельным выполнением', async ({ browser }) => {
  const context = await browser.newContext();
  const page = await context.newPage();
  
  await page.goto('https://example.com');
  const title = await page.title();
  expect(title).toBe('Example Domain');
  
  await context.close();
});

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

Обработка ошибок и завершение фикстур

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

Пример завершения работы фикстуры с обработкой ошибок:

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

test('Тест с обработкой ошибок в фикстуре', async ({ page }) => {
  try {
    await page.goto('https://example.com');
    const title = await page.title();
    expect(title).toBe('Nonexistent Title'); // Искусственная ошибка
  } catch (error) {
    console.error('Ошибка при выполнении теста:', error);
  }
});

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

Заключение

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