Бурно растущий спрос на современное программное обеспечение выдвигает на первый план важность поддерживаемого, функционального и масштабируемого кода. Для обеспечения независимой эволюции и отделения фронтенда от бэкенда необходимо проводить ручное и автоматизированное тестирование API как для протокола SOAP, так и для архитектурного стиля REST.
Amazon, Facebook, AirBnB, GitHub и многие другие крупные технологические компании используют GraphQL в качестве альтернативы традиционным REST и SOAP.
В этой статье мы рассмотрим, как работает GraphQL и как тестировать GraphQL API.
Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ
Содержание
- Что такое GraphQL?
- 4 простых способа вызова GraphQL API
- Что собой представляет тестирование GraphQL API?
- Важность тестирования GraphQL API
- Компоненты для тестирования GraphQL API
- Виды тестирования GraphQL API
- Лучшие практики тестирования GraphQL API
- Инструменты для тестирования на GraphQL
- Тестирование на GraphQL API в Katalon Studio
Что такое GraphQL?
GraphQL появился как решение для более гибкого и настраиваемого способа получения сложных API-данных. В случае традиционной архитектуры REST большое количество запросов и конечных точек (endpoints) усложняет взаимодействие с API и приводит к избыточности данных.
По сути, GraphQL – это язык запросов и серверная среда для API, позволяющая клиентам запрашивать множество ресурсов по типам и полям.
Вот как выглядят запросы на REST и GraphQL на примере тест-кейса взаимодействия с постом на платформе социальных сетей:
REST: Множество конечных точек
GraphQL: Единая конечная точка
Основная особенность GraphQL заключается в том, что вместо множества различных методов там имеется только два типа операций: мутации и запросы. Мутация GraphQL — это тип операции, которая позволяет клиенту изменять данные на сервере. С их помощью можно добавлять, удалять и обновлять данные. Для чтения данных в GraphQL используется операция типа запрос.
Приведем пример запроса и мутации GraphQL.
Запрос | Мутация |
---|---|
query { findAllBooks { id title isbn pageCount author { id firstName lastName } } } | mutation { deleteBook(id:3) } |
Основные преимущества GraphQL по сравнению с REST:
- Легче получать данные и управлять ими. Запрос и изменение данных выполняются с помощью одной конечной точки.
- Не нужна дополнительная документация API. Отдельная документация не потребуется, поскольку любые типы, поля и операции уже являются частью языка GraphQL.
- Использование параллельно с REST. Переход на новый язык требует постепенного внедрения. Встроенное версионирование, которое предлагает GraphQL, позволяет разработчикам вносить улучшения в текущие REST API, не нарушая работу существующих клиентов.
Все это делает GraphQL более быстрым в работе по сравнению с REST API, поскольку для получения данных не нужно совершать множества обращений к различным конечным точкам.
4 простых способа вызова GraphQL API
Использование клиентской библиотеки GraphQL
Клиентская библиотека обрабатывает запросы и ответы, а также обеспечивает удобный способ вызова GraphQL API. Примерами клиентских библиотек являются Apollo Client для JavaScript, Apollo Android для Android и graphql-java для Java.
Использование REST-клиента
GraphQL API можно вызвать и с помощью REST-клиента, например Postman или Insomnia. Для этого необходимо установить URL-адрес запроса на конечную точку GraphQL и указать GraphQL-запрос в теле запроса. Ответ будет получен в формате JSON, который можно разобрать и использовать в своем приложении.
Использование командной строки
Для выполнения HTTP-запросов к GraphQL API можно использовать инструменты командной строки, такие как Curl или HTTPie. Выполнять запросы и анализировать ответы можно прямо в среде командной строки.
Использование веб-инструмента
GraphiQL или GraphQL Playground предоставляют визуальный интерфейс для написания GraphQL-запросов. С помощью этих инструментов можно исследовать и тестировать GraphQL API, а также создавать и выполнять запросы.
Что собой представляет тестирование GraphQL API?
Тестирование GraphQL API проверяет корректность схем, запросов и мутаций, созданных для API. Для поддержания надежности и производительности API рекомендуется тестировать следующие аспекты:
- Запросы и мутации. Потоки, операции и процедуры API должны возвращать точные результаты и правильно сохраняться в базе данных (БД).
- Проверка схемы. Соответствуют ли поля, типы данных или вложенные объекты первоначально разработанной структуре? Несоответствие формата может привести к ошибкам в ответах API.
- Обработка ошибок. Возврат ответов с ошибками в случае некорректных запросов или мутаций, несанкционированного доступа или сбоев при проверке данных. В качестве примеров можно привести пустые или нулевые значения, а также очень длинные или очень короткие входные данные.
- Целостность данных. Обработка более сложных запросов и мутаций может сопровождаться повреждением данных и ошибками синхронизации.
- Производительность. Убедитесь, что время отклика и использование ресурсов (например, процессора, памяти и сети) находятся в пределах допустимых значений при динамических нагрузках от большого количества параллельных запросов или при увеличенных объемах данных.
Важность тестирования GraphQL API
Тестирование GraphQL API подразумевает написание тест-кейсов для запросов и мутаций. Рассмотрим структуру вложенных данных в ленте новостей Facebook:
- Лента новостей
- Таймлайн пользователя
- Посты
- Лайки и комментарии к постам
Подобно теневому DOM, взаимосвязанные данные могут постепенно становиться проблемой, тем более что для взаимодействия с традиционными REST API нужны несколько отдельных параметров запроса и конечных точек.
Компоненты тестирования GraphQL API
- Схема. Являясь основой GraphQL API, она определяет доступные типы данных, полей и операций. Тестирование схемы включает в себя проверку соответствия спецификации GraphQL и корректности работы со всеми запросами и мутациями.
- Запрос. Здесь проверяется, что на конкретный запрос с любыми связанными с ним параметрами генерируется корректный ответ. Тестирование запросов можно автоматизировать, используя библиотеки “request” и “supertest”.
- Мутации. Очень важно тестировать мутации, так как они позволяют проверить возможность взаимодействия с базой данных. Мутации изменяют данные в БД на стороне сервера и возвращают результат.
- Resolvers. Resolvers – это функции, которые генерируют ответы на GraphQL-запросы. Они отвечают за получение данных и возвращают их в правильном формате. Поскольку Resolvers собирают информацию из схем, важно тестировать их на ранних этапах, чтобы в дальнейшем избежать дорогостоящих ошибок.
Основные отличия тестирования на GraphQL от REST:
- Тестирование на основе запросов. В запросе указывается только одна конечная точка, что упрощает взаимодействие с ресурсами.
- Получение данных и обработка ответов. Поскольку клиент может указывать требования к данным, при проверке анализируются данные из ответа и структура конкретного запроса.
- Сложность вложенных запросов. Многоуровневые вложенные запросы могут неконтролируемо потреблять ресурсы, что зачастую приводит к избыточному или недостаточному получению данных.
- Обработка ошибок. В GraphQL имеется отдельное поле для ошибок в теле ответа вместо кодов состояния HTTP и сообщений.
Виды тестирования GraphQL API
Существует несколько обязательных проверок:
- Функциональное тестирование. Тестирование конкретных функций, чтобы убедиться, что результаты работы API соответствуют ожиданиям. Например, в тест-кейсе для функции входа в систему API можно проверить, что пользователь успешно входит в систему с действительными учетными данными и получает отказ при вводе недействительных данных.
- Тестирование безопасности. Эта практика позволяет защитить GraphQL API от таких угроз безопасности, как инъекционные атаки, утечка информации и несогласованная авторизация. Тестирование безопасности также включает проверку методик шифрования и дизайна контроля доступа к API.
- Нагрузочное тестирование. Целью данного тестирования является проверка работы API при большом количестве запросов. В ходе нагрузочного тестирования оценивается, способен ли API выдержать пользовательский трафик в различных условиях, таких как пиковая нагрузка, неожиданные скачки и длительное использование.
- Валидационное тестирование. Проверяет удобство использования API, транзакционное поведение и операционную эффективность. Валидационное тестирование обычно проводится на заключительном этапе разработки как проверка работоспособности API в целом.
Эти тесты могут быть организованы в соответствии с моделью пирамиды тестирования, которая определяет различные уровни:
Снизу вверх:
- Юнит-тестирование. Тестирование отдельных блоков или компонентов API в изоляции. В контексте GraphQL модульные тесты используются для тестирования отдельных Resolvers и полей в схеме.
- Интеграционное тестирование. Проверяет взаимодействие между API и пользовательским интерфейсом (UI).
- Сквозное тестирование. Воспроизводит последовательность запросов и ответов между клиентом и сервером. В случае GraphQL API они используются для проверки всего жизненного цикла – от схем до Resolvers и запросов.
Лучшие практики тестирования GraphQL API
Приоритетность общих сценариев
Динамичность языка GraphQL способствует получению данных, управляемых клиентом, но при этом возникают трудности с охватом всех возможных сценариев тестирования. Поэтому рекомендуется начинать со сценариев с репрезентативными запросами, максимально приближенными к реальному пользовательскому опыту. Например, для сайта электронной коммерции приоритетными являются API для аутентификации, поиска товаров, добавления их в корзину и оформления заказа.
Тщательный подбор тестовых данных
Тестирование GraphQL может вызывать трудности, поскольку один запрос обращается сразу ко множеству уровней вложенных данных. Учитывая пакетность данных и зависимости между полями, важно убедиться, что выбранные тестовые данные охватывают различные комбинации вложенных и пакетных запросов для тщательной проверки поведения API.
Использование mock-данных
При тестировании GraphQL API, опирающихся на внешние веб-сервисы, рекомендуется имитировать ответы. Этот подход обеспечивает выполнение тестов без воздействия на продакшн-среду и позволяет запускать их неоднократно без лишних затрат и задержек.
Инструменты для тестирования GraphQL API
Пока еще не все инструменты или библиотеки для тестирования API поддерживают синтаксис GraphQL. Ниже представлены те фреймворки, с помощью которых можно создавать запросы и тестировать API на GraphQL.
EasyGraphQL
EasyGraphQL – это JavaScript-библиотека для GraphQL API. С помощью EasyGraphQL вы можете:
- Создавать схемы с использованием объектов или классов.
- Создавать запросы и мутации с динамическими переменными, аргументами и полями.
- Генерировать документацию в форматах Markdown, HTML или JSON.
- Импортировать библиотеки Jest или Mocha для написания и запуска автоматизированных тестов.
Ниже приведен пример утверждения EasyGraphQL:
Платформа Katalon
Katalon – это платформа для автоматизации тестирования, помогающая QA-командам планировать, разрабатывать, запускать и отлаживать автоматизированные тесты для интеграции API и пользовательского интерфейса. Кроме того, пользователям доступен режим сценариев для написания запросов и мутаций на языке Java/Groovy.
Тестирование Web API
Katalon обеспечивает надежную поддержку тестирования API, включая возможность тестирования GraphQL, REST и SOAP API. Интеграция с такими GraphQL-инструментами, как Postman, Swagger и SoapUI, позволяет импортировать существующие спецификации и тестировать новые и старые схемы API на одной платформе.
Интеграционное тестирование UI
Веб-элементы, такие как выпадающие окна, поля ввода или кнопки, организуются в репозитории объектов. Это позволяет обновлять локаторы и свойства глобально, во всех тестовых случаях.
Доступна также библиотека ключевых слов и тестовый рекордер для удобного создания автоматизированных тестов.
Data-driven тестирование
Katalon позволяет автоматизировать API-тесты с различными сценариями работы благодаря поддержке различных форматов данных (CSV, Excel) и баз данных (MySQL, Oracle, SQL Server). Тестировщики могут определять переменные в тестовых сценариях, объектах или атрибутах запросов и привязывать их к соответствующим полям из внешних источников.
Планирование, выполнение и анализ
Katalon обладает всеми встроенными функциями для автоматизации сквозного тестирования: написание тестов с использованием low-code или full-code методов, выполнение тестов в режиме командной строки в различных средах, получение наглядной информации о ходе тестирования из комплексных отчетов.
Автоматическое выполнение в CI (непрерывная интеграция)
Интеграция Katalon с такими инструментами, как Circle CI, Jenkins и GitLab, позволяет автоматизировать запуск тест-кейсов в рамках практик CI/CD. Подключение UI- и API-тестов для автоматического запуска обеспечивает выявление и решение проблем с интеграцией на ранних этапах разработки.
Rest Assured
Rest Assured – это библиотека на Java, обычно используемая для тестирования REST API. Однако ее можно использовать и для тестирования GraphQL API. Для этого:
- Сначала преобразуйте GraphQL-запрос в строковый JSON-формат.
- Затем передайте преобразованную строку в теле запроса.
- Проверьте ответ.
Karate
Karate – это фреймворк для тестирования GraphQL API. Он поддерживает формат JSON и позволяет легко включать переменные в запросы. Вы можете передавать GraphQL-запрос как есть и проверять ответ с помощью утверждений сопоставления, встроенных в Karate.
Postman
С помощью Postman можно быстро создавать и отправлять GraphQL-запросы, в том числе с переменными. Кроме того, запросы можно объединять в коллекции для управления и одновременного запуска нескольких тестов. Postman располагает удобным интерфейсом для изучения и тестирования GraphQL API, а также позволяет легко просматривать и анализировать ответы.
Тестирование GraphQL API в Katalon Studio
Наиболее распространенными типами операций GraphQL являются запросы и мутации. Если сопоставить их с моделью CRUD (create – создавать, read – читать, update – редактировать, delete – удалять), то запросы GraphQL схожи с методом GET, что соответствует операции read, а мутации используются для создания, редактирования или удаления данных на сервере, то есть create, update и delete.
Создание теста GraphQL с использованием запросов или мутаций
Важно проводить тестирование запросов и мутаций, так как это связано с управлением данными в БД. С помощью мутаций можно редактировать и управлять данными с серверной стороны. Для создания теста GraphQL достаточно вставить запрос в параметр метода GET. Тестирование мутаций GraphQL поддерживает только метод POST.
Использование переменных в запросах GraphQL
- В тест-кейс можно добавить GraphQL-запрос. Katalon Studio сгенерирует скрипт, содержащий метод отправки запроса с картой переменных. Ниже приведен пример скрипта:
- Далее нужно перейти во вкладку HTTP Body и выбрать тип GraphQL.
- В текстовое поле Query вставить GraphQL-запрос с заданными переменными.
- В текстовое поле Query Variables вставить значения переменных.
- Затем перейти на вкладку Variables и определить имя переменной, ее тип и значение по умолчанию.
Валидация запросов и ответов GraphQL по схемам
Поскольку ответы в GraphQL представлены в формате JSON, анализировать их можно тоже по схеме JSON, что позволяет устранять ошибки без использования HAR-файла.
Также, чтобы убедиться в правильности запроса перед отправкой на сервер, можно проверить его тело на соответствие схеме GraphQL. Сервер проводит верификацию, результаты которой отображаются во вкладке Log Viewer.
Оба подхода, как GraphQL, так и REST, имеют свои преимущества в зависимости от потребностей проекта.
GraphQL лучше подходит для тех случаев, когда клиенту необходим максимальный контроль над данными, получаемыми с сервера. Он также упрощает сбор данных из разных API и их передачу клиенту в одном запросе.
В свою очередь, REST API лучше использовать для проектов с более простыми структурами данных. Также, поскольку REST API предоставляет множество конечных точек (endpoints), в нем легче настроить кэширование.
Перевод статьи «What is GraphQL Testing? How To Test GraphQL APIs?».