Qualidade e eficiência: como fazer testes automatizados de API Rest com uma ferramenta de IA

Imagem de capa do artigo sobre como fazer testes automatizados de API Rest com uma ferramenta de IA, a StackSpot AI. Vista lateral de uma mulher afro-americana contemporânea escrevendo código e olhando para a tela do computador enquanto trabalhava em um escritório escuro.
Descubra como fazer testes automatizados de API Rest (Java, Maven, Cucumber, Restassured) com uma ferramenta de IA, a StackSpot AI.

O uso de inteligência artificial (IA) tem impactado como os testes automatizados de API Rest são concebidos e executados. Certamente, ao aplicar técnicas de Machine Learning (ML) e processamento de linguagem natural, a IA pode analisar vastos conjuntos de dados e especificações de API para gerar automaticamente casos de testes abrangentes e relevantes. Sendo assim, isso agiliza o processo de teste e aumenta sua eficácia, identificando áreas ainda não exploradas no quesito qualidade.

Dessa forma, você irá aprender como usar o assistente de código contextualizado da StackSpot AI para criar testes automatizados de API Rest, para facilitar na criação e codificação de projetos de automação.

Conhecendo a StackSpot AI

Em primeiro lugar, é importante salientar que a StackSpot é um plataforma de desenvolvimento que empodera equipes de engenharia a modernizar sistemas legados e entregar valor mais rápido, centralizando e reutilizando padrões de tecnologia, gerando códigos altamente contextualizados por meio de IA e otimizando a jornada na nuvem. Por outro lado, ela é dividida em três ofertas: StackSpot EDP, StackSpot Cloud Services e StackSpot AI, esta última foco deste artigo.

A StackSpot AI é capaz de usar seu contexto, bases de conhecimento e decisões tecnológicas para gerar, sobretudo, sugestões mais assertivas e de alta qualidade. Além disso, o assistente de AI oferece a possibilidade de criar comandos rápidos para automatizar tarefas repetitivas. Portanto, diga adeus a sugestões genéricas e adote uma geração de código hiper-contextualizada!

E o melhor: a StackSpot AI possui um plano freemium. Basta usar a versão Web ou baixar as extensões para IDE (IntelliJ ou Visual Code) e começar! 

Testes automatizados de API Rest: primeiros passos com a StackSpot AI 

Em primeiro lugar, vamos criar um projeto de automação de testes de API Rest, usando em conjunto Java + Restassued + Cucumber + Maven.

Posteriormente, usaremos uma conta pessoal (GitHub) para acessar o portal StackSpot AI, baixar o Plugin da assistente de assistente de código contextualizado AI e adicionar a ferramenta de desenvolvimento (IntelliJ).

O assistente de código contextualizado AI, ajudará na geração de código inicial do projeto conforme perguntas e contexto dado, sugerindo códigos gerados para adicionarmos ao projeto.

Por fim, vamos adicionar novos cenários de testes e refatorar o código, deixando nosso projeto mais completo e reutilizável para a comunidade de software.

Então vamos lá:

Para começar, basta autenticar na página de Login da StackSpot AI, É necessário já ter uma conta criada no GitHub para este passo.

Sendo assim, você vai ver essa tela inicial dentro do ambiente da StackSpot AI:

Imagem do artigo sobre Testes automatizados de API Rest com ambiente da StackSpot AI após realizar autenticação, onde na foto aberta temos o site, a esquerda um menu com opções de uso da ferramenta "Home, Stacks AI, Quick Command, Knowledge Sources, Workspaces, Analytics" , ao centro temos uma mensagem de boas-vindas, assim como as IDEs disponíveis para baixar "Visual Studio Code e IntelliJ", sendo a opção "IntelliJ" a ser usada, e a direita um vídeo de exemplo dos primeiros passos para usar a ferramenta StackSpot AI.

Definindo a instalação 

Dessa forma, para a instalação, basta seguir as orientações recomendadas para a construção da automação de testes:

IDE

Plugin IDE

Linguagem

Dependência

Bibliotecas Maven

Consuma inovação,
comece a transformação

Assine nosso boletim informativo para se manter atualizado sobre as práticas recomendadas mais recentes para aproveitar a tecnologia para gerar impacto nos negócios

Criando o projeto para automação de testes de API Rest

Em resumo, para criação e execução do projeto para automação de testes de API Rest, basta seguir as orientações.

1 – Criando um novo projeto para testes automatizados de API Rest

Com as instalações já feitas (passo anterior), basta:

  • Acessar IDE IntelliJ.
  • Acionar o menu File a opção “New -> Project”.
  • Clique em New Project a opção “Java“.
  • Preencher o campo Name com o nome do projeto.
  • Clique em Build System a opção “Maven”.

