Что такое GraphQL API
Что проверяют
Знаете ли вы, чем GraphQL отличается от REST именно для тестирования: другой транспорт, другие ошибки, другие риски. Следом обычно просят составить запрос и спрашивают, как вы проверите ответ, если HTTP-статус почти всегда 200.
Как отвечать
GraphQL это язык запросов к API и среда выполнения, которая их обслуживает. Его сделали в Facebook, открыли в 2015 году, сейчас спецификацию ведёт GraphQL Foundation. Основные понятия:
- схема: контракт на языке SDL, описывает типы, поля, аргументы и обязательность (
String!). Чего нет в схеме, того нельзя запросить; - операции:
queryдля чтения,mutationдля изменений,subscriptionдля потока событий, обычно поверх WebSocket; - одна точка входа: чаще всего
POST /graphql, а клиент сам перечисляет нужные поля. Нет лишних данных и нет пяти запросов ради одного экрана; - интроспекция: схему можно запросить у самого сервера, на этом работает автодополнение в GraphiQL, Apollo Sandbox, Postman и Insomnia.
Для тестировщика важнее всего формат ответа: {"data": ..., "errors": [...]}. При ошибке в резолвере статус обычно остаётся 200. Бывает частичный успех: часть полей заполнена, в остальных null и запись в errors. Проверка «статус 200, значит всё хорошо» здесь не работает.
Что включить в тест-план: обязательные и необязательные аргументы, null в non-null полях, права доступа на уровне отдельных полей, пагинацию, глубоко вложенные запросы и лимиты их сложности, выключенную на проде интроспекцию, если так решила команда, поведение полей с @deprecated.
Где спотыкаются
Проверяют только HTTP-статус. Реальные ошибки лежат в массиве errors, и автотест, который его не читает, пропустит сломанный резолвер.
Считают, что раз клиент выбирает поля, серверу всё равно. Запрос на десять уровней вложенности может положить сервис, и отсутствие лимита глубины это дефект, а не особенность.
Путают отсутствие версий с отсутствием ломающих изменений. Удалённое поле ломает клиентов так же, как в REST, поэтому его сначала помечают @deprecated, а сравнение схем между релизами стоит автоматизировать.