rest api testing with spring resttemplate
Este tutorial detalhado explica como começar a testar a API REST com Spring RestTemplate e TestNG com exemplos simples:
Neste artigo, veremos como começar a testar a API REST com RestTemplate e a estrutura TestNG.
Antes de explorar o teste de API REST com RestTemplate e estrutura TestNG, vamos entender alguns dos conceitos básicos envolvidos nele.
Vamos começar!!
O que você aprenderá:
- O que é REST?
- O que é JSON?
- O que é o teste REST API?
- O que é TestNG?
- O que é o modelo Spring REST?
- Etapas de teste da API REST
- Configurando o TestNG Test Framework no Windows
- Código do arquivo TestCRUD completo
- Conclusão
- Leitura recomendada
O que é REST?
Hoje em dia, REST se tornou uma escolha bastante popular para a construção de Web Services. Por exemplo , O Google tem vários serviços REST como o Agenda, API de mapa etc.
RESTO ou seja, Transferência de Estado Representacional é um estilo de arquitetura de software. Nesse estilo, um conjunto de restrições é definido e os serviços da web construídos são necessários para satisfazer essas restrições. Esses serviços da web em conformidade com o estilo de arquitetura REST são conhecidos como serviços da web RESTful.
O termo 'transferência de estado representacional' foi apresentado pela primeira vez por Roy Fielding em seu Ph.D. dissertação de mestrado no ano 2000. A idéia básica do REST é tratar os objetos do lado do servidor como recursos que podem ser criados ou excluídos.
O que é JSON?
JSON ou seja JavaScript Object Notation é uma sintaxe muito comumente usada em serviços REST para armazenar e trocar dados entre o navegador e o servidor.
A principal vantagem do JSON é seu peso leve e, em segundo lugar, seu formato legível também. Os dados são armazenados no formato de par chave: valor. Por exemplo, você pode ter os dados do funcionário armazenados no formato JSON como este: {“nome”: ”Emp1 ″,” salário ”:” 3000 ″, ”idade”: ”23 ″,” id ”:” 52686 ″}.
O que é o teste REST API?
Quando dizemos teste REST API, é basicamente testar API executando ações Criar, Editar, Ler e Excluir no Recurso com 4 métodos principais, ou seja, POST, GET, PUT e DELETE, respectivamente
O que é TestNG?
TestNG é uma estrutura de teste inspirada em JUnit e NUnit. É para a linguagem de programação Java. TestNG cobre uma gama mais ampla de categorias de teste, como unidade, funcional, ponta a ponta, integração, etc.
É uma estrutura de código aberto que vem sob a licença Apache. Ele fornece um rico conjunto de anotações que aceleram o desenvolvimento do script de teste.
O que é o modelo Spring REST?
A classe Spring RestTemplate é uma parte do spring-web que foi introduzido no Spring 3
A classe RestTemplate fornece uma maneira muito conveniente de testar os serviços da web restful baseados em HTTP, fornecendo métodos sobrecarregados para métodos HTTP como GET, POST, PUT, DELETE, etc. O framework Spring também é de código aberto.
Etapas de teste da API REST
Vamos entender as etapas que geralmente são seguidas no teste de API REST com alguns exemplos para obter um entendimento claro.
Neste artigo, considerei um exemplo de serviço de funcionário da API REST da esta fonte.
Inicialmente, vamos seguir as etapas manualmente usando a ferramenta POSTMAN.
# 1) Primeiro, conheça o ponto de extremidade da API que você deseja acessar.
Por exemplo, http://dummy.restapiexample.com/api/v1/create para criar um novo recurso de funcionário
#dois) Defina cabeçalhos e corpo se necessário para o método HTTP.
Em nosso exemplo, estamos tentando criar um novo recurso usando POST. Para POST, é necessário um corpo de solicitação.
Portanto, definiremos o corpo da seguinte forma:
“Nome”: ”zozo100 ″,” salário ”:” 123 ″, ”idade”: ”23 ″
Aceitar : aplicativo / JSON e Tipo de conteúdo : aplicativo / JSON.
quais são os melhores provedores de email
# 3) Defina o método HTTP apropriado, ou seja, POST neste caso.
# 4) Envie uma solicitação ao servidor de serviço Rest.
# 5) Receba uma resposta do servidor.
Chamada de API REST usando a ferramenta POSTMAN
# 6) Verifique a resposta conforme o esperado com a ajuda do Código de Resposta Por exemplo. 200 OK como um sucesso.
# 7) Verifique o corpo da resposta conforme o esperado, se necessário, comparando-o com seu arquivo de referência.
Agora, temos que automatizar as mesmas etapas para nosso pacote de automação de teste. Vamos começar com a configuração necessária para automação.
Configurando o TestNG Test Framework no Windows
# 1) Instalação
- Vamos usar Java para desenvolvimento de script de teste. Então, primeiro download Instalador JDK para Windows e instale o Java em sua máquina.
- IDE (Ambiente de Desenvolvimento Integrado) : Eu usei o Eclipse como IDE para o meu desenvolvimento de pacote de teste de automação. Clique aqui para fazer o download.
- Obtenha o plug-in Eclipse para TestNG: Observe que o Java 1.7+ é necessário para executar TestNG para o plug-in Eclipse. Eclipse 4.2 e superior são necessários. (Referência: TestNG ) Siga as etapas abaixo no Eclipse:
- Selecione Ajuda / Instalar Novo Software.
- Clique em Adicionar -> Digite http://beust.com/eclipse/
- Marque a caixa de seleção ao lado do URL e clique no botão Avançar.
Instalação TestNG
-
- Continue clicando no botão Próximo, até chegar à tela seguinte.
Tela final da instalação do TestNG
Finalmente, aceite o Acordo de Licença Apache e clique no botão Concluir para completar a instalação.
Reinicie o Eclipse para que a instalação do plug-in tenha efeito.
- Jarras de primavera: Agora, mais uma coisa, vamos usar a classe RestTemplate do framework spring. Você pode baixar potes de primavera e salve em uma pasta local, Por exemplo ,C: / projectJar
- JSON-Jars simples: Precisamos realizar a análise JSON. Para isso, usaremos uma API simples Json leve. Portanto, baixe Json-simple-1.1.jar em C: / projectJar
Agora concluímos as instalações necessárias. Então, vamos criar nosso projeto de Automação de Teste.
# 2) Configuração do projeto
- Criar Arquivo -> Novo -> Projeto Java -> Nomeie como ‘ EmployeeTestSuite ’.
- Agora, crie um novo pacote java com.demo :
- Configure o caminho de construção:
- Como você viu na seção anterior, instalamos o TestNG, baixamos jars spring e JSON simples. Portanto, agora temos que adicionar o caminho de construção em nosso projeto para consumi-los. Para isso, crie um lib pasta em o EmployeeTestSuite pasta e agora copie todos os jars do C: / projectJar para o lib pasta.
- Clique com o botão direito em ‘ EmployeeTestSuite ’’ -> Caminho de construção -> Configurar caminho de construção.
- Clique no lib aba.
- Clique no Adicionar biblioteca botão -> Selecione TestNG. Isso adicionará TestNG ao caminho de construção.
- Clique em Adicionar jarras botão -> Selecione todos os jars de lib. Isso adicionará todos os jars spring e jar JSON simples ao caminho de construção do projeto.
Caminho de construção Java
A estrutura do seu projeto será exibida conforme a seguir no Eclipse Package Explorer agora.
Estrutura do Pacote
# 3) Aula de teste
Precisamos criar uma classe de teste que pode cobrir operações CRUD (Criar-Ler-Atualizar-Excluir).
Crie uma nova classe Arquivo -> Novo -> Classe TestNG e nomeie-a TestCRUD.java
# 4) Método de Teste
Vamos criar métodos de teste separados:
- addEmployee (): Método de teste para testar Create API usando o método HTTP POST.
- getEmployee (): Método de teste para testar Read API usando o método HTTP GET.
- updateEmployee (): Método de teste para testar a API de atualização usando o método HTTP PUT.
- deleteEmployee (): Método de teste para testar a API Delete usando o método HTTP DELETE.
Você pode criar um método de teste como qualquer método java apenas com a anotação @Test de TestNG para identificá-lo como o método de teste pela estrutura TestNG
Por exemplo,a seguir está o método de teste addEmployee.
@Test public void addEmployee () {}
Em nosso exemplo, usei um Amostra de serviço REST.
Agora, vamos automatizar a chamada POST. Para isso, precisamos mapear nosso código com as etapas que seguimos manualmente na seção ‘Etapas de teste da API REST’ uma por uma.
# 1) Primeiro, conheça o ponto de extremidade da API que você deseja acessar.
String addURI = 'http://dummy.restapiexample.com/api/v1/create';
#dois) Defina cabeçalhos para o método HTTP.
HttpHeaders headers = new HttpHeaders();
// Adicionar cabeçalhos
headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json');
Defina o corpo para o método HTTP.
String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}';
// Crie um objeto HttpEntity definindo o corpo e os cabeçalhos.
HttpEntity entity = new HttpEntity(jsonBody, headers);
Teremos as seguintes etapas automatizadas em uma declaração.
# 3) Defina o método HTTP apropriado, ou seja, POST neste caso.
# 4) Envie uma solicitação ao servidor de serviço RESTful.
# 5) Receba uma resposta do servidor.
RestTemplate restTemplate = new RestTemplate(); ResponseEntity response =restTemplate.postForEntity(addURI, entity, String.class);
Nós estamos usando postForEntity para enviar o método POST ao servidor. Recebemos a resposta do objeto ResponseEntity do servidor.
# 6) Verifique a resposta conforme o esperado com a ajuda do código de resposta.
Assert.assertEquals(response.getStatusCode(), HttpStatus.OK);
Aqui, estamos usando a classe de ferramenta Assert do TestNG para verificar o método assertEquals do código de status que compara o valor real, ou seja, response.getStatusCode (), com o valor esperado HttpStatus.OK.
Mas aqui, estamos fazendo mais uma verificação, ou seja, verificando se o funcionário adicionado está presente no corpo de resposta ou não.
Assert.assertTrue(responseBody.contains(employeeId));
Como obtivemos o ID do funcionário?
Para isso, estamos recebendo a ajuda da API do analisador JSON, ou seja, Json-simples.
Estamos usando o analisador JSON, já que o formato JSON é usado para armazenar e trocar os dados entre o cliente e nosso servidor em nosso serviço REST de funcionários. Conforme mencionado anteriormente, os dados JSON são armazenados em valor chave formato. Aqui, queremos obter o 'eu ia' valor.
melhor programa para corrigir erros de registro
Iremos obtê-lo analisando o corpo da resposta da seguinte forma:
JSONParser parser = new JSONParser(); // Instantiate JSONParser object JSONObject jsonResponseObject = new (JSONObject) parser.parse(jsonString); //Parse jsonString i.e. Response body string in json format to JSON object String employeeId = jsonResponseObject.get('id').toString(); // Get id attribute
Então, isso é tudo sobre o teste do método Create.
Métodos de atualização, obtenção e exclusão
- Crie métodos de teste separados e defina cabeçalhos conforme aplicável.
- A verificação do código de status também é feita de forma semelhante.
- A principal diferença são os métodos de envio de uma solicitação aos servidores.
Você pode usar os seguintes métodos:
# 1) Funcionário atualizado : É a solicitação HTTP PUT. O método RestTemplate PUT que você pode usar é:
public void put(String url,Object request, Object... urlVariables) throws RestClientException
# 2) Obtenha o funcionário: É a solicitação HTTP GET. O método RestTemplate GET que você pode usar é o seguinte:
public ResponseEntity getForEntity(String url, Class responseType, Object... urlVariables) throws RestClientException
# 3) Excluir recurso do funcionário: É a solicitação HTTP DELETE. O método RestTemplate DELETE que você pode usar é:
public void delete(String url, Object... urlVariables) throws RestClientException
Além desses métodos, existem os métodos úteis exchange () e execute ().
Por exemplo, se você notar, o método Delete é nulo. Mas se você quiser verificar o corpo da resposta, precisará de uma resposta da execução do método. Para isso, você pode usar o método exchange () que retorna ResponseEntity. Consulte o Estrutura da mola para mais detalhes.
# 5) Executando os testes
Agora, concluímos nossa tarefa de desenvolvimento de script de teste, então vamos executar nossos testes. Basta clicar com o botão direito em TestCRUD.java e selecione a opção ‘Executar como Teste TestNG’ .
Isso exibirá os resultados da execução do teste conforme a seguir.
Saída do console
Observação: Você pode definir seu conjunto de testes em testng.xml arquivo também. Em nosso exemplo, é apenas um script de teste. Mas no cenário real, é sempre uma coleção de vários scripts.
Portanto, seu arquivo testg.xml terá a seguinte aparência:
# 6) Relatórios
Vimos o resultado no console. Mas TestNG fornece resultados de teste em um formato html mais apresentável que pode ser compartilhado com seus stakeholders. Abrir saída de teste -> emailable-report.html no navegador.
Você verá o relatório do teste como segue. Na página de relatório, você pode ver o nome do teste como TestCRUD, vários testes aprovados, ou seja, 4, Número de ignorados e com falha, que são 0 neste caso. Ele também mostra o tempo total necessário para a execução de cada método de teste.
Resultado do teste em formato html
Código do arquivo TestCRUD completo
package com.demo; import java.io.IOException; import java.text.ParseException; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import org.testng.Assert; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import org.testng.log4testng.Logger; /** * This test class has test methods for CRUD actions on REST API * REST Service http://dummy.restapiexample.com/api * * It has test methods for Create , Edit , Get and Delete Employee items * https://docs.spring.io/spring-framework/docs/current/javadoc- api/org/springframework/web/client/RestTemplate.html * https://docs.spring.io/autorepo/docs/spring/3.2.3.RELEASE/javadoc- api/org/springframework/web/client/RestTemplate.html * @author * */ public class TestCRUD { private String responseBody; public String responseBodyPOST; final static Logger logger = Logger.getLogger(TestCRUD.class); //RESTTemplate Object private RestTemplate restTemplate; //Employee ID private String employeeId; // Create Response Entity - Stores HTTPStatus Code, Response Body, etc private ResponseEntity response; @BeforeTest public void beforeTest() throws IOException, ParseException { logger.info('Setting up prerequisite for test execution'); logger.info('Creating RestTemplate object before tests'); this.restTemplate = new RestTemplate(); } /** * Test Method to add employee using HTTP POST request * * Verifies POST action Status Code * * @throws IOException * @throws ParseException */ @Test public void addEmployee() throws IOException, ParseException { String addURI = 'http://dummy.restapiexample.com/api/v1/create'; HttpHeaders headers = new HttpHeaders(); headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json'); logger.info('Add URL :'+addURI); String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}'; System.out.println('
' + jsonBody); HttpEntity entity = new HttpEntity(jsonBody, headers); //POST Method to Add New Employee response = this.restTemplate.postForEntity(addURI, entity, String.class); responseBodyPOST = response.getBody(); // Write response to file responseBody = response.getBody().toString(); System.out.println('responseBody --->' + responseBody); // Get ID from the Response object employeeId = getEmpIdFromResponse(responseBody); System.out.println('empId is :' + employeeId); // Check if the added Employee is present in the response body. Assert.assertTrue(responseBody.contains(employeeId)); // System.out.println(propertyFile.get('EmployeeAddResBody')); // Check if the status code is 201 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); logger.info('Employee is Added successfully employeeId:'+employeeId); } /** * Method to get Employee ID from REsponse body * I have used Json Simple API for Parsing the JSON object * * @param json * @return */ public static String getEmpIdFromResponse(String json) { JSONParser parser = new JSONParser(); JSONObject jsonResponseObject = new JSONObject(); Object obj = new Object(); try { obj = parser.parse(json); } catch (org.json.simple.parser.ParseException e) { e.printStackTrace(); } jsonResponseObject = (JSONObject) obj; String id = jsonResponseObject.get('id').toString(); return id; } /** * Test Method to Update employee using HTTP PUT request * * Verifies PUT action Status Code * Verifies Updated Name exists in Response Body * * @throws IOException * @throws ParseException */ @Test(dependsOnMethods = 'addEmployee', enabled = true) public void updateEmployee() throws IOException, ParseException { String updateURI = 'http://dummy.restapiexample.com/api/v1/update/'+employeeId; logger.info('Update URL :'+updateURI); String jsonBody = responseBodyPOST; jsonBody = jsonBody.replace('zozo100', 'update_zozo100'); HttpHeaders headers = new HttpHeaders(); headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json'); HttpEntity entity = new HttpEntity(jsonBody, headers); //PUT Method to Update the existing Employee //NOTE that I have Not used restTemplate.put as it's void and we need response for verification response = restTemplate.exchange(updateURI, HttpMethod.PUT, entity, String.class); responseBody = response.getBody().toString(); System.out.println('Update Response Body :'+responseBody); // Check if the updated Employee is present in the response body. Assert.assertTrue(responseBody.contains('update_zozo100')); // Check if the status code is 200 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); logger.info('Employee Name is Updated successfully employeeId:'+employeeId); } /** * Test Method to Get employee using HTTP GET request * * Verifies GET action Status Code * Verifies Name exists in Response Body * * @throws IOException * @throws ParseException */ @Test(dependsOnMethods = 'updateEmployee', enabled = true) void getEmployee() throws IOException, ParseException { String getURI = 'http://dummy.restapiexample.com/api/v1/employee/'+this.employeeId; logger.info('Get URL :'+getURI); HttpHeaders headers = new HttpHeaders(); HttpEntity entity = new HttpEntity(headers); //GET Method to Get existing Employee response = restTemplate.getForEntity(getURI,String.class); // Write response to file responseBody = response.getBody().toString(); //Suppressing for log diffs System.out.println('GET Response Body :'+responseBody); // Check if the added Employee ID is present in the response body. Assert.assertTrue(responseBody.contains('update_zozo100')); // Check if the status code is 200 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); logger.info('Employee is retrieved successfully employeeId:'+employeeId); } /** * Test Method to Delete employee using HTTP DELETE request * * Verifies DELETE action Status Code * Verifies Success Message Text in Response Body * * @throws IOException * @throws ParseException */ @Test(dependsOnMethods = 'getEmployee', enabled = true) public void deleteEmployee() throws IOException, ParseException { String delURI = 'http://dummy.restapiexample.com/api/v1/delete/'+this.employeeId; HttpHeaders headers = new HttpHeaders(); HttpEntity entity = new HttpEntity(headers); //DELETE Method to Delete existing Employee response = restTemplate.exchange(delURI, HttpMethod.DELETE, entity, String.class); // Check if the status code is 204 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); responseBody = response.getBody(); Assert.assertEquals(getMessageFromResponse(responseBody), 'successfully! deleted Records'); logger.info('Employee is Deleted successfully employeeId:'+employeeId); } /** * Gets 'text' key value from Response body text for verification * I have used Json Simple API for Parsing the JSON object * * @param json * @return text string */ public static String getMessageFromResponse(String json) { String successMessageText = null; try { JSONParser parser = new JSONParser(); JSONObject jsonResponseObject = new JSONObject(); jsonResponseObject = (JSONObject) (parser.parse(json)); String successMessage = jsonResponseObject.get('success').toString(); jsonResponseObject = (JSONObject) (parser.parse(successMessage)); successMessageText = jsonResponseObject.get('text').toString(); } catch (org.json.simple.parser.ParseException e) { e.printStackTrace(); } return successMessageText; } @AfterTest public void afterTest() { logger.info('Clean up after test execution'); logger.info('Creating RestTemplate object as Null'); this.restTemplate = new RestTemplate(); } }
Conclusão
Resumimos o resultado de aprendizagem deste artigo abaixo. Vimos todas as etapas desde o início para configurar um REST API Test Automation Framework.
Nisto aprendemos o seguinte:
- Para automação de teste, selecionamos Java como linguagem de programação.
- Escolhemos TestNG como a estrutura de teste para criar um script de teste onde consumimos anotações TestNG como @Test.
- Para enviar solicitações HTTP reais ao servidor, consumimos a classe RestTemplate do Spring framework.
- Para consumir essas APIs, instalamos o TestNG, baixamos jars Spring e Json-simple jar para a API do parser.
- Por fim, executamos a classe Test e vimos o resultado no console, bem como em um formato HTML mais apresentável e legível.
Resumindo, neste artigo, aprendemos como começar a usar a automação de teste da API REST com Spring RestTemplate. Cobrimos a configuração de nossa estrutura de automação de teste, começando com a instalação de todos os softwares essenciais, configuração do projeto, desenvolvimento do script de teste até a execução do teste e visualização dos relatórios gerados.
Isso é bastante suficiente para qualquer controle de qualidade de automação para começar com sua estrutura de automação de teste. Mas, vimos apenas as partes necessárias de cada um, por exemplo, usamos a instalação TestNG, método de teste usando a anotação @Test, relatórios. No entanto, TestNG fornece muitos mais recursos, como DataProvider para testes orientados a dados, etc.
Você está pronto para começar a usar a automação de teste de API REST com Spring RestTemplate?
Leitura recomendada
- As 10 melhores ferramentas de teste de API em 2021 (ferramentas de teste de API SOAP e REST)
- Melhores ferramentas de teste de software 2021 (QA Test Automation Tools)
- Download do e-book do Testing Primer
- As 20 perguntas e respostas mais importantes da entrevista de teste de API
- Tornando o teste de API simples com o Katalon Studio
- Tutorial Parasoft SOAtest: ferramenta de teste de API sem script
- Teste de carga com tutoriais HP LoadRunner
- Diferença entre Desktop, Teste de Servidor Cliente e Teste da Web