Pronto, o projeto para automação de testes de API Rest será criado.

Imagem do artigo sobre Testes automatizados de API Rest com IDE IntelliJ para criação de projeto para automação de testes de API Rest, onde na foto aberta temos a IDE,  na esquerda um menu com opções para de uso para criação de projeto na ferramenta IntelliJ, sendo "New Project" as opções "Java, Kotlin, Groovy, Empty Project", onde escolhemos "Java" e à direita temos campos para preenchimento do projeto "Name, Location, Build System, JDK", onde escolhemos as opções em Build System a opção "Maven e JDK a opção "11" e no fim da tela botão "Create" para criar projeto com configurações realizadas.

2 – Fazendo a autenticação na StackSpot AI

Com a IDE IntelliJ já aberta e projeto já criado (passo anterior), basta:

  • Acessar o Plugin StackSpot AI.
  • Preencher o campo email da sua conta GitHub.
  • Clicar no botão “Continue with GitHub“.
  • Clicar no botão “Sim” na tela que será aberta. Após receber confirmação, voltar para IntelliJ.

Pronto, depois da autenticação vai ser possível usar a StackSpot AI.

Imagem do artigo sobre Testes automatizados de API Rest com IDE IntelliJ com Plugin da StackSpot AI, onde na foto abeta temos a IDE, à direita o Plugin da StackSpot AI para com campo "Email" e os botões "Continue with e-mail" e "Continue with Github", onde usaremos e-mail da nossa conta Github e acionaremos botåo "Continue with Github" para realizarmos autenticação.

Imagem do artigo sobre Testes automatizados de API Rest com site solicitando permissões para uso do Plugin StackSpot AI, onde na foto aberta temos o site, com os  botões "No" e "Yes", onde acionamos o botão "Yes" para aceitar as permissões e estabelecer conexão do Plugin, site e IDE.

Imagem do artigo sobre Testes automatizados de API Rest com site confirmando aceite das permissões para uso do Plugin StackSpot AI, onde na foto aberta temos o site, com a mensagem de confirmação "Dispositivo Autenticado com Sucesso" e estamos prontos para uso do Plugin na IDE.

3 – Fazendo a geração de código

Com o projeto já criado na IDE IntelliJ e com login já feito na StackSpot AI (passo anterior), basta:

Depois disso, o código é gerado e podemos adicionar ao projeto criado para uso.

Imagem do artigo sobre Testes automatizados de API Rest com IDE IntelliJ com Plugin da StackSpot AI, onde na foto aberta temos a IDE, com chat para interação, fizemos a pergunta "gerar exemplo para teste POST de API Rest, usando Java 11, Maven, Rest Assured e Cucumber" tivemos resposta com exemplos de código para copiar ao projeto criado.

Adicionando o código gerado pela StackSpot AI ao projeto

Vamos adicionar o código gerado ao projeto para testes automatizados de API Rest, seguindo os passos abaixo:

1. Configurar do projeto com Maven

No arquivo pom.xml do seu projeto, adicione as seguintes dependências para Cucumber, JUnit e RestAssured.

pom.xml

Java

<dependencies>
       <!-- RestAssured -->
       <dependency>
           <groupId>io.rest-assured</groupId>
           <artifactId>rest-assured</artifactId>
           <version>4.3.3</version>
           <scope>test</scope>
       </dependency>

       <!-- Cucumber -->
       <dependency>
           <groupId>io.cucumber</groupId>
           <artifactId>cucumber-java</artifactId>
           <version>6.10.4</version>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>io.cucumber</groupId>
           <artifactId>cucumber-junit</artifactId>
           <version>6.10.4</version>
           <scope>test</scope>
       </dependency>

       <!-- JUnit -->
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.13.2</version>
           <scope>test</scope>
       </dependency>
   </dependencies>

2.Criar o cenário de teste com Cucumber

Crie um arquivo de feature para o Cucumber. 

src/test/resources/features/postFeature.feature

Java


Feature: Test POST API endpoint

 Scenario: Post new data to the API
   Given I set POST API endpoint
   When I send POST HTTP request
   Then I receive valid HTTP response code 201

3. Implementar o teste com RestAssured

Posteriormente, implemente os passos de teste usando RestAssured. Crie uma classe de teste correspondente ao seu cenário Cucumber.

src/test/java/stepDefinitions/PostApiSteps.java

Java

package com.example.steps;

import io.cucumber.java.en.Given;
import io.cucumber.java.en.When;
import io.cucumber.java.en.Then;
import io.restassured.RestAssured;
import io.restassured.response.Response;
import static org.junit.Assert.*;

