Как протестировать 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, поскольку это создает ненужные зависимости. Так что, если тест не пройден, внезапно будет сложнее выяснить причину.