Как проверить API GraphQl?

Мне нужно написать функциональный набор тестов (который будет проверять API GraphQl). Набор тестов будет находиться в отдельном репо и контейнере API.

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

Я рассматривал возможность использования Cucumber.js в качестве основы BDD. Я знаю, что есть npm test. Я не уверен, как я буду выполнять тесты. Таким образом, кажется немного неудобным использовать инфраструктуру модульного тестирования. Имеет ли смысл этот подход?

Какой инструмент существует, чтобы сделать что-то вроде этого? Я открыт для изучения различных языков и инструментов.

Ответ 1

Karate - это относительно новая платформа автоматизации тестирования веб-сервисов, которая хорошо подходит для тестирования ответов GraphQL из-за двух специфических возможностей.

  • манипулирование текстом: легко выполнять встроенные запросы GraphQL, читать их из (повторно используемых) файлов и заменять заполнители
  • Утверждения JsonPath: хотя ответы GraphQL являются JSON, они изменяются динамически в зависимости от запроса (без фиксированной схемы) и имеют тенденцию быть глубоко вложенными. Собственные утверждения JsonPath по каратэ позволяют сосредоточиться только на нужных вам кусках, а также вы можете выразить ожидаемые результаты в краткой форме JSON, которая очень удобочитаема.

Вот хороший пример: graphql.feature с фрагментом ниже:

# you can also read this query from a file
Given text query =
"""
{
  pokemon(name: "Pikachu") {
    id
    number
    name
    attacks {
      special {
        name
        type
        damage
      }
    }
  }
}
"""
And request { query: '#(query)' }
When method post
Then status 200

# json-path makes it easy to focus only on the parts you are interested in
# which is especially useful for graph-ql as responses tend to be heavily nested
* match $.data.pokemon.number == '025'

# the '..' wildcard is useful for traversing deeply nested parts of the json
* def attacks = get[0] response..special
* match attacks contains { name: 'Thunderbolt', type: 'Electric', damage: 55 }

Для не-Java команд Карате предоставляет двоичный исполняемый файл, который требует только JRE, а кода Visual Studio достаточно в качестве IDE. Программисты JavaScript будут особенно чувствовать себя как дома из-за того, как Каратэ встраивает среду выполнения JavaScript и поддерживает "мягкий" JSON (нет необходимости в двойных кавычках, нет необходимости заключать ключи JSON в кавычки).

РЕДАКТИРОВАТЬ: здесь 10-минутное видео молниеносного разговора с демонстрациями, которые объясняют это.

Отказ от ответственности: Dev здесь.

Ответ 2

Вы можете просто использовать npm-тест с любым приглашенным тестировщиком. Я использую Мокку и Чай. Jest может быть немного лучше, так как я считаю его, вероятно, самым передовым набором тестов. Вы просто создали тесты, как и любые конечные точки.

      it('should be null when user is not logged in', async () => {
        const query = `
          query {
            user(id: "") {
              username
              email
            }
          }
        `

    const rootValue = {};
    const context = {};

    const result = await graphql(schema, query, rootValue, context);
    const { data } = result;

    expect(data.user).to.equal(null);
  });

довольно простой способ проверить его. Вы также запускаете инструкцию перед вставкой соответствующего пользователя в свой db. Проблема с сохранением отдельного набора тестов - вам нужно получить доступ к db напрямую. Ваши тесты не должны полагаться на другие вызовы API, поскольку это создает ненужные зависимости. Поэтому, если тест прерывается, внезапно первопричина сложнее понять.