GraphQL становится всё более популярным выбором для API, благодаря своей гибкости и возможности запрашивать только необходимые данные. В контексте тестирования, интеграция GraphQL запросов в автоматизированные тесты с помощью Playwright открывает новые возможности для более детализированного взаимодействия с веб-приложением. Задача тестирования GraphQL запросов состоит не только в том, чтобы проверить правильность их выполнения, но и в том, чтобы удостовериться в корректности ответа и обеспечении нужной функциональности.
GraphQL — это язык запросов, который позволяет клиенту точно указывать, какие данные ему нужны, минимизируя избыточность в запросах и ответах. В отличие от REST, где каждый запрос возвращает фиксированный набор данных, в GraphQL можно запрашивать только те поля, которые необходимы.
GraphQL запрос обычно состоит из трех частей:
Пример запроса:
query GetUser($id: ID!) {
user(id: $id) {
name
email
}
}
Этот запрос запрашивает данные о пользователе, включая его имя и email, передавая в качестве переменной идентификатор пользователя.
Playwright — это инструмент для автоматизированного тестирования веб-приложений, который позволяет легко работать с веб-страницами, элементами и запросами. Одной из возможностей Playwright является выполнение HTTP-запросов непосредственно через его API, что дает возможность взаимодействовать с сервером, минуя веб-интерфейс.
Для работы с GraphQL запросами в Playwright используется метод
page.request или browserContext.request, с
помощью которых можно отправить POST-запросы с необходимыми данными.
Метод request позволяет работать с HTTP запросами напрямую,
что идеально подходит для взаимодействия с API, включая GraphQL.
Пример выполнения GraphQL запроса в Playwright:
const { test, expect } = require('@playwright/test');
test('GraphQL запрос в тестах Playwright', async ({ page }) => {
// Определение GraphQL запроса
const query = `
query GetUser($id: ID!) {
user(id: $id) {
name
email
}
}
`;
// Отправка запроса через HTTP
const response = await page.request.post('https://your-api-endpoint/graphql', {
data: {
query,
variables: { id: '123' }
}
});
// Проверка ответа
const responseBody = await response.json();
expect(responseBody.data.user.name).toBe('John Doe');
expect(responseBody.data.user.email).toBe('john.doe@example.com');
});
GraphQL сам по себе предоставляет отличные механизмы для обработки
ошибок. Ответ на запрос может содержать поле errors, в
котором будет описана информация о возникших ошибках. Поэтому важно не
только проверять успешность выполнения запроса, но и проверять наличие
ошибок в ответе.
Пример обработки ошибок:
test('Ошибка в GraphQL запросе', async ({ page }) => {
const query = `
query GetUser($id: ID!) {
user(id: $id) {
name
email
}
}
`;
const response = await page.request.post('https://your-api-endpoint/graphql', {
data: {
query,
variables: { id: 'invalid-id' }
}
});
const responseBody = await response.json();
expect(responseBody.errors).toBeDefined();
expect(responseBody.errors[0].message).toBe('User not found');
});
В некоторых случаях для изоляции тестов от реального API необходимо использовать мокирование GraphQL запросов. Playwright предоставляет удобные механизмы для перехвата и модификации сетевых запросов, что позволяет заменить реальный ответ на заранее подготовленный.
Пример мокирования GraphQL запроса:
test('Мокирование GraphQL запроса', async ({ page }) => {
// Мокируем запрос на получение пользователя
await page.route('**/graphql', (route) => {
route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({
data: {
user: {
name: 'Mocked User',
email: 'mocked.user@example.com'
}
}
})
});
});
// Запускаем тест, который будет использовать мокированный ответ
const response = await page.request.post('https://your-api-endpoint/graphql', {
data: {
query: `
query GetUser($id: ID!) {
user(id: $id) {
name
email
}
}
`,
variables: { id: '123' }
}
});
const responseBody = await response.json();
expect(responseBody.data.user.name).toBe('Mocked User');
expect(responseBody.data.user.email).toBe('mocked.user@example.com');
});
Когда тестирование GraphQL запросов требуется не только для проверки корректности, но и для оценки производительности, Playwright предоставляет инструменты для измерения времени выполнения запросов. Это позволяет анализировать, насколько быстро API обрабатывает запросы и выполнять нагрузочное тестирование.
Пример измерения времени выполнения запроса:
test('Тестирование времени выполнения GraphQL запроса', async ({ page }) => {
const query = `
query GetUser($id: ID!) {
user(id: $id) {
name
email
}
}
`;
const startTime = Date.now();
await page.request.post('https://your-api-endpoint/graphql', {
data: {
query,
variables: { id: '123' }
}
});
const endTime = Date.now();
const duration = endTime - startTime;
expect(duration).toBeLessThan(2000); // запрос должен выполняться менее 2 секунд
});
Playwright может быть использован вместе с другими инструментами для тестирования, такими как Jest или Mocha. В этих случаях можно интегрировать тесты GraphQL с другими сценариями, например, проверка UI, которая зависит от данных, полученных через GraphQL запросы.
Пример интеграции с Jest:
const { test, expect } = require('@jest/globals');
test('Проверка данных с помощью GraphQL', async () => {
const query = `
query GetUser($id: ID!) {
user(id: $id) {
name
email
}
}
`;
const response = await fetch('https://your-api-endpoint/graphql', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
query,
variables: { id: '123' }
})
});
const responseBody = await response.json();
expect(responseBody.data.user.name).toBe('John Doe');
expect(responseBody.data.user.email).toBe('john.doe@example.com');
});
Интеграция GraphQL запросов в тестирование с помощью Playwright предоставляет мощные возможности для тестирования взаимодействия с API. Возможности моки, перехвата и измерения времени отклика делают Playwright идеальным инструментом для комплексных сценариев тестирования. Такие подходы позволяют не только проверять корректность работы API, но и оценивать производительность, а также изолировать тесты от реальных сервисов, ускоряя процесс тестирования.