В автоматизированном тестировании использование фикстур играет важную роль, позволяя организовывать и управлять состоянием перед выполнением тестов и после них. В 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 поддерживает несколько типов фикстур, которые могут использоваться в зависимости от объема и области применения.
Локальная фикстура применима только к конкретному тесту или группе тестов. Эти фикстуры выполняются перед запуском теста и очищаются после его завершения. Они могут быть использованы для подготовки состояния, необходимого только для конкретного теста.
Пример:
import { test } from '@playwright/test';
test('тест с локальной фикстурой', async ({ page }) => {
// Пример локальной фикстуры, создание элемента на странице
await page.goto('https://example.com');
const title = await page.title();
expect(title).toBe('Example Domain');
});
Глобальные фикстуры выполняются один раз для всей сессии тестирования, на уровне всего тестового набора. Их удобно использовать для настройки, которая должна быть выполнена перед запуском всех тестов, например, для инициализации базы данных или запуска серверов.
Пример глобальной фикстуры:
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');
});
});
Фикстуры могут принимать параметры, позволяя создать несколько вариантов конфигураций для одного теста. Это полезно, когда необходимо протестировать несколько вариантов данных или сценариев, используя одну и ту же структуру теста.
Пример фикстуры с параметрами:
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);
});
Фикстуры могут быть асинхронными, что позволяет выполнять операции, такие как запросы к базе данных или ожидание ответа от внешних сервисов. 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 предоставляет гибкие механизмы для работы с фикстурами, что делает тестирование более эффективным и удобным.