Недавно один из моих друзей спросил меня, как мы можем протестировать API GraphQL на Java. В настоящее время он изучает возможности Каратэ
, однако он не хочет использовать Каратэ
только для этого, поскольку они уже используют Тестирование
основанный фреймворк. И есть graphql-java библиотека, которая позволяет вам реализовать GraphQL
в Java и тестировании, но с использованием Spring Boot. Моя главная цель – не вводить Spring Boot только ради тестирования GraphQL
API. Я хотел, чтобы все было просто!
Цели были:
- Не следует приводить к различным зависимостям (в настоящее время эта библиотека зависит только от
jackson
). - Следует просто превратить файл graphql в строку полезной нагрузки запроса.
- Должна быть возможность использовать любую клиентскую библиотеку HTTP.
- Должен уметь использовать любую платформу тестирования Java.
Так родилась эта библиотека. Давайте сразу перейдем к тому, как мы можем его использовать.
приступая к работе
Добавление зависимости maven:
com.vimalselvam test-graphql-java 1.0.0
Я не использую Грейдл
, но должно быть просто добавить эту библиотеку в качестве зависимости Gradle
.
Давайте протестируем API Pokemon GraphQL . Мы собираемся протестировать следующий запрос:
query pokemon { pokemon(name: "Pikachu") { name } }
Мы запустим этот запрос и утвердим код успешного ответа и тело ответа, в котором имя
ключ содержит Пикачу
.
Возьмите приведенный выше запрос и поместите его в pokemon.graphql
в разделе src/test/ресурсы/graphql/
в каталоге вашего проекта maven.
Мы можем загрузить этот файл в наш тест одним из следующих двух способов:
- использование
Входной поток
:
InputStream iStream = getClass().getResourceAsStream("/graphql/pokemon.graphql");
- использование
Файл
:
File file = new File("src/test/resources/graphql/pokemon.graphql");
Для этого примера я использую 2-й подход, Файл
.
Как только вы прочитаете файл, просто передайте его в Шаблон Graphql
класс для анализа следующим образом:
String graphqlPayload = GraphqlTemplate.parseGraphql(file, null);
2-й аргумент – переменные
, который используется для параметризации вашего запроса GraphQL. Я покажу вам, как использовать это в ближайшее время, а пока давайте оставим это нулевым
.
Вот и все! Теперь у вас есть строка запроса graphql, которую вы можете напрямую передать в качестве полезной нагрузки запроса в предпочитаемой вами клиентской библиотеке HTTP.
Давайте поговорим о переменных
. В GraphQL
есть функция для установки некоторых переменных
и передайте эти переменные во время выполнения во время выполнения запроса. Для этого мы изменим наш запрос Pokemon
.
Откройте файл pokemon.graphql
и измените его как:
query pokemon($name:String!) { pokemon(name: $name) { name } }
Здесь $name
является переменной, и она принимает только Строку
. !
оператор обозначает, что это обязательная переменная. Давайте посмотрим, как мы можем справиться с этим сценарием переменные
в нашем коде.
Перед преобразованием запроса GraphQL в простую строку давайте создадим переменные:
ObjectNode variables = new ObjectMapper().createObjectNode(); variables.put("name", "Pikachu");
Здесь мы используем com.fasterxml.jackson.databind.узел. Узел объекта
для создания переменных. Этот Узел объекта
может быть передан в качестве 2-го параметра в нашем Шаблоне Graphql
классе.
String graphqlPayload = GraphqlTemplate.parseGraphql(file, variables);
Вот как это просто!
Я открыл эту библиотеку с открытым исходным кодом, и ее можно найти здесь: https://github.com/vimalrajselvam/test-graphql-java .
Взносы приветствуются. Если у вас есть какие-либо мысли или проблемы, пожалуйста, откройте проблему по приведенной выше ссылке на github.
Давайте посмотрим полный пример кода:
package com.vimalselvam.graphql; import java.io.*; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.testng.Assert; import org.testng.annotations.Test; import okhttp3.*; public class TestClass { private static final OkHttpClient client = new OkHttpClient(); private final String graphqlUri = "https://graphql-pokemon.now.sh/graphql"; private Response prepareResponse(String graphqlPayload) throws IOException { RequestBody body = RequestBody.create(MediaType.get("application/json; charset=utf-8"), graphqlPayload); Request request = new Request.Builder().url(graphqlUri).post(body).build(); return client.newCall(request).execute(); } @Test public void testGraphqlWithInputStream() throws IOException { // Read a graphql file as an input stream InputStream iStream = TestClass.class.getResourceAsStream("/graphql/pokemon.graphql"); // Create a variables to pass to the graphql query ObjectNode variables = new ObjectMapper().createObjectNode(); variables.put("name", "Pikachu"); // Now parse the graphql file to a request payload string String graphqlPayload = GraphqlTemplate.parseGraphql(iStream, variables); // Build and trigger the request Response response = prepareResponse(graphqlPayload); Assert.assertEquals(response.code(), 200, "Response Code Assertion"); String jsonData = response.body().string(); JsonNode jsonNode = new ObjectMapper().readTree(jsonData); Assert.assertEquals(jsonNode.get("data").get("pokemon").get("name").asText(), "Pikachu"); } @Test public void testGraphqlWithFile() throws IOException { // Read a graphql file File file = new File("src/test/resources/graphql/pokemon.graphql"); // Create a variables to pass to the graphql query ObjectNode variables = new ObjectMapper().createObjectNode(); variables.put("name", "Pikachu"); // Now parse the graphql file to a request payload string String graphqlPayload = GraphqlTemplate.parseGraphql(file, variables); // Build and trigger the request Response response = prepareResponse(graphqlPayload); Assert.assertEquals(response.code(), 200, "Response Code Assertion"); String jsonData = response.body().string(); JsonNode jsonNode = new ObjectMapper().readTree(jsonData); Assert.assertEquals(jsonNode.get("data").get("pokemon").get("name").asText(), "Pikachu"); } @Test public void testGraphqlWithNoVariables() throws IOException { // Read a graphql file File file = new File("src/test/resources/graphql/pokemon-with-no-variable.graphql"); // Now parse the graphql file to a request payload string String graphqlPayload = GraphqlTemplate.parseGraphql(file, null); // Build and trigger the request Response response = prepareResponse(graphqlPayload); Assert.assertEquals(response.code(), 200, "Response Code Assertion"); String jsonData = response.body().string(); JsonNode jsonNode = new ObjectMapper().readTree(jsonData); Assert.assertEquals(jsonNode.get("data").get("pokemon").get("name").asText(), "Pikachu"); } }
Оригинал: “https://dev.to/email2vimalraj/introducing-test-graphql-java-4i7h”