Как тестировать GraphQL API

Автор: Ольга Ипполитова, Practice Principal Lineate
Несколько месяцев назад я присоединилась к проекту и неожиданно обнаружила, что работаю не только с REST API, но и с GraphQL API.

Это было мое первое знакомство с GraphQL. Я понятия не имела, что он собой представляет, в чем его особенности, а самое главное, не знала, как его тестировать.

Ниже я расскажу, что делала я, с чего можно начать и как научиться тестировать GraphQL API. Вполне вероятно, что это поможет и вам разобраться в данном вопросе.

Шаг первый — основы GraphQL
Шаг первый — основы GraphQL

Итак, прежде чем вы приступите к тестированию, вам надо разобраться с основами GraphQL:

  • Определение GraphQL:

    • GraphQL — это язык запросов для API и среда выполнения для этих запросов на стороне сервера.

  • Workflow GraphQL:

    • мы запрашиваем данные с клиента на сервер, используя декларативный синтаксис → GraphQL генерирует payload с ответом в виде JSON → сервер отправляет payload обратно клиенту.

  • Концепция GraphQL и его основные термины:

    • Schema, types, query, mutation, resolvers, subscriptions — было бы здорово разобраться во всем этом.

  • GraphQL vs REST:

    • как тестировщиков, нас будет больше всего интересовать получение данных (data fetching) и то, как оно работает.

      • GraphQL позволяет клиенту точно указать одним запросом, какие данные ему нужны, при этом никакая дополнительная информация не извлекается;

      • REST API, как правило, должен вызывать несколько эндпоинтов, чтобы получить то, что нужно.

    • Помимо data fetching, стоит обратить внимание на такие особенности GraphQL, как:

      • виды операций

      • типы данных

      • версионирование

      • производительность.

Все это можно найти и подробно изучить в официальной документации Introduction to GraphQL.

Для начала этого материала вам будет достаточно.


Разобравшись с основами, вы можете переходить к тестированию.

Здесь я предлагаю ознакомиться с тем, как именно я работала на проекте, и заодно узнать дополнительную информацию.Karate - это легкий в освоении и удобный в использовании фреймворк, использующий синтаксис BDD. Отлично подходит для тестирования GraphQL API, поскольку у него есть такие возможности, как встроенный
text-manipulation и JsonPath.
Шаг второй. Тестирование GraphQL
Краткая инструкция по тестированию GraphQL API
Познакомиться со схемой GraphQL и документацией по API вашего проекта.

Схема GraphQL — это описание данных, которые клиент может запросить у GraphQL API. Схема также определяет queries и mutations, которые клиент может использовать для чтения и записи данных с сервера GraphQL.

Обычно API-интерфейсы документируются с помощью инструментов, предоставляемых самим сервером GraphQL. В нем описаны схемы, запросы и их типы, поля.

Мы использовали в проекте GraphQL Playground. С его помощью можно изучать документацию по API, в нем есть визуальное дерево документов, в котором можно искать информацию по нужному query или mutation.
Научиться использовать основные инструменты для выполнения запросов.

Обычно для этой цели используют тот же GraphQL Playground или аналогичные IDE (GraphiQL, Insomnia и другие). Интерфейс этих инструментов прост и понятен. Они позволяют работать с API: составлять запросы, вызывать их и смотреть ответ.

GraphQL Playground имеет те же удобные функции, что и другие IDE, например, автозаполнение и всплывающие подсказки. Это очень помогает при составлении запроса.

Если вам нужно всего один раз проверить ответ на запрос, то этого инструмента будет достаточно. Главное, не забыть указать при запросе необходимые Headers и значения всех обязательных полей.
Научиться составлять запросы.

Здесь вам будет полезно понимание анатомии типичного запроса GraphQL.

Разобраться в особенностях GraphQL и учитывать их при тестировании.

Особенности GraphQL следующие:

  • один эндпоинт с разной начинкой;

  • статус всегда равен 200 Ok, поэтому смотрите на сообщения об ошибках, а не на статус;

  • тип запроса всегда POST;

  • если проводите аналогию с CRUD (Create, Read, Update, Delete), то query будет R, а mutations — CUD;

  • существует много возможных комбинаций запроса. Поэтому (в зависимости от бизнес-потребностей и специфики приложения) вы можете проверять только те запросы, которые будет выполнять пользователь.

Выбрать инструмент для ручного тестирования

  • Только теперь вы можете перейти к выбору инструментов, которые помогут нам в тестировании, сделают его быстрее и проще.

    В дополнение к GraphQL IDE для выполнения запросов, о которых я уже упоминала выше, мне понравилось использовать Postman. В новых его версиях есть все необходимое для тестирования не только REST, но и GraphQL.

    Вот несколько интересных фич, которые есть в Postman:

    • отправка запросов GraphQL в теле запроса как POST;

    • поддержка переменных GraphQL;

    • возможность импортировать schema GraphQL и генерировать через нее все запросы;

    • автозаполнение в редакторе GraphQL query.

    Дополнительные сведения об этих функциях можно прочитать в документации по Postman.
Выбрать инструмент для автоматизации тестирования

Выше я уже писала, что API-интерфейсы GraphQL вызываются так же, как REST, но вам надо передать query или mutation как тела запроса POST. Так что подходящих инструментов довольно много и вы можете выбрать любой на свой вкус. В нашем проекте мы выбирали из инструментов для Java. Пробовали такие варианты, как Karate и Rest Assured. Оба эти варианта можно использовать для тестирования GraphQL API, ниже немного расскажу о них. Karate.

Karate - это легкий в освоении и удобный в использовании фреймворк, использующий синтаксис BDD. Отлично подходит для тестирования GraphQL API, поскольку у него есть такие возможности, как встроенный text-manipulation и JsonPath. Пример: Feature: get user name Background: * url 'https://testapi.com/graphql' Scenario: graphql get user Given path '/' Given text query = """ query { user{ id, name } } """ And request {query: #(query)} When method POST Then match response == "#object" Then match response.data.user[0].name == "Test User"

Karate - это легкий в освоении и удобный в использовании фреймворк, использующий синтаксис BDD. Отлично подходит для тестирования GraphQL API, поскольку у него есть такие возможности, как встроенный
text-manipulation и JsonPath.
Karate
Rest Assured
Rest Assured - это популярный фреймворк для автоматизации API на Java с широким сообществом автоматизаторов. И хотя он предназначен для тестирования REST API, его также можно использовать и для GraphQL. Единственное — следует иметь в виду, что payload запроса хоть и очень похож на JSON, но все же им не является.

Ниже представлена простая реализация, в которой запрос GraphQL был преобразован в строковый JSON формат.

Заключение


Ну вот и все! У вас есть рабочий код для простого теста. Все оказалось не так сложно, как казалось на первый взгляд, правда же?

Итак, вопрос: Как же тестировать GraphQL API?

Ответ: Практически так же, как и REST API, с использованием тех же инструментов и основных подходов. Главное — знать особенности и учитывать их.