Tutorial de Teste de API REST Assured

โšก Resumo Inteligente

A REST Assured se estabelece como uma JavaBiblioteca de cรณdigo aberto baseada em [nome da biblioteca/framework] que simplifica os testes de automaรงรฃo de APIs REST. O framework permite que engenheiros de qualidade validem respostas JSON complexas, cabeรงalhos, cรณdigos de status e tempos de resposta usando uma sintaxe limpa no estilo BDD com integraรงรฃo perfeita com o Maven.

  • โš™๏ธ Foundation Configuraรงรฃo: configurar Java, Eclipsee as dependรชncias do Maven antes de escrever seu primeiro script de teste REST Assured.
  • ๐Ÿ“ Domรญnio da sintaxe: Aplique o padrรฃo Dado-Quando-Entรฃo para expressar solicitaรงรตes de API em um formato legรญvel e adequado para negรณcios.
  • ๐Ÿ” Validaรงรฃo granular: Extraia o corpo da resposta, cรณdigos de status, cabeรงalhos, tipo de conteรบdo e temporizaรงรฃo por meio de uma cadeia fluente.
  • ๐Ÿงฉ Navegaรงรฃo por Caminho: Percorra valores JSON aninhados usando a notaรงรฃo de ponto, semelhante ao XPath em Selenium para afirmaรงรตes precisas.
  • ๐Ÿ›ก๏ธ Integraรงรฃo CI/CD: Combine REST Assured com TestNG or JUnit para incorporar verificaรงรตes de API diretamente em pipelines de compilaรงรฃo automatizados.

Tutorial REST Assured

O que รฉ fique tranquilo?

Tenha certeza permite testar APIs REST usando bibliotecas java e integra-se bem com Maven. Possui tรฉcnicas de correspondรชncia muito eficientes, portanto, afirmar os resultados esperados tambรฉm รฉ bastante simples. Rest Assured possui mรฉtodos para buscar dados de quase todas as partes da solicitaรงรฃo e resposta, nรฃo importa quรฃo complexas sejam as estruturas JSON.

Para a comunidade de testes, o API Automation Testing ainda รฉ novo e um nicho. As complexidades do JSON mantรชm os testes de API inexplorados. Mas isso nรฃo o torna menos importante no processo de teste. A estrutura Rest Assured.io tornou tudo muito simples usando os fundamentos bรกsicos do Java, tornando-o algo muito desejรกvel de aprender.

Por que precisa do Rest-Assured?

Imagine que vocรช abre o Google Maps e procura um lugar para ir. Imediatamente, vocรช vรช restaurantes prรณximos, opรงรตes de transporte de grandes empresas de viagens e muitas outras opรงรตes ao seu alcance. Sabemos que esses nรฃo sรฃo produtos do Google, entรฃo como o Google consegue exibi-los? Ele usa as APIs expostas desses provedores. Agora, se vocรช for solicitado a testar esse tipo de configuraรงรฃo, mesmo antes da interface do usuรกrio ser criada ou estar em desenvolvimento, testar as APIs se torna extremamente importante. Testรก-las repetidamente com diferentes combinaรงรตes de dados torna esse um caso muito adequado para automaรงรฃo.

Anteriormente, as equipes usavam linguagens dinรขmicas como Groovy e Ruby para alcanรงar isso, o que foi um desafio. Consequentemente, os testes de API nรฃo foram amplamente explorados pelos testadores funcionais.

No entanto, com o Rest Assured, o teste automatizado de APIs e o envio de solicitaรงรตes HTTPS simples com personalizaรงรตes fรกceis de usar tornam-se simples para quem tem um conhecimento bรกsico de Javaร‰ รบtil para entender testes de API e testes de integraรงรฃo. O Rest Assured oferece grande confianรงa no backend, enquanto os testadores de frontend podem se concentrar na interface do usuรกrio e nas operaรงรตes do lado do cliente. O Rest Assured รฉ de cรณdigo aberto e a constante adiรงรฃo de mรฉtodos e bibliotecas o tornou uma รณtima opรงรฃo para automaรงรฃo de APIs.

