Playwright предоставляет множество возможностей для взаимодействия с веб-приложениями, включая тестирование REST API. Интеграция с API необходима для тестирования бэкенд-логики, проверки работы с данными и реализации более сложных сценариев, когда нужно проверить взаимодействие с сервером без необходимости проходить через пользовательский интерфейс. Этот подход позволяет ускорить тестирование и повысить его точность.
Для начала необходимо установить Playwright и создать рабочее окружение. Для установки Playwright в проект используется стандартная команда npm:
npm install playwright
Далее нужно создать тестовый файл, например
apiTest.spec.js, который будет использоваться для работы с
API.
Playwright предоставляет API для взаимодействия с сервером через
объект APIRequestContext, который используется для
выполнения HTTP-запросов. Этот объект позволяет отправлять запросы
разных типов, таких как GET, POST,
PUT, DELETE и другие, а также настраивать
заголовки, параметры и тело запросов.
Создание APIRequestContext обычно выполняется в
контексте браузера или через команду request.newContext(),
которая создает отдельный контекст для отправки запросов.
Пример создания контекста и отправки запроса:
const { test, expect } = require('@playwright/test');
test('GET-запрос к REST API', async ({ request }) => {
const response = await request.get('https://jsonplaceholder.typicode.com/posts');
expect(response.status()).toBe(200);
const data = await response.json();
expect(data.length).toBeGreaterThan(0);
});
Этот пример показывает, как выполнить GET-запрос к публичному API и проверить, что ответ имеет статус 200 и содержит данные.
Для отправки данных на сервер используется метод post(),
который позволяет передать тело запроса в формате JSON. Также можно
настроить заголовки и параметры запроса для аутентификации или других
целей.
Пример POST-запроса:
test('POST-запрос к REST API', async ({ request }) => {
const response = await request.post('https://jsonplaceholder.typicode.com/posts', {
data: {
title: 'foo',
body: 'bar',
userId: 1
}
});
expect(response.status()).toBe(201);
const responseBody = await response.json();
expect(responseBody).toMatchObject({
title: 'foo',
body: 'bar',
userId: 1
});
});
В данном примере создается новый пост с помощью POST-запроса. В теле запроса отправляются данные, которые затем проверяются в ответе.
Если API требует аутентификации, например с использованием токенов
или сессий, Playwright позволяет настраивать заголовки запроса. Для
этого можно использовать объект APIRequestContext и
передавать в нем нужные данные, такие как токены или куки.
Пример отправки запроса с токеном авторизации:
test('GET-запрос с авторизацией', async ({ request }) => {
const response = await request.get('https://api.example.com/protected-resource', {
headers: {
'Authorization': 'Bearer your_token_here'
}
});
expect(response.status()).toBe(200);
const data = await response.json();
expect(data).toHaveProperty('protectedData');
});
В этом примере в заголовках запроса передается токен для авторизации, что позволяет получить доступ к защищенному ресурсу.
При тестировании API важно не только проверять статус ответа, но и
содержимое, которое возвращает сервер. Playwright предоставляет удобные
методы для работы с JSON-ответами, включая json(), который
парсит ответ в объект.
Пример проверки структуры ответа:
test('Проверка структуры ответа', async ({ request }) => {
const response = await request.get('https://jsonplaceholder.typicode.com/posts/1');
const data = await response.json();
expect(data).toHaveProperty('id');
expect(data).toHaveProperty('title');
expect(data).toHaveProperty('body');
});
Здесь проверяется, что в ответе содержатся ожидаемые поля, такие как
id, title и body.
При тестировании API необходимо обрабатывать возможные ошибки, такие как недоступность сервера или неправильный формат данных. Playwright позволяет настроить тайм-ауты и проверку ошибок для каждого запроса.
Пример с обработкой ошибок:
test('Обработка ошибок API', async ({ request }) => {
try {
const response = await request.get('https://jsonplaceholder.typicode.com/invalid-endpoint', {
timeout: 5000
});
if (response.status() !== 200) {
throw new Error(`API вернул ошибку: ${response.status()}`);
}
} catch (error) {
console.error('Ошибка при выполнении запроса:', error);
expect(error).toBeInstanceOf(Error);
}
});
В этом примере добавлен блок try-catch, который
перехватывает ошибки выполнения запроса, а также настроен тайм-аут для
каждого запроса.
Иногда необходимо интегрировать API с тестами на уровне базы данных. В этом случае Playwright может быть использован для тестирования API, а базу данных можно проверить через SQL-запросы или REST API для работы с данными.
Пример создания теста, который сначала отправляет запрос через API, а затем проверяет состояние базы данных:
test('Интеграционное тестирование API и базы данных', async ({ request }) => {
// Отправка данных через API
const response = await request.post('https://api.example.com/users', {
data: {
username: 'newuser',
email: 'newuser@example.com'
}
});
expect(response.status()).toBe(201);
// Проверка данных в базе данных
const dbResponse = await queryDatabase('SELECT * FROM users WHERE username = "newuser"');
expect(dbResponse.length).toBe(1);
expect(dbResponse[0].email).toBe('newuser@example.com');
});
В этом примере после отправки данных через API выполняется SQL-запрос для проверки данных в базе.
Для отладки тестов важно видеть, какие запросы были отправлены и какие ответы получены. Playwright предоставляет возможность логирования всех запросов и ответов, что позволяет легко отслеживать работу API и выявлять проблемы.
Пример логирования запросов и ответов:
test('Логирование запросов и ответов API', async ({ request }) => {
request.on('beforeRequest', (request) => {
console.log('Запрос:', request.url(), request.method(), request.headers());
});
request.on('response', (response) => {
console.log('Ответ:', response.url(), response.status(), response.headers());
});
await request.get('https://jsonplaceholder.typicode.com/posts');
});
В данном примере логируются все запросы и ответы, что помогает при отладке тестов.
Интеграция с REST API позволяет использовать Playwright в автоматических тестах в системах CI/CD. В таких системах важно правильно настроить окружение, чтобы тесты запускались на чистом состоянии сервера и с актуальными данными. Для этого можно использовать мокирование запросов или симуляцию данных.
Пример использования мокирования:
test('Мокирование API-запроса', async ({ page, request }) => {
await request.route('**/posts', route => route.fulfill({
status: 200,
body: JSON.stringify([{ id: 1, title: 'Mocked Title' }]),
headers: { 'Content-Type': 'application/json' }
}));
const response = await page.goto('https://jsonplaceholder.typicode.com/posts');
const body = await response.body();
expect(body).toContain('Mocked Title');
});
Здесь используется мокирование для замены реального API-запроса фиктивным ответом.
Playwright позволяет эффективно тестировать взаимодействие с REST API, обеспечивая гибкость при настройке запросов и проверке ответов. Работая с Playwright, можно интегрировать API-тесты с остальной частью автоматизированных тестов, что повышает надежность веб-приложений.