web services testing using apache http client
Este tutorial é sobre como realizar várias operações CRUD em serviços da Web e como testar serviços da Web usando o cliente Apache HTTP:
Nisso Série completa de tutoriais de teste de API , aprendemos que os serviços da Web atuam como um meio de comunicação entre as máquinas cliente e servidor que interagem em uma rede. Explicamos tudo sobre Teste de API usando POSTMAN em nosso tutorial anterior.
Neste artigo, enfatizaremos como testar Web Services usando o cliente Apache HTTP e realizar diferentes operações CRUD em Web Services. Os diferentes tipos de clientes REST disponíveis para teste de back-end também serão discutidos.
melhor software vm para windows 10
O que você aprenderá:
- O que é um serviço da Web?
- O que é cliente REST?
- Operações CRUD usando o cliente Apache HTTP
- Conclusão
O que é um serviço da Web?
Os serviços da Web são um meio de comunicação entre máquinas cliente e servidor que interagem em uma rede com a ajuda de protocolos HTTP. Os serviços da Web geralmente são APIs que não são instalados ou armazenados localmente, mas estão disponíveis em nuvens ou em alguns servidores remotos.
Consulte o exemplo abaixo para entender como funcionam os serviços da web.
MakeMyTrip e Goibibo.com são alguns dos famosos sites de reserva de voos e hotéis e existem diferentes fornecedores de voos disponíveis, como Indigo, Air India e Etihad, etc.
Se um cliente deseja reservar um voo de Nova York a Londres, ele pode navegar diretamente no portal do fornecedor de voos ou fazer a reserva por meio de fornecedores terceirizados. Se eles estiverem reservando por meio de fornecedores terceirizados, como MakeMyTrip e outros sites de reservas, em poucos segundos eles irão comparar e mostrar os resultados, fornecendo detalhes do voo, como preço mais baixo, tempo de voo e muito mais informações.
A questão que se coloca aqui é: como exatamente, em segundos, eles estão nos fornecendo as informações? O que exatamente eles fazem?
Da IU, eles pegam todas as informações necessárias e as armazenam em um arquivo JSON ou XML e chamam as APIs de seus fornecedores com um token de autenticação conforme expõem suas APIs e, em resposta, o site do fornecedor de voos envia de volta uma resposta JSON / XML para MakeMyTrip, e eles convertem a resposta recebida e exibem detalhes na IU.
Tipos de serviços da Web
Existem dois tipos de serviços da web, a saber
- API SOAP
- API REST
Vamos ver as diferenças entre esses dois serviços da web, conforme listado na imagem abaixo.
Arquivos JSON / XML no serviço da web
Deixe que o sistema S1 seja retornado em linguagem J2EE e o sistema S2 seja retornado em .NET ou Python e sabemos que ambas as tecnologias são completamente diferentes uma da outra no que diz respeito à segurança também. Então, como o sistema S2 compartilhará o código com outro sistema?
Portanto, o sistema S2 expõe suas APIs ao sistema S1 sem expor a lógica de negócios, e o sistema S2 compartilha o nome da API, URL da API, formato da API e chave de autenticação / chave token para acessar seu sistema. A comunicação acontece entre os dois sistemas usando arquivos JSON ou XML.
Por que apenas arquivo JSON / XML?
Arquivos JSON / XML são usados porque são coletores de dados. Qualquer informação particular é armazenada nos formatos JSON ou XML, já que são leves e são linguagem padrão para a comunicação entre duas interfaces / plataformas ou sistemas diferentes.
Portanto, a API é sempre usada quando dois sistemas independentes interagem entre si, seja localmente, dentro do sistema ou através da rede.
O que é o cliente REST?
Cliente REST é uma ferramenta que chama as APIs. É usado em testes de back-end quando não há IU para chamar as APIs. Alguns clientes REST populares são o cliente Apache HTTP, POSTMAN, SOAP UI, Swagger e muitos mais.
Aqui, neste artigo, discutiremos apenas o cliente Apache HTTP e cobriremos outros clientes HTTP diferentes em nossos artigos futuros.
Configuração do cliente Http no Eclipse
# 1) Abra o Eclipse e crie um novo projeto Maven.
#dois) Exclua os pacotes fictícios fornecidos pelo MAVEN, ou seja, “Src / main / java” e “Src / test / java”
# 3) Vá para o arquivo pom.xml e remova a dependência JUnit, pois não precisamos dela.
# 4) Em seguida, exigimos a biblioteca cliente HTTP, biblioteca HTTP Core, biblioteca JSON Parser, biblioteca TestNG, biblioteca Jackson-data bind
# 5) Adicione as dependências acima (biblioteca) no arquivo pom.xml.
Biblioteca de cliente HTTP:
Biblioteca HTTP Core:
Biblioteca JSON Parser:
Biblioteca TestNG:
# 6) Baixe as versões mais recentes e estáveis. Não adicionaremos Selenium jar em nosso projeto, pois estamos fazendo testes de back-end completos. O arquivo pom.xml final se parece com o mostrado na imagem abaixo:
# 7) Em seguida, crie uma estrutura para seu teste de API
para) Crie um pacote “com.qa.config” -> Crie um arquivo “config.properties” e armazene todos os URLs.
b) Crie outro pacote “qa.com.base” -> Crie uma classe “testBase.java” que será uma classe pai para todas as classes. Ele contém funções comuns a serem usadas por todos os métodos.
c) Crie outro pacote “com.qa.client” e classe “restClient.java”. Contém código para buscar chamadas GET, POST, DELETE e PUT.
d) Crie outro pacote “com.qa.data” e classe “user.java” que define diferentes propriedades do usuário.
é) Finalmente, crie um pacote “com.qa.Test” em “src / test / java” e declare um método principal e funções para testar todos os métodos GET, PUT, POST e Delete.
f) A estrutura final do framework será semelhante à mostrada abaixo:
g) Use a API fictícia fornecida por este site REQ RES .
Métodos HTTP ou operações CRUD
Vamos ver diferentes métodos HTTP ou operações CRUD que automatizamos.
As operações listadas abaixo são chamadas de operações CRUD:
- C : Criar (significa chamada POST)
- R : Recuperar (significa GET chamada)
- você : Atualizar (significa PUT call)
- D : Excluir (significa Excluir chamada)
Parâmetros em serviços da Web REST
Valide ou enfatize os parâmetros abaixo nos serviços da Web REST:
(i) URI: URI é a combinação do parâmetro URL + Caminho e o parâmetro de consulta.
Exemplo: http://api.com/service/account/1
Aqui, api.com é o URL do servidor S2, serviço é o titular. Nesse serviço, o titular vai até o conta classe, e desta classe de conta, ele chama o método conta = 1. Em cada chamada, passamos o URI.
(ii) Carga útil: Dados JSON / XML que fornecemos ao sistema.
(iii) Código de status: Para cada resposta, obtemos os códigos de status.
Aqui, alguns códigos estão listados abaixo:
- 200: Ok, tudo está funcionando bem.
- 201: Criado com sucesso, sempre que você estiver fazendo uma chamada POST ou criando uma nova entidade.
- 400: A carga útil está errada, o URL final está errado, mostra uma solicitação incorreta.
- 404: Atualize ou exclua uma entidade e essa entidade não estiver disponível, então obtemos o resultado como solicitação não encontrada.
- 500: Suponha que o servidor S2 esteja desativado, obtemos um erro interno do servidor.
- 401: Erro de autenticação
Clique aqui para obter todos os códigos de status.
(iv) Cabeçalhos: Como token de autenticação, ID de usuário / senha, tipo de conteúdo, etc.
dispositivo virtual balanceador de carga de código aberto
Operações CRUD usando o cliente Apache HTTP
# 1) GET Call
Como a operação GET Call se comporta?
Get Call envia a solicitação e recebe de volta a resposta. Não passamos nenhum JSON ou carga útil aqui, passamos um URI, em que URL (parâmetro de caminho de endpoint, parâmetro de consulta) junto com o cabeçalho, se disponível.
como se tornar um testador de produtos
Antes de escrever o código de chamada GET, tenha em mente os itens abaixo:
- Precisa de um método GET
- Então precisa de um URL
- Depois de clicar no botão enviar, você receberá a resposta. Em seguida, armazene a resposta.
- Precisa de código de status, cabeçalhos.
Consulte a captura de tela abaixo do cliente POSTMAN que exibe a resposta da chamada GET:
Na classe restClient.java,
(eu) Crie o Método GET que irá chamar a URL e obter a resposta na forma de objeto JSON sem Cabeçalho.
package com.qa.Client; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; import org.apache.http.Header; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.json.JSONException; import org.json.JSONObject; public class restClient { // create GET Method, which will call the URL and get the response in the form of JSON object without Header public CloseableHttpResponse getMethod(String Url) throws ClientProtocolException, IOException, JSONException{ /*Call HTTPClients class from HTTPClient library added in POM.xml. Call createDefault() method present in HTTPClients class, which will create a client connection. And this createDefault() method returns 'CloseableHttpClient' object which is an abstract class. And we are creating a reference to that abstract class */ CloseableHttpClient httpClient=HttpClients.createDefault(); /*create an object for HttpGet class, which is used for HTTP GET Request. And pass the URL which is to be loaded*/ HttpGet htttpGet = new HttpGet(Url); /*execute the HTTP GET Request, means it will hit the GET API call as we click SEND button from POSTMAN client. httpClient.execute() method returns the response 'CloseableHttpResponse' interface and store it in reference variable So the complete response is stored in CloseableHttpResponse And fetch all the details, in our test case/test method */ CloseableHttpResponse closeableHttpResponse = httpClient.execute(htttpGet); return closeableHttpResponse; } }
(ii) Crie a classe principal “getAPITest.java” em “src / test / java”
Resultado
# 2) PÓS-CHAMADA
POST Call cria uma conta ou cria uma nova entidade.
Exemplo - Passe esses detalhes como nome, trabalho e cabeçalho para a carga JSON. O servidor S2 será vinculado a algum banco de dados, digamos Oracle, e terá algum nome de tabela chamado Tabela de contas. O método POST irá criar uma entrada no banco de dados e o servidor S2 passa a informação para o cliente S1. Lembre-se de que a operação de chamada POST é sempre usada para criar uma nova entidade.
No método POST, temos que passar a URL e a carga útil.
Baixe esta dependência, pois precisamos converter a classe Java para o objeto Java do que para o objeto JSON.
Na classe restClient.java,
(eu) Crie o método POST, que irá chamar a URL e postar a resposta.
public class restClient { public CloseableHttpResponse POST(String url,String entityString,HashMap headermap) throwsClientProtocolException, IOException{ /*Call HTTPClients class from HTTPClient library added in POM.xml and createDefault() method present in HTTPClients class, which will create a client connection and this createDefault() method returns 'CloseableHttpClient' object which is an abstract class and we are creating reference to that abstract class */ CloseableHttpClient httpClient=HttpClients.createDefault(); /*create an object for HttpPost class, which is used for HTTP POST Request and pass the URL which is to be loaded */ HttpPost htttpPost = new HttpPost(url); /*define pay load, use setEnity method present in HTTPPOST class and pass the payload entity */ htttpPost.setEntity(new StringEntity(entityString)); //Create a for loop and iterate the hashmap, and store the header for(Map.Entry entry : headermap.entrySet()){ htttpPost.addHeader(entry.getKey(),entry.getValue()); } //Execute the POST request CloseableHttpResponse closeableHttpResponse = httpClient.execute(htttpPost); return closeableHttpResponse; } }
(ii) Crie a classe principal “postAPI_Test.java” em “src / test / java”.
//Inherit testBase class public class postAPI_Test extends testBase { //Create global methods testBase testbase; String serviceURL; String apiURL; String URL; restClient restClient; HttpResponse closeableHttpResponse; // In before method call the properties file @BeforeMethod public void setUp() throws ClientProtocolException, IOException, JSONException{ //call the constructor of base class and execute the properties file testbase = new testBase(); serviceURL = prop.getProperty('URL'); apiURL = prop.getProperty('serviceURL'); URL = serviceURL+apiURL; } //Main method which calls the GET method @Test public void POSTAPITest() throws ClientProtocolException, IOException, JSONException{ restClient = new restClient(); //Pass the Request Header HashMap headrMap = new HashMap(); headrMap.put('Content-Type', 'application/json'); /*Use Jackson API for doing marshaling, means converting java to java object to JSON Object and vice versa Use ObjectMapper class */ ObjectMapper mapper = new ObjectMapper(); //Create object of Users class, expected users users user = new users('John','Manager'); //Convert java object 'user' to JSON Object using writeValue(), pass the path where to store the JSON file and the object to be converted */ mapper.writeValue(new File('.\data\users.json'), user ); //convert java object to json in string String userJsonString = mapper.writeValueAsString(user); System.out.println(userJsonString); //Call the POST Method closeableHttpResponse = restClient.POST(URL, userJsonString, headrMap); //Fetches status, header, and JSON response from CloseableHttpResponse //1.Fetch Status Code int statusCode = closeableHttpResponse.getStatusLine().getStatusCode();//Get the Status code System.out.println('Status Code --->' +statusCode); //Validate the status code using Assert class Assert.assertEquals(statusCode, response_Status_Code_201,'Status is not 200'); /*2.Fetch the JSON String use EntityUtils class and call to String method, where we have to pass entity and format entity is available in closeableHttpResponse and pass UTF-8 format because we want pure string so complete JSON will be stored in a String, so we need to convert an entire string into a JSON object */ String responseString = EntityUtils.toString(closeableHttpResponse.getEntity(), 'UTF-8'); /*as we added one JSON library, from that library call JSON class and pass the response string. So this JSON object converts the string into JSON */ JSONObject responseJson = new JSONObject(responseString); System.out.println('Response JSONfrom API --->'+responseJson); /*Convert JSON to java actual User Object we are getting */ users userResObj = mapper.readValue(responseString, users.class); Assert.assertTrue(user.getName().equals(userResObj.getName())); Assert.assertTrue(user.getJob().equals(userResObj.getJob()));} }
Resultado:
# 3) PUT Call
Usando a operação de chamada PUT, você pode criar uma nova entidade e atualizar uma entidade existente.
Na classe restClient.java,
(eu) Crie o método PUT, que chamará a URL e atualizará a resposta.
public class restClient { public CloseableHttpResponse PUT(String url,String entityString,HashMap headermap) throwsClientProtocolException, IOException{ /*Call HTTPClients class from HTTPClient library added in POM.xml. Call createDefault() method present in HTTPClients class, which will create a client connection and this createDefault() method returns 'CloseableHttpClient' object which is an abstract class and we are creating reference to that abstract class*/ CloseableHttpClient httpClient=HttpClients.createDefault(); /*create an object for HttpPut class, which is used for HTTP PUT Request and pass the URL which is to be loaded */ HttpPut htttpPut = new HttpPut(url); /*define pay load, use setEnity method present in HTTPPUT class and pass the payload entity */ htttpPut.setEntity(new StringEntity(entityString)); /*create a for loop, iterate and store the header */ for(Map.Entry entry : headermap.entrySet()){ htttpPut.addHeader(entry.getKey(),entry.getValue()); } //Execute the PUT request CloseableHttpResponse closeableHttpResponse = httpClient.execute(htttpPut); return closeableHttpResponse; } }
(ii) Crie a classe principal “putAPI_Test.java” em “src / test / java”
//Inherit testBase class public class putAPI_Test extends testBase { //Create global methods testBase testbase; String serviceURL; String apiURL; String URL; restClient restClient; HttpResponse closeableHttpResponse; // in before method call the properties file @BeforeMethod public void setUp() throws ClientProtocolException, IOException, JSONException{ //Call the constructor of the base class and execute the properties file testbase = new testBase(); serviceURL = prop.getProperty('URL'); apiURL = prop.getProperty('serviceURL'); URL = serviceURL+apiURL; } //Main method which calls PUT method @Test public void PUTAPITest() throws ClientProtocolException, IOException, JSONException{ restClient = new restClient(); //Pass the Request Header HashMap headrMap = new HashMap(); headrMap.put('Content-Type', 'application/json'); /*use Jackson API, for doing marshaling means converting java to java object to JSON Object and vice versa, use ObjectMapper class */ ObjectMapper mapper = new ObjectMapper(); //Create object of Users class, new users users user = new users('JohnMarry Dicosta','HRManager'); /*Convert java object 'user' to JASON Object using writeValue() and pass the path where to store the JSON file and the object to be converted */ mapper.writeValue(new File('.\data\users.json'), user ); //convert java object - > JSON - >String String userJsonString = mapper.writeValueAsString(user); System.out.println(userJsonString); //Call the PUT Method closeableHttpResponse = restClient.PUT(URL, userJsonString, headrMap); /*fetch status, header, JSON response from CloseableHttpResponse Fetch Status Code */ int statusCode = closeableHttpResponse.getStatusLine().getStatusCode(); System.out.println('Status Code --->' +statusCode); //Validate the status code using Assert class Assert.assertEquals(statusCode, response_Status_Code_200,'Status is 200'); /*2.Fetch the JSON String, use EntityUtils class and call to String method where we have to pass entity and format entity is available in closeableHttpResponse and pass UTF-8 format because we want a pure string. So complete JSON will be stored in a String, so we need to convert an entire string into a JSON object */ String responseString = EntityUtils.toString(closeableHttpResponse.getEntity(), 'UTF-8'); /* From JSON library, call JSON class and pass the response string. This JSON object converts the string to JSON */ JSONObject responseJson = new JSONObject(responseString); System.out.println('Response JSONfrom API --->'+responseJson);}
Resultado
# 4) Excluir chamada
A operação de exclusão da chamada é simples, ou seja, exclua o ID da conta-100 e passe as informações em um arquivo JSON.
Na classe restClient.java,
(eu) Crie o método Delete, que chamará URL e excluirá o registro.
public CloseableHttpResponse Delete(String url) throws ClientProtocolException, IOException{ /*Call HTTPClients class from HTTPClient library added in POM.xml and createDefault() method present in HTTPClients class, which will create a client connection and this createDefault() method returns 'CloseableHttpClient' object which is an abstract class and we are creating reference to that abstract class */ CloseableHttpClient httpClient=HttpClients.createDefault(); /*create an object for HttpDelete class, which is used for HTTP Delete Request, and pass the URL to be loaded*/ HttpDelete htttpDelete = new HttpDelete(url); //execute Delete request CloseableHttpResponse closeableHttpResponse =httpClient.execute(htttpDelete); return closeableHttpResponse; }
(ii) Crie a classe principal “deleteAPI_Test.java” em “src / test / java”.
public class deleteAPI_Test extends testBase { //Create global methods testBase testbase; String serviceURL; String deleteuserUrl; String URL; restClient restClient; HttpResponse closeableHttpResponse; // In before method call the properties file @BeforeMethod public void setUp() throws ClientProtocolException, IOException, JSONException{ //call the constructor of the base class and execute the properties file testbase = new testBase(); serviceURL = prop.getProperty('URL'); deleteuserUrl = prop.getProperty('deleteuser'); URL = serviceURL+deleteuserUrl; } //The Main method which calls the Delete method @Test public void deleteAPI() throws ClientProtocolException, IOException, JSONException{ restClient = new restClient(); //Method returns closeableHttpResponse type closeableHttpResponse = restClient.Delete(URL); /*fetch status code, header, JSON response from CloseableHttpResponse -Fetch Status Code */ int statusCode = closeableHttpResponse.getStatusLine().getStatusCode(); System.out.println('Status Code --->' +statusCode); //Validate the status code using Assert class Assert.assertEquals(statusCode, response_Status_Code_204,'Status is 204 No Content'); }
Resultado
Antes de validar qualquer resposta, obtenha a URL correta do desenvolvedor e, em seguida, verifique se está obtendo a resposta esperada do servidor, prepare os casos de teste para cada um dos cenários e organize os casos de teste na sequência da funcionalidade w.r.t.
Conclusão
Neste artigo, cobrimos como usar o cliente Apache HTTP para automatizar chamadas POST, PUT, GET e Delete em detalhes com exemplos de código. Também discutimos os tipos de serviços da web e a importância dos arquivos JSON / XML e por que eles são usados.
PREV Tutorial | PRIMEIRO Tutorial
Leitura recomendada
- Tutorial de serviços da Web: componentes, arquitetura, tipos e exemplos
- Mais de 15 tutoriais SoapUI: a melhor ferramenta de teste de API de serviços da Web
- Perguntas e respostas da entrevista da Amazon Web Services (AWS)
- As 20 principais perguntas e respostas da entrevista sobre serviços da Web RESTful
- As 25 principais perguntas e respostas da entrevista sobre Java Web Services
- 45 principais perguntas e respostas da entrevista sobre serviços da Web (RESTful, SOAP, perguntas de segurança)
- Teste de desempenho de serviços da Web usando script LoadRunner VuGen
- Tutorial de teste de API: um guia completo para iniciantes