REST Assured vs Postman: Principais diferenรงas

Tanto REST Assured quanto Postman Existem vรกrias ferramentas para validar APIs REST, mas cada uma se encaixa em uma etapa diferente do ciclo de vida de testes. A escolha da ferramenta certa depende das habilidades da sua equipe, do escopo do projeto e das necessidades de integraรงรฃo.

Aspecto Tenha certeza Postman
Formato Java Biblioteca para automaรงรฃo baseada em cรณdigo Cliente de API baseado em GUI com suporte a scripts
Melhor Caso de Uso Pipelines de integraรงรฃo contรญnua e suรญtes de regressรฃo Exploraรงรฃo manual e verificaรงรตes rรกpidas de API
Requisito de habilidade Setores de Java conhecimento necessรกrio Codificaรงรฃo mรญnima; utiliza JavaTrechos de script
Relatรณrios Integra-se com TestNG, JUnite Allure Resumos de execuรงรฃo integrados via CLI do Newman

Muitas equipes usam Postman para prototipagem inicial e transiรงรฃo para REST Assured para regressรฃo automatizada assim que o contrato da API estiver estabilizado.

Como configurar o Rest Assured.io com Eclipse

A configuraรงรฃo do REST Assured envolve trรชs dependรชncias principais: Java, uma IDE e o Maven. Siga os passos abaixo para evitar erros de compilaรงรฃo posteriormente.

Etapa 1) Instalar Java. Consulte isto guia

Etapa 2) Baixe um IDE para comeรงar: eclipse

Etapa 3) Instale o Maven e configure seu eclipse. Referir aqui..

Configuraรงรฃo fique tranquilo

  1. Crie um projeto Maven em sua IDE. Estamos usando o IntelliJ, mas vocรช obterรก uma estrutura semelhante em qualquer IDE que esteja utilizando.
  2. Abra seu arquivo POM.xml.

Estrutura do projeto para configuraรงรฃo do Maven com REST Assured

Estrutura do projeto para um espaรงo de trabalho Maven com REST Assured

Para ficar tranquilo.io: Para Java versรฃo <9 usuรกrios:

Adicione a dependรชncia abaixo ao seu POM.xml:

<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-path</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>


<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>xml-path</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>


<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-schema-validator</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>

Para ficar tranquilo.io: Para Java Usuรกrios da versรฃo 9+:

<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured-all</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>

Soluรงรฃo de problemas:

Caso encontre erros e nรฃo tenha certeza se as dependรชncias foram baixadas corretamente, siga estes passos:

  1. Execute um build do Maven para importar todas as dependรชncias. Vocรช encontrarรก ajuda sobre a configuraรงรฃo do Maven no Guru99.
  2. Se os erros persistirem, execute um `Maven clean` seguido de um `Maven install`. A compilaรงรฃo deverรก ser concluรญda sem erros.
  3. Adicione as importaรงรตes abaixo em seu Java Execute a classe e confirme se nรฃo hรก erros de compilaรงรฃo.
import io.restassured.RestAssured.*;
import io.restassured.matcher.RestAssuredMatchers.*;
import org.hamcrest.Matchers.*;

Primeiro script simples de Rest Assured

Com as dependรชncias configuradas, vocรช jรก pode escrever seu primeiro script. O framework segue um estilo de Desenvolvimento Orientado a Comportamento (BDD) que se lรช quase como inglรชs.

Sintaxe:

A sintaxe do Rest Assured.io รฉ a parte mais legรญvel da estrutura, pois รฉ muito semelhante ao BDD e fรกcil de entender.

Given().
        param("x", "y").
        header("z", "w").
when().
Method().
Then().
        statusCode(XXX).
        body("x", "y", equalTo("z"));

