Tutorial REST Assured para testes de automação de API (exemplo)
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 a visualização do mapa do Google e procura um lugar que deseja ir, vê imediatamente restaurantes próximos, vê opções de deslocamento; de alguns dos principais provedores de viagens e veja tantas opções ao seu alcance. Todos nós sabemos que eles não são produtos do Google, então como o Google consegue mostrar isso? Eles usam as APIs expostas desses provedores. Agora, se você for solicitado a testar esse tipo de configuração, mesmo antes da UI ser construída ou estar em desenvolvimento, testar APIs torna-se extremamente importante e testá-las repetidamente, com diferentes combinações de dados, torna-o um caso muito adequado para automação.
Anteriormente, usávamos linguagens dinâmicas como groovy e ruby para conseguir isso, e era um desafio. Conseqüentemente, os testes de API não foram explorados pelos testes funcionais.
Mas usando Rest Assured, testes automatizados de APIs, enviar solicitações https simples com personalizações fáceis de usar é simples se alguém tiver um conhecimento básico de java. É necessário entender os testes de API e de integração, mas poste que a automação Rest Assured oferece uma confiança muito boa no back-end, enquanto os testes de front-end podem se concentrar apenas na interface do usuário e nas operações do lado do cliente. Rest Assured é um código aberto com muitos métodos e bibliotecas adicionais adicionados, tornando-o uma ótima opção para automação de API.
Como configurar o Rest Assured.io com Eclipse
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
- Crie um projeto Maven em seu IDE. Estamos usando o Intellij, mas você obterá uma estrutura semelhante em qualquer IDE que estiver usando.
- Abra seu POM.xml
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 você veja erros e não tenha certeza se o download das dependências foi bem feito,
- Execute uma compilação do maven para importar todas as dependências. Mais uma vez, você encontrará ajuda na configuração do Maven no guru99.
- Ainda assim, você vê erros, então faça uma limpeza do maven seguida de uma instalação do maven, e ele deverá ser compilado sem erros.
- Você pode adicionar as linhas abaixo em sua classe Java e ver que nenhum erro de compilação está presente.
import io.restassured.RestAssured.*; import io.restassured.matcher.RestAssuredMatchers.*; import org.hamcrest.Matchers.*;
Primeiro script simples de Rest Assured
Sintaxe:
A sintaxe do Rest Assured.io é a parte mais bonita, pois é muito parecida com o BDD e compreensível.
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, parâmetro de consulta e caminho, corpo, 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ê recebe/posta/coloca 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 afirmação e correspondência vão aqui |
Agora que você tem a configuração e algumas informações básicas sobre a sintaxe, vamos criar nosso primeiro teste simples. Está tudo bem se até agora a estrutura parece nova para você, à medida que você codifica cada linha, você pega o jeito.
O que você vai buscar?
Abra seu navegador e clique em – http://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1
. Certifique-se de ver algo como abaixo.
Caso você receba um erro no navegador ao tentar obter uma resposta para a solicitação,
- Veja se você usou Https ou Http. Seu navegador pode ter configurações para não abrir sites inseguros.
- Veja se algum proxy ou firewall impede seu navegador de abrir sites.
*Note – você não usou nenhum cabeçalho aqui, nenhum corpo e nenhum cookie. Era uma URL e você também está obtendo conteúdo da API e não postando ou atualizando nenhum conteúdo existente, o que faz com que seja 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, 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.
quando(). -> Nenhuma configuração de condição específica
pegar('http://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1
'). ->apenas o URL precisa ser fornecido
então(). -> Não são necessárias afirmações específicas
registro(). all() -> Depois que toda a resposta for obtida, registre a resposta, os cabeçalhos, essencialmente tudo o que a solicitação retorna para você.
public static void getResponseBody(){ given().when().get("http://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1").then().log() .all(); }
Agora observe que a URL usada é longa e menos legível, se você olhar com atenção, notará que estão sendo usados 3 parâmetros de consulta que são
- Identificação do Cliente
- Senha
- Conta_Não
Fique tranquilo, 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("http://demo.guru99.com/V4/sinkministatement.php").then().log() .body(); }
**Observe que usamos “corpo” em vez de “todos”; 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 criaremos o script será obter o código de status e também colocar 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, usamos o método embutido 'getStatusCode' do Rest Assured para buscar o valor do código de status
Passo 4) Para afirmar que seu código de status é 200, usamos as palavras-chave – assertThat().statusCode(expectedCode)
**Nota – URL é uma variável usada para simplificar. URL contém todo o URL de solicitação de API
public static void getResponseStatus(){ int statusCode= given().queryParam("CUSTOMER_ID","68195") .queryParam("PASSWORD","1234!") .queryParam("Account_No","1") .when().get("http://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="http://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("http://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("http://demo.guru99.com/V4/sinkministatement.php").getStatusCode(); System.out.println("The response status is "+statusCode); given().when().get(url).then().assertThat().statusCode(200); } }
*Nota:
- 200 é uma resposta bem-sucedida para este cenário. Às vezes, você também precisa que a solicitação falhe e então você pode usar 4XX ou 5XX. Tente alterar o código de status fornecendo parâmetros inválidos e verifique.
- 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
A busca do corpo da resposta e do código de status da resposta já foi abordada no segmento acima. Vale ressaltar que para buscar diferentes partes da resposta, a palavra-chave ‘extrair’ é muito importante.
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()' é ignorado aqui e a linha de código começa em get(), isso ocorre porque não há pré-condição ou verificação feita aqui para atender à solicitação e obter uma resposta. Nesses casos, é opcional usar o mesmo.
Saída:
Necessidade de negócios:
Algumas vezes, você precisaria usar o token de autorização ou um cookie de sessão para a solicitação subsequente e, principalmente, esses detalhes 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:
Uma característica muito importante dos testes de APIs é o seu tempo de resposta, para medir o desempenho da aplicação. Observe que o tempo gasto para sua chamada pode demorar mais ou menos dependendo da velocidade da sua internet, do desempenho da API naquele momento, da carga do servidor e de outros fatores que afetam o tempo.
Content-Type
Você pode obter o content-Type 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:
Às vezes, obter o tipo de conteúdo é essencial para garantir que não haja falhas de segurança para ameaças de origem cruzada ou apenas para garantir que o conteúdo transmitido esteja de acordo com os padrões da API.
Buscar elemento JSON individual
A partir da resposta dada, você será solicitado a calcular o valor total, você precisa buscar cada valor e somar.
Passos:
Passo 1) O campo valor está dentro de um array com a chave “declarações” que por sua vez está na lista com a chave “resultado”
Passo 2) Fique tranquilo, fornece um mecanismo para alcançar os valores na API usando “caminho”
Passo 3) O caminho para chegar aos valores é “resultado.declarações.AMOUNT”. Pense nisso como o Xpath em selênio.
Passo 4) Busque todos os valores em uma coleção e, em seguida, faça um loop para 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); }
Nota: Como o valor da quantidade está no tipo de dados string, convertemos para inteiro e o usamos para somatório.
Saída:
Resumo
- Rest Assured é um grupo de bibliotecas Java que nos permite automatizar Teste de API Rest
- Tenha certeza é Java-baseado e conhecimento do núcleo Java é suficiente para aprender
- Ajuda a buscar valores de solicitação e resposta de estruturas JSON complicadas
- O ESB ( API a solicitação pode ser personalizada com uma variedade de cabeçalho, consulta, parâmetro de caminho e qualquer sessão ou cookies a serem definidos.
- Ajuda a definir declarações e condições de afirmação.
- Embora Rest Assured seja muito útil quando a resposta for do tipo JSON, seus métodos podem não funcionar perfeitamente se o tipo de conteúdo for HTML ou texto simples.