public class PostApiSteps {
   private Response response;

   @Given("I set POST API endpoint")
   public void i_set_post_api_endpoint() {
       RestAssured.baseURI = "http://yourapi.com/api";
   }

   @When("I send POST HTTP request")
   public void i_send_post_http_request() {
       response = RestAssured.given().contentType("application/json")
               .body("{\"key\": \"value\"}")
               .when().post("/endpoint");
   }

   @Then("I receive valid HTTP response code 201")
   public void i_receive_valid_http_response_code_201() {
       assertEquals(201, response.getStatusCode());
   }
}

4. Configurar o Runner com Cucumber

Crie uma classe para executar os testes do Cucumber.

src/test/java/cucumberOptions/TestRunner.java

Java

package com.example;

import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@CucumberOptions(
       features = "src/test/resources/features",
       glue = "com.example.steps",
       plugin = {"pretty", "html:target/cucumber-reports.html"},
       monochrome = true
)
public class TestRunner {

Executando os testes automatizados de API Rest

Para executar os testes automatizados de API Rest, você pode usar o comando Maven.

mvn test

Neste momento, você tem um exemplo de código e estrutura do projeto de automação de testes integrado de API Rest, fazendo requisição POST, recebendo resposta e validando o status code. Depois disso, ajuste o que foi gerado, conforme a sua necessidade.

Imagem do artigo sobre Testes automatizados de API Rest com IDE IntelliJ após execução dos testes, onde na foto aberta temos a IDE,  com o arquivo "PostApiTest.feature" com um cenário de teste criado "Post new data to the API" que geramos pela StackSpot AI, adicionamos no projeto e fizemos execução, sendo realizada com sucesso.

Em seguida, é necessário melhorar o código e organizar o projeto, adicionando a requisição GET, recebendo respostas e validando dados.

Para isso, utilize as APIs da ServeRest, para:

  • Cadastrar novo usuário (POST Usuário)
  • Consultar usuário cadastrado (GET Usuário)
  • Consultar usuário não cadastrado (GET Usuário)

A seguir, será demonstrado os ajustes, conforme cenários a serem validados.

Refatorando o projeto para ficar mais simples e organizado a implementação

Para fazer a refatoração, faça as modificações abaixo:

1 – Ajustando o projeto com Maven

Ajuste o arquivo pom.xml para conter as implementações.

pom.xml

Java

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>org.example</groupId>
   <artifactId>StackSpot-api-integration-tests</artifactId>
   <version>1.0-SNAPSHOT</version>

   <properties>
       <maven.compiler.source>11</maven.compiler.source>
       <maven.compiler.target>11</maven.compiler.target>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>

   <dependencies>
       <!-- RestAssured -->
       <dependency>
           <groupId>io.rest-assured</groupId>
           <artifactId>rest-assured</artifactId>
           <version>4.3.3</version>
           <scope>test</scope>
       </dependency>

       <!-- Cucumber -->
       <dependency>
           <groupId>io.cucumber</groupId>
           <artifactId>cucumber-java</artifactId>
           <version>6.10.4</version>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>io.cucumber</groupId>
           <artifactId>cucumber-junit</artifactId>
           <version>6.10.4</version>
           <scope>test</scope>
       </dependency>

       <!-- JUnit -->
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.13.2</version>
           <scope>test</scope>
       </dependency>

       <!-- Java Faker -->
       <dependency>
           <groupId>com.GitHub.javafaker</groupId>
           <artifactId>javafaker</artifactId>
           <version>1.0.2</version>
       </dependency>
   </dependencies>

</project>

2 – Ajustando o cenário de teste com Cucumber

Ajuste o arquivo resources/features/usuario.feature para conter as implementações.

src/test/resources/features/usuario.feature

Java

Feature: Usuário API

  @todos @usuario-cadastrar
  Scenario: Deve cadastrar novo usuário
    Given Eu tenho os dados para cadastrar um novo usuario
    When Eu faço um pedido POST para a URL "https://serverest.dev/usuarios"
    Then O status do código de resposta deve ser 201

  @todos @usuario-nao-cadastrado
  Scenario: Deve consultar usuário cadastrado
    Given Eu não tenho um usuario cadastrado mas desejo cadastrar
    When Eu faço um pedido GET para a URL "https://serverest.dev/usuarios"
    Then O status do código de resposta deve ser de 200

  @todos @usuario-nao-existente
  Scenario: Deve consultar usuário não cadastrado
    Given Eu não tenho um usuario cadastrado "XPTO"
    When Eu faço um pedido GET para a URL "https://serverest.dev/usuarios"
    Then O status do código de resposta deverá ser de 400

3 – Ajustando os Steps de teste com RestAssured

Ajuste o arquivo stepDefinitions/UsuarioSteps.java para conter implementação dos testes da feature, de cadastrar novo usuário, consultar usuário cadastrado e consultar usuário não cadastrado.

src/test/java/stepDefinitions/UsuarioSteps.java

Java

package stepDefinitions;

import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import io.restassured.response.Response;
import services.UsuarioService;


public class UsuarioSteps {

    private Response response;

    private String body;
    private String idUsuario;
    private final UsuarioService usuarioService = new UsuarioService();

    @Given("Eu tenho os dados para cadastrar um novo usuario")
    public void eu_tenho_os_dados_para_cadastrar_um_novo_usuario() {
        body = usuarioService.gerarDadosUsuario();
    }

    @When("Eu faço um pedido POST para a URL {string}")
    public void eu_faco_um_pedido_post_para_a_url(String url) {
        response = usuarioService.criarNovoUsuario(url, body);
    }

    @Then("O status do código de resposta deve ser {int}")
    public void o_status_do_codigo_de_resposta_deve_ser(int statusCode) {
        idUsuario = usuarioService.validarDadosUsuarioCadastrado(response,statusCode);
    }



    @Given("Eu não tenho um usuario cadastrado mas desejo cadastrar")
    public void eu_nao_tenho_um_usuario_cadastrado_mas_desejo_cadastrar() {
        idUsuario = usuarioService.verificarUsuarioExistente(null);
    }

    @When("Eu faço um pedido GET para a URL {string}")
    public void eu_faco_um_pedido_get_para_a_url(String url) {
        response = usuarioService.consultarUsuario(url, idUsuario);
    }

    @Then("O status do código de resposta deve ser de {int}")
    public void o_status_do_codigo_de_resposta_deve_ser_de(int statusCode) {
        usuarioService.validarDadosUsuarioConsultado(response,idUsuario,statusCode);
    }




    @Given("Eu não tenho um usuario cadastrado {string}")
    public void eu_nao_tenho_um_usuario_cadastrado(String novoIdUsuario) {
        idUsuario = novoIdUsuario;
    }

    @When("Eu faço uma tentativa de pedido GET para a URL {string}")
    public void eu_faco_uma_tentativa_de_pedido_get_para_a_url(String url) {
        response = usuarioService.consultarUsuario(url, idUsuario);
    }

    @Then("O status do código de resposta deverá ser de {int}")
    public void o_status_do_codigo_de_resposta_devera_ser_de(int statusCode) {
        usuarioService.validarDadosUsuarioNaoCadastrado(response,statusCode);
    }
}

4 – Criando a estrutura DTO para manipular os dados da requisição

Crie o arquivo dto/UsuarioDto para criar get/set e acesso aos atributos do objeto/classe.

src/test/java/dto/UsuarioDto.java

Java

package dto;

public class UsuarioDto {

    private String nome;
    private String email;
    private String senha;
    private String administrador;

    // Getter e Setter para nome
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    // Getter e Setter para email
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    // Getter e Setter para senha
    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    // Getter e Setter para administrador
    public String getAdministrador() {
        return administrador;
    }

    public void setAdministrador(String administrador) {
        this.administrador = administrador;
    }
}

5 – Criando a estrutura Service para montar a requisição

Crie o arquivo service/UsuarioService.java para montar as requisições a serem feitas.

src/test/java/service/UsuarioService.java

Java

   
package services;

import com.github.javafaker.Faker;
import dto.UsuarioDto;
import io.restassured.path.json.JsonPath;
import io.restassured.response.Response;

import static io.restassured.RestAssured.given;
import static org.junit.Assert.assertEquals;

public class UsuarioService {

    private Response response;
    private String requestBody;
    private String idUsuario;
    private UsuarioDto usuarioDto;
    private Faker faker;
    private String novoIdUsuario;

    public String gerarDadosUsuario(){
        faker = new Faker();

        usuarioDto = new UsuarioDto();
        usuarioDto.setNome(faker.name().name());
        usuarioDto.setEmail(faker.internet().emailAddress());
        usuarioDto.setSenha("123456");
        usuarioDto.setAdministrador("true");

        requestBody = "{\n" +
                "  \"nome\": \""+usuarioDto.getNome()+"\",\n" +
                "  \"email\": \""+usuarioDto.getEmail()+"\",\n" +
                "  \"password\": \""+ usuarioDto.getSenha()+"\",\n" +
                "  \"administrador\": \""+ usuarioDto.getAdministrador()+"\"\n" +
                "}";

        return requestBody;
    }