Explicaรงรฃo:

Code Explicaรงรฃo
Dado() A palavra-chave 'Given' permite definir um plano de fundo. Aqui, vocรช passa os cabeรงalhos da solicitaรงรฃo, os parรขmetros de consulta e caminho, o corpo e os cookies. Isso รฉ opcional se esses itens nรฃo forem necessรกrios na solicitaรงรฃo.
Quando() A palavra-chave 'quando' marca a premissa do seu cenรกrio. Por exemplo, 'quando' vocรช receber/postar/inserir algo, faรงa outra coisa.
Mรฉtodo() Substitua isso por qualquer uma das operaรงรตes CRUD (get/post/put/delete).
Entรฃo() Suas condiรงรตes de assert e matcher vรฃo aqui.

Agora que vocรช jรก tem a configuraรงรฃo e uma noรงรฃo da sintaxe, vamos criar nosso primeiro teste simples. Nรฃo se preocupe se a estrutura parecer nova para vocรช; conforme vocรช for programando e interpretando cada linha, vocรช vai se familiarizar.

O que vocรช vai buscar?

Abra seu navegador e clique em โ€“ https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1. Certifique-se de ver algo como abaixo.

Exemplo de resposta da API do script Rest Assured

Exemplo de resposta da API capturada pelo REST Assured

Caso vocรช receba um erro no navegador ao tentar obter uma resposta para a solicitaรงรฃo:

  1. Verifique se vocรช usou HTTPS ou HTTP. Seu navegador pode ter configuraรงรตes que bloqueiam sites nรฃo seguros.
  2. Verifique se algum proxy ou firewall estรก bloqueando o acesso ao site pelo seu navegador.

*Observaรงรฃo โ€“ Vocรช nรฃo usou nenhum cabeรงalho, corpo ou cookie aqui. Era uma URL e vocรช estava obtendo conteรบdo da API em vez de enviar ou atualizar qualquer conteรบdo existente. Isso caracteriza uma chamada GET. Lembre-se disso para entender melhor nosso primeiro teste.

O objetivo do seu teste:

O objetivo do script รฉ imprimir em seu console IDE a mesma saรญda que vocรช recebeu no navegador por meio do Rest Assured.

Vamos codificar isso com as etapas abaixo:

Obtendo o corpo da resposta

Passo 1) Crie uma classe chamada โ€œmyFirstRestAssuredClassโ€.

Passo 2) Crie um mรฉtodo chamado โ€œgetResponseBodyโ€.

Passo 3) Semelhante ร  estrutura aprendida anteriormente de dado, quando e entรฃo, digite o cรณdigo abaixo:

dado(). -> Nรฃo sรฃo necessรกrios cabeรงalhos, nenhuma consulta ou parรขmetro de caminho.

when(). -> Nenhuma condiรงรฃo especรญfica definida.

pegar('https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1'). -> basta fornecer a URL.

entรฃo(). -> Nenhuma asserรงรฃo especรญfica รฉ necessรกria.

log().all() -> Assim que toda a resposta for obtida, registre a resposta, os cabeรงalhos e essencialmente tudo o que a solicitaรงรฃo retornar.

public static void getResponseBody(){
   given().when().get("https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1").then().log()
  .all();

}

Observe agora que a URL utilizada รฉ longa e menos legรญvel. Analisando atentamente, vocรช notarรก que trรชs parรขmetros de consulta estรฃo sendo usados:

  1. Identificaรงรฃo do Cliente
  2. Senha
  3. Conta_Nรฃo

O Rest Assured nos ajuda a passar cada parte (consulta, caminho, parรขmetro de cabeรงalho) separadamente, tornando o cรณdigo mais legรญvel e fรกcil de manter. Alรฉm disso, podemos parametrizar os dados de um arquivo externo conforme necessรกrio.

