Тестирование GraphQL API

Бурно растущий спрос на современное программное обеспечение выдвигает на первый план важность поддерживаемого, функционального и масштабируемого кода. Для обеспечения независимой эволюции и отделения фронтенда от бэкенда необходимо проводить ручное и автоматизированное тестирование API как для протокола SOAP, так и для архитектурного стиля REST.

Amazon, Facebook, AirBnB, GitHub и многие другие крупные технологические компании используют GraphQL в качестве альтернативы традиционным REST и SOAP.

В этой статье мы рассмотрим, как работает GraphQL и как тестировать GraphQL API.

Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ

Содержание

Что такое GraphQL?

GraphQL появился как решение для более гибкого и настраиваемого способа получения сложных API-данных. В случае традиционной архитектуры REST большое количество запросов и конечных точек (endpoints) усложняет взаимодействие с API и приводит к избыточности данных.

По сути, GraphQL – это язык запросов и серверная среда для API, позволяющая клиентам запрашивать множество ресурсов по типам и полям.

Вот как выглядят запросы на REST и GraphQL на примере тест-кейса взаимодействия с постом на платформе социальных сетей:

REST: Множество конечных точек

Отрывок кода с 9 конечными точками в фигурных скобках

GraphQL: Единая конечная точка

Конечная точка getUser, содержащая все 9 конечных точек с первой картинки

Основная особенность 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

Katalon – это платформа для автоматизации тестирования, помогающая QA-командам планировать, разрабатывать, запускать и отлаживать автоматизированные тесты для интеграции API и пользовательского интерфейса. Кроме того, пользователям доступен режим сценариев для написания запросов и мутаций на языке Java/Groovy.

Тестирование Web API

Окно с телом ответа на запрос. Отображается статус 200.

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?».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *