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:

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.

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.

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.

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.

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.

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.

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

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.

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

Summary

Related posts

*Material em Inglês

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