Para usar parรขmetros de consulta, voltamos ร  nossa definiรงรฃo de sintaxe e vemos que todos eles sรฃo passados โ€‹โ€‹โ€‹โ€‹como parte de determinado.

public static void getResponseBody(){

   given().queryParam("CUSTOMER_ID","68195")
           .queryParam("PASSWORD","1234!")
           .queryParam("Account_No","1")
           .when().get("https://demo.guru99.com/V4/sinkministatement.php").then().log()
           .body();
}

**Observe que usamos โ€œcorpoโ€ em vez de โ€œtudoโ€; isso nos ajuda a extrair apenas o corpo da resposta.

Saรญda:

Obtendo o cรณdigo de status da resposta

O prรณximo mรฉtodo que vamos programar รฉ obter o cรณdigo de status e inserir uma asserรงรฃo para validรก-lo.

Passo 1) Crie um mรฉtodo chamado getResponseStatus().

Passo 2) Use a mesma estrutura de solicitaรงรฃo usada acima. Copie e cole.

Passo 3) Em vez de registrรก-lo, use o mรฉtodo integrado 'getStatusCode' do Rest Assured para obter o valor do cรณdigo de status.

Passo 4) Para afirmar que seu cรณdigo de status รฉ 200, use as palavras-chave โ€“ assertThat().statusCode(expectedCode).

**Observaรงรฃo: URL รฉ uma variรกvel usada para simplificar. URL contรฉm o endereรงo completo da solicitaรงรฃo da API.**

public static void getResponseStatus(){
   int statusCode= given().queryParam("CUSTOMER_ID","68195")
           .queryParam("PASSWORD","1234!")
           .queryParam("Account_No","1") .when().get("https://demo.guru99.com/V4/sinkministatement.php").getStatusCode();
   System.out.println("The response status is "+statusCode);

   given().when().get(url).then().assertThat().statusCode(200);
}

Saรญda:

Necessidade de Negรณcios

Uma das regras bรกsicas da automaรงรฃo รฉ que devemos colocar pontos de verificaรงรฃo para que o teste prossiga somente se todas as condiรงรตes exigidas forem atendidas. Nos testes de API, a validaรงรฃo mais bรกsica รฉ verificar se o cรณdigo de status da solicitaรงรฃo estรก no formato 2XX.

O cรณdigo completo, atรฉ agora:

import java.util.ArrayList;
import static io.restassured.RestAssured.*;
import static java.util.concurrent.TimeUnit.MILLISECONDS;

public class myFirstRestAssuredClass {

   final static String url="https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1";

   public static void main(String args[]) {

      getResponseBody();
     getResponseStatus();

; }

   //This will fetch the response body as is and log it. given and when are optional here
   public static void getResponseBody(){
       given().when().get(url).then().log()
      .all();

  given().queryParam("CUSTOMER_ID","68195")
               .queryParam("PASSWORD","1234!")
               .queryParam("Account_No","1") .when().get("https://demo.guru99.com/V4/sinkministatement.php").then().log().body();
   }

public static void getResponseStatus(){
   int statusCode= given().queryParam("CUSTOMER_ID","68195")
           .queryParam("PASSWORD","1234!")
           .queryParam("Account_No","1")
           .when().get("https://demo.guru99.com/V4/sinkministatement.php").getStatusCode();
   System.out.println("The response status is "+statusCode);

   given().when().get(url).then().assertThat().statusCode(200);
}

}

*Nota:

  1. 200 รฉ uma resposta bem-sucedida para este cenรกrio. ร€s vezes, vocรช pode precisar que a solicitaรงรฃo falhe, caso em que vocรช pode usar 4XX ou 5XX. Tente alterar o cรณdigo de status fornecendo parรขmetros invรกlidos e verifique.
  2. Quando afirmamos uma condiรงรฃo, nรฃo haverรก impressรฃo no console, a menos que haja um erro.

Script para buscar diferentes partes de uma resposta

