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

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

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

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

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

2 ответа

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

  • манипулирование текстом: легко выполнять встроенные запросы GraphQL, читать их из (многократно используемых) файлов и заменять заполнители
  • Утверждения JsonPath: хотя ответы GraphQL являются JSON, они динамически изменяются в зависимости от запроса (без фиксированной схемы) и имеют тенденцию быть глубоко вложенными. Собственные утверждения JsonPath от Karate позволяют вам сосредоточиться только на нужных вам кусках, и вы можете выразить ожидаемые результаты в краткой форме 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, используется синтаксис Cucumber / Gherkin, который не зависит от языка, и вы можете легко добавлять тесты и отчеты каратэ в существующую настройку непрерывной интеграции. Программисты JavaScript будут особенно чувствовать себя как дома из-за того, как Каратэ встраивает среду выполнения JavaScript и поддерживает "снисходительный" JSON (нет необходимости в двойных кавычках, нет необходимости заключать ключи JSON в кавычки).

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

Вы можете просто использовать тест 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);
  });

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

Другие вопросы по тегам