Playwright предоставляет мощный инструментарий для автоматизации тестирования веб-приложений. Одной из важных задач при тестировании является экономия времени и ресурсов, а также создание более стабильных и быстрых тестов. Одним из способов достичь этого является переиспользование сессий между тестами.
Каждый тест, который запускается в Playwright, по умолчанию создает новый браузерный контекст, что приводит к излишней нагрузке на систему. Создание новых контекстов и запуск их с нуля для каждого теста может занять значительное время, особенно если нужно эмулировать сложные сценарии с множеством действий на странице. В случае использования общей сессии можно избежать этой задержки и ускорить тестовый процесс.
Кроме того, повторная авторизация, настройка состояния приложения или загрузка данных для каждого теста может привести к излишним накладным расходам. Переиспользование сессий помогает решить эту проблему.
В Playwright можно создавать несколько контекстов в одном браузере. Каждый контекст изолирован, но при этом все контексты используют один и тот же браузерный процесс, что позволяет экономить ресурсы.
Контекст браузера в Playwright — это своего рода изолированное окружение, которое может хранить куки, локальное хранилище и другие данные сессии. Для того чтобы использовать один и тот же контекст между тестами, нужно создать его один раз и использовать повторно.
Пример создания контекста:
const { chromium } = require('playwright');
let browser;
let context;
beforeAll(async () => {
browser = await chromium.launch();
context = await browser.newContext(); // создаём новый контекст
});
afterAll(async () => {
await browser.close();
});
В этом примере создается браузер, а затем в нем создается контекст,
который будет использоваться в тестах. Важно, что создание контекста
выполняется только один раз в функции beforeAll, а не для
каждого теста.
Чтобы переиспользовать контекст между несколькими тестами, можно создавать новый браузерный контекст в одном тесте, выполнять нужные действия, а затем использовать этот же контекст в других тестах.
describe('Тестирование сессии', () => {
let context;
beforeAll(async () => {
const browser = await chromium.launch();
context = await browser.newContext();
});
test('Авторизация пользователя', async () => {
const page = await context.newPage();
await page.goto('https://example.com/login');
await page.fill('input[name="username"]', 'user');
await page.fill('input[name="password"]', 'password');
await page.click('button[type="submit"]');
// Дополнительные проверки
});
test('Проверка доступа после авторизации', async () => {
const page = await context.newPage();
await page.goto('https://example.com/profile');
// Проверка, что пользователь авторизован
});
});
Здесь контекст создается один раз в функции beforeAll, и
используется в обоих тестах. Это значительно сокращает время выполнения
тестов, поскольку авторизация выполняется только один раз.
Одним из способов переиспользования сессий является использование механизма сохранения и загрузки состояния браузера. Playwright предоставляет методы для сохранения состояния контекста, включая куки и данные локального хранилища.
Сохранение состояния позволяет сохранить авторизованную сессию и использовать ее в последующих тестах.
beforeAll(async () => {
const browser = await chromium.launch();
context = await browser.newContext();
// Авторизация
const page = await context.newPage();
await page.goto('https://example.com/login');
await page.fill('input[name="username"]', 'user');
await page.fill('input[name="password"]', 'password');
await page.click('button[type="submit"]');
// Сохранение состояния (куки и локальное хранилище)
await context.storageState({ path: 'state.json' });
});
Загрузка состояния позволяет использовать ранее сохраненные данные сессии, что позволяет избежать повторной авторизации и других действий, которые занимают время.
beforeAll(async () => {
const browser = await chromium.launch();
context = await browser.newContext({
storageState: 'state.json' // загружаем сохраненное состояние
});
});
Таким образом, при запуске тестов состояние сессии будет загружено, и все действия, связанные с авторизацией, будут пропущены.
В некоторых случаях может быть необходимо использовать несколько контекстов для разных пользователей или для тестирования с разных устройств. В таких случаях можно запускать несколько контекстов в одном браузере.
describe('Тестирование с несколькими пользователями', () => {
let context1, context2;
beforeAll(async () => {
const browser = await chromium.launch();
context1 = await browser.newContext();
context2 = await browser.newContext();
});
test('Авторизация первого пользователя', async () => {
const page = await context1.newPage();
await page.goto('https://example.com/login');
await page.fill('input[name="username"]', 'user1');
await page.fill('input[name="password"]', 'password1');
await page.click('button[type="submit"]');
});
test('Авторизация второго пользователя', async () => {
const page = await context2.newPage();
await page.goto('https://example.com/login');
await page.fill('input[name="username"]', 'user2');
await page.fill('input[name="password"]', 'password2');
await page.click('button[type="submit"]');
});
});
Здесь создаются два контекста, каждый из которых используется для тестирования с разными пользователями. Это позволяет эмулировать взаимодействие двух пользователей с системой одновременно.
Изменение состояния в одном контексте — при
использовании одного контекста для нескольких тестов важно помнить, что
изменение состояния в одном тесте может повлиять на другие тесты.
Например, если в одном тесте происходит выход из системы, это может
вызвать ошибку в других тестах, где ожидается, что пользователь остается
авторизованным. Для решения этой проблемы можно изолировать тесты,
используя разные контексты или восстанавливая состояние в
beforeEach.
Конкуренция за ресурсы — при работе с несколькими контекстами нужно следить за тем, чтобы они не конкурировали за одни и те же ресурсы, такие как сессии или данные. В таких случаях стоит использовать разные браузерные контексты или даже запускать тесты в параллельных потоках с использованием соответствующих библиотек.
Хранение состояния — сохранение состояния между тестами может быть проблематичным, если структура данных, связанных с сессией, изменяется. Например, если приложение изменяет формат хранения данных в куки или локальном хранилище, то старые файлы состояния могут вызвать ошибки.
Переиспользование сессий и контекстов между тестами — мощный способ оптимизации тестового процесса. Он позволяет существенно сократить время выполнения тестов, избежать избыточных действий, таких как авторизация, и улучшить стабильность тестов. Важно учитывать особенности работы с состоянием и тщательно подходить к изоляции тестов, чтобы избежать взаимного влияния между ними.