В этой статье мы рассмотрим, как использовать Playwright для тестирования GraphQL API (Playwright может работать с любым API на основе HTTP, в том числе REST). Рассмотрим кейс с тестированием API GraphQL на сайте countries.trevorblades.com.
Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ
Содержание:
- Демо GraphQL API
- Тест-кейс
- Выполнение теста
- Добавление утверждений
- Фильтрация ответов API
- Непрерывный мониторинг с помощью Playwright и Checkly
- Заключение
Демо GraphQL API
В этом API вы можете запросить список стран вместе с их кодами и языками, а также настроить ответ, включая в него дополнительные поля, например код языка.
Это API GraphQL, который поддерживается в Playwright. GraphQL работает путем отправки POST-запроса с текстом в теле запроса. Напишем тест Playwright для этого API.
Тест-кейс
Для начала базовый тест в Playwright. Ниже приведен файл api.ts, описывающий тест-кейс, который проверяет, что GraphQL API возвращает ожидаемые данные, и кое-что еще.
// api.spec.ts
import { test, expect } from '@playwright/test';
test('the GraphQL API works', async ({ request }) => {
const response = await request.post('https://countries.trevorblades.com/', {
data: {
query: `
query {
countries {
code
languages {
code
}
}
}
`, // request the code for each country and language
},
});
const body = await response.json();
console.log(body); // This logs the API response
expect(body.data.countries).toHaveLength(250);
});
В этом тесте мы используем фикстуру вместо обычной фикстуры request page. (Документация на playwright.dev о различных типах фикстур). Использование request дает чистый новый контекст API без специальных заголовков. Мы отправляем основной запрос, протоколируем весь ответ, а затем проверяем длину ответа.
Выполнение теста
Когда вы запустите тест — npx playwright test, вы должны увидеть данные, возвращенные API, выведенные в терминале. Если все работает правильно, тест должен пройти.
При локальном запуске тестов может понадобиться разделять тесты API. Самый простой способ: сохранить тесты с другим названием и затем применить фильтр в команде test, например npx playwright test api.spec.ts.
Добавление утверждений
Раньше мы просто проверили, что ответ имеет правильную длину.
expect(body.data.countries).toHaveLength(250);
Чтобы убедиться в том, что утверждение работает, попробуем намеренно изменить тест, ожидая вместо 250 — 251 запись. Это должно вызвать сбой.
Сравним ответ с сохраненным JSON-файлом:
// api.spec.ts
const { test, expect } = require('@playwright/test');
import countryData from './response.json'
test('the GraphQL API works', async ({ request }) => {
const response = await request.post('https://countries.trevorblades.com/', {
data: {
query: `
query {
countries {
code
languages {
code
}
}
}
`,
},
});
const body = await response.json();
expect(body).toEqual(countryData);
});
Эта версия требует, чтобы вы предоставили JSON-файл с ожидаемым ответом (тот файл response.json, который импортируется вначале). Это не идеальный вариант, поэтому воспользуемся инструментом Playwright Snapshot, чтобы сделать начальный снепшот JSON и сравнить последующие запуски с этой начальной версией. Заменяем строку:
expect(body).toEqual(countryData)
на:
expect(JSON.stringify(allCountries)).toMatchSnapshot();
Теперь нам нужно запустить наш тест локально хотя бы один раз с флагом update-snapshots, и мы сохраним начальную версию JSON, чтобы сравнить ее позже: npx playwright test -update-snapshots. Самое приятное в этом подходе то, что нам не нужно возиться с файловой системой, а значит мы можем запускать этот тест на любой большой платформе вроде Checkly или Lambdatest без необходимости отправлять пример JSON или кодировать его в нашем тесте.
Фильтрация ответов API
Хотя мы можем распарсить JSON большого ответа, полученного в предыдущем тесте, лучше сделать узконаправленный тест с отфильтрованным запросом к API и изучить этот ответ.
// api.spec.ts
test('the GraphQL API works for one country', async ({ request }) => {
const germanyResponse = await request.post('https://countries.trevorblades.com/', {
data: {
query: `
query {
countries(filter: { code: { eq: "DE" } }) {
code
}
}
`,
},
});
const germany = await germanyResponse.json();
expect(germany.data.countries).toHaveLength(1);
expect(germany.data.countries[0].code).toBe('DE');
});
Этот тест проверяет отфильтрованный ответ.
Перевод статьи «Using Playwright to test APIs».

Пингбэк: Сквозное тестирование: начало работы с Playwright Сквозное тестирование: начало работы с Playwright QaRocks https://qarocks.ru/ Playwright Автоматизация