    public Response criarNovoUsuario(String url, String requestBody){
        response = given()
                .header("Content-type", "application/json")
                .and()
                .log().all()
                .body(requestBody)
                .when()
                .post(url)
                .then()
                .log().all()
                .extract().response();
        return response;
    }

    public String validarDadosUsuarioCadastrado(Response response, int statusCode){
        JsonPath jsonPathEvaluator = response.jsonPath();

        assertEquals(statusCode, response.getStatusCode());
        assertEquals("Cadastro realizado com sucesso",jsonPathEvaluator.get("message"));

        idUsuario = jsonPathEvaluator.get("_id");

        return idUsuario;
    }

    public String verificarUsuarioExistente(String idUsuario){
        String novoBody;
        Response novoResponse;
        if (idUsuario == null){
            novoBody = gerarDadosUsuario();
            novoResponse = criarNovoUsuario("https://serverest.dev/usuarios",novoBody);
            novoIdUsuario = validarDadosUsuarioCadastrado( novoResponse, 201);
        }
        else{
            novoIdUsuario = idUsuario;
        }
        return novoIdUsuario;
    }

    public Response consultarUsuario(String url, String novoIdUsuario){
        response = given()
                .header("Content-type", "application/json")
                .and()
                .log().all()
                .when()
                .get(url + "/" + novoIdUsuario)
                .then()
                .log().all()
                .extract().response();

        return response;
    }

    public void validarDadosUsuarioConsultado(Response response, String novoId, int statusCode){
        JsonPath jsonPathEvaluator = response.jsonPath();


        if (novoIdUsuario.equals(novoId)) {
            assertEquals(statusCode, response.getStatusCode());
            assertEquals(novoIdUsuario, jsonPathEvaluator.get("_id"));
        }
        else {
            assertEquals(usuarioDto.getNome(), jsonPathEvaluator.get("nome"));
            assertEquals(usuarioDto.getEmail(), jsonPathEvaluator.get("email"));
            assertEquals(usuarioDto.getSenha(), jsonPathEvaluator.get("password"));
            assertEquals(usuarioDto.getAdministrador(), jsonPathEvaluator.get("administrador"));
            assertEquals(statusCode, response.getStatusCode());
            assertEquals(idUsuario, jsonPathEvaluator.get("_id"));
        }
    }

    public void validarDadosUsuarioNaoCadastrado(Response response, int statusCode){
        JsonPath jsonPathEvaluator = response.jsonPath();

        assertEquals("Usuário não encontrado", jsonPathEvaluator.get("message"));
        assertEquals(statusCode, response.getStatusCode());

    }
}

Executando os testes após refatoração

Para executar os testes, você pode usar o comando Maven.

 mvn test

Imagem do artigo sobre Testes automatizados de API Rest com IDE IntelliJ após refatoração e execução dos testes, onde na foto aberta temos a IDE, com o arquivo "usuario.feature" três cenários executados: "Deve cadastrar novo usuário", "Deve consultar usuário cadastrado" e "Deve consultar usuário não cadastrado" fizemos refatoração no código fazendo melhorias, com base no código inicial gerado pela StackSpot AI e fizemos a execução, sendo realizada com sucesso.

Dessa forma, o projeto ajustado foi executado com sucesso. Com a ajuda da StackSpot AI foi possível melhorar a escrita dos cenários, promover reuso de código e simplificar a execução dos testes automatizados de API Rest.

Assista ao tutorial completo em vídeo:

Conclusão

Em conclusão, neste artigo, você conferiu as vantagens de adotar uma ferramenta contextualizada de inteligência artificial como a StackSpot AI em processos de testes automatizados de API Rest. Sem dúvidas, todo o ciclo de desenvolvimento de software tem ganhado velocidade e eficiência ao adotar a ferramenta de AI certa, nesse cenário, os processos de Qualidade de Software também tem se beneficiado muito dos novos recursos. 

Dessa forma, ao utilizar a StackSpot AI, foi possível adotar sugestões assertivas, pois se baseiam em seus próprios padrões e fontes de conhecimento. Contudo, isso traz eficiência, confiabilidade e inovação sem precedentes aos seus testes automatizados de API Rest e outros processos de QA.

Ficou com alguma dúvida ou tem sugestões? Então deixe um comentário.

Referências

Consuma inovação,
comece a transformação

Assine nosso boletim informativo para se manter atualizado sobre as práticas recomendadas mais recentes para aproveitar a tecnologia para gerar impacto nos negócios

Related posts

*Material em Inglês

Baixe grátis o eBook
e descubra caminhos para evoluir sua empresa