Рубрики
Без рубрики

Представляем тестовый GraphQL Ява

Недавно один из моих друзей спросил меня, как мы можем протестировать API GraphQL на Java… С тегами graphql, java, тестирование, тестирование api.

Недавно один из моих друзей спросил меня, как мы можем протестировать 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”