Alรฉm do corpo da resposta e do cรณdigo de status, o REST Assured tambรฉm expรตe cabeรงalhos, tempo de resposta e tipo de conteรบdo por meio de mรฉtodos extratores encadeรกveis. A palavra-chave 'extract' รฉ essencial para obter essas partes especรญficas.

cabeรงalho

Rest Assured รฉ uma linguagem muito direta e buscar cabeรงalhos รฉ igualmente simples. O nome do mรฉtodo รฉ headers(). Como antes, criaremos um mรฉtodo independente para fazer o mesmo.

public static void getResponseHeaders(){
   System.out.println("The headers in the response "+
                   get(url).then().extract()
           .headers());
}

Observe que 'given().when()' รฉ omitido aqui, e a linha de cรณdigo comeรงa em get(). Isso ocorre porque nรฃo hรก nenhuma prรฉ-condiรงรฃo ou verificaรงรฃo feita antes de enviar a solicitaรงรฃo e obter uma resposta. Nesses casos, o uso de 'given().when()' รฉ opcional.

Saรญda:

Necessidade de negรณcios:

Muitas vezes, vocรช precisarรก usar o token de autorizaรงรฃo ou um cookie de sessรฃo para a solicitaรงรฃo subsequente, e esses detalhes geralmente sรฃo retornados como cabeรงalhos da resposta.

Tempo de Resposta

Para obter o tempo necessรกrio para buscar a resposta do back-end ou de outros sistemas downstream, o Rest Assured fornece um mรฉtodo chamado 'timeIn' com um timeUnit adequado para obter o tempo necessรกrio para retornar a resposta.

public static void getResponseTime(){
  System.out.println("The time taken to fetch the response "+get(url)
         .timeIn(TimeUnit.MILLISECONDS) + " milliseconds");
}

Saรญda:

Necessidade de negรณcios:

Um aspecto muito importante no teste de APIs รฉ o tempo de resposta, que mede o desempenho da aplicaรงรฃo. O tempo necessรกrio para a sua chamada pode variar dependendo da sua velocidade de internet, do desempenho da API naquele momento, da carga do servidor e de outros fatores que influenciam o tempo de resposta.

Content-Type

Vocรช pode obter o tipo de conteรบdo da resposta retornada usando o mรฉtodo โ€œcontentType()โ€.

public static void getResponseContentType(){
   System.out.println("The content type of response "+
           get(url).then().extract()
              .contentType());
}

saรญda

Necessidade de negรณcios:

Em alguns casos, obter o tipo de conteรบdo รฉ essencial para garantir que nรฃo haja brechas de seguranรงa para ameaรงas de origem cruzada e para confirmar se o conteรบdo transmitido estรก de acordo com os padrรตes da API.

Buscar elemento JSON individual

Com base na resposta fornecida, vocรช deve calcular o valor total. Vocรช precisa reunir todos os valores e somรก-los.

Passos:

Passo 1) O campo "amount" estรก dentro de uma matriz com a chave "statements", que por sua vez estรก na lista com a chave "result".

Passo 2) O Rest Assured fornece um mecanismo para acessar os valores na API usando o "caminho".

Passo 3) O caminho para chegar aos valores รฉ โ€œresult.statements.AMOUNTโ€. Pense nisso como um XPath em Selenium.

Passo 4) Recupere todos os valores em uma coleรงรฃo e, em seguida, percorra todos os valores para calcular a soma.

public static void getSpecificPartOfResponseBody(){

ArrayList<String> amounts = when().get(url).then().extract().path("result.statements.AMOUNT") ;
int sumOfAll=0;
for(String a:amounts){

    System.out.println("The amount value fetched is "+a);
    sumOfAll=sumOfAll+Integer.valueOf(a);
}
System.out.println("The total amount is "+sumOfAll);

}

Observaรงรฃo: Como o valor da quantia รฉ do tipo string, nรณs o convertemos para um nรบmero inteiro para a soma.

Saรญda:

Melhores Prรกticas para Automaรงรฃo de Testes REST Assured

Depois de compreender os conceitos bรกsicos, a aplicaรงรฃo de padrรตes disciplinados mantรฉm seu conjunto de testes confiรกvel ร  medida que a superfรญcie da API cresce. As prรกticas abaixo ajudam as equipes a evitar testes instรกveis โ€‹โ€‹e sobrecarga de manutenรงรฃo.

  1. Centralizar o URL base: Armazene o URI base e os tokens de autenticaรงรฃo em uma รบnica classe de configuraรงรฃo ou arquivo de propriedades. Isso evita duplicaรงรฃo e simplifica a troca de ambientes.
  2. Utilize as especificaรงรตes de solicitaรงรฃo e resposta: Crie objetos RequestSpecBuilder e ResponseSpecBuilder reutilizรกveis. Eles reduzem o cรณdigo repetitivo quando muitos testes compartilham cabeรงalhos ou asserรงรตes comuns.
  3. Validar esquema JSON: Combine o REST Assured com o mรณdulo json-schema-validator para confirmar a integridade do contrato. As verificaรงรตes de esquema detectam alteraรงรตes incompatรญveis antes que elas cheguem aos consumidores subsequentes.
  4. Externalizar dados de teste: Armazene os dados em arquivos JSON ou use provedores de dados de TestNGDados codificados diretamente no cรณdigo rapidamente se tornam obsoletos.
  5. Realizar testes independentes: Cada teste deve configurar e limpar seus prรณprios dados. Conjuntos de testes dependentes da ordem falham de forma imprevisรญvel em execuรงรตes paralelas de CI.
  6. Capturar registros seletivamente: Use `log().ifError()` em ambientes estรกveis โ€‹โ€‹e `log().all()` durante a depuraรงรฃo. Logs detalhados tornam os pipelines de CI mais lentos e ocultam problemas reais.
  7. Integre-se ao CI/CD: Acione suรญtes REST Assured por meio do Maven Surefire ou Failsafe no Jenkins, GitHub Actions ou GitLab. Execute verificaรงรตes rรกpidas a cada commit e testes de regressรฃo completos durante a noite.

Adotar esses hรกbitos desde cedo transforma a automaรงรฃo de APIs em um ativo de longo prazo, em vez de um gargalo frรกgil.

Perguntas

Sim. Assistentes de IA modernos, como ChatGPT O GitHub Copilot pode gerar modelos de teste REST Assured a partir de especificaรงรตes de API. Os engenheiros ainda devem revisar o cรณdigo gerado quanto a asserรงรตes, manipulaรงรฃo de dados e casos extremos antes de realizar a mesclagem.

Ferramentas baseadas em IA analisam padrรตes de resposta e sugerem localizadores ou asserรงรตes de autorrecuperaรงรฃo. Elas sinalizam desvios de esquema, recomendam refatoraรงรตes e atualizam automaticamente os dados de teste, o que reduz a manutenรงรฃo manual quando as APIs evoluem com frequรชncia.

REST Assured รฉ um Java Biblioteca criada para automaรงรฃo orientada a cรณdigo em pipelines de CI. Postman ร‰ um cliente com interface grรกfica para exploraรงรฃo manual e criaรงรฃo rรกpida de scripts. As equipes costumam combinar ambos ao longo do ciclo de vida de testes.

O REST Assured รฉ otimizado para REST e JSON. Ele pode enviar payloads XML brutos para SOAP, mas ferramentas dedicadas como o SoapUI oferecem suporte mais completo para anรกlise de WSDL e asserรงรตes especรญficas do SOAP.

REST Assured combina naturalmente com TestNG e JUnit Para asserรงรตes, hooks de ciclo de vida e geraรงรฃo de relatรณrios, o Allure, o Extent Reports e o Maven Surefire adicionam visualizaรงรฃo e integraรงรฃo de CI.

Resuma esta postagem com: