web services testing using apache http client
Acest tutorial este despre efectuarea diferitelor operațiuni CRUD pe servicii web și testarea serviciilor web utilizând clientul Apache HTTP:
In acest Seria tutorială completă de testare API , am aflat că serviciile web acționează ca un mijloc de comunicare între mașinile client și server care interacționează printr-o rețea. Am explicat totul despre Testarea API folosind POSTMAN în tutorialul nostru anterior.
În acest articol, vom sublinia modul de testare a serviciilor web utilizând clientul Apache HTTP și efectuarea diferitelor operațiuni CRUD pe serviciile web. Vor fi discutate și diferitele tipuri de clienți REST disponibili pentru testarea backend-ului.
cel mai bun instrument de gestionare a cazurilor de test pentru jira
Ce veți învăța:
- Ce este un serviciu web?
- Ce este clientul REST?
- Operații CRUD folosind clientul HTTP Apache
- Concluzie
Ce este un serviciu web?
Serviciile Web sunt un mediu de comunicare între echipamentele client și server care interacționează printr-o rețea cu ajutorul protocoalelor HTTP. Serviciile web sunt în general API-uri care nu sunt instalate sau stocate local, dar sunt disponibile în cloud sau în unele servere la distanță.
Consultați exemplul de mai jos pentru a înțelege cum funcționează serviciile web.
MakeMyTrip și Goibibo.com sunt câteva dintre celebrele site-uri de rezervări de zboruri și hoteluri și există diferiți furnizori de zboruri, precum Indigo, Air India și Etihad etc.
Dacă un client dorește să rezerve un zbor de la New York la Londra, fie poate naviga direct pe portalul furnizorului de zbor, fie poate rezerva prin intermediul unor furnizori terți. Dacă fac rezervări prin intermediul unor furnizori terți precum MakeMyTrip și alte site-uri de rezervare, în câteva secunde vor compara și afișa rezultate oferind detalii despre zbor, cum ar fi cel mai mic preț, timpul de zbor și multe alte informații.
Întrebarea care se pune aici este, cum anume, în câteva secunde ne furnizează informațiile? Ce fac exact?
Din interfața de utilizare, iau toate informațiile necesare și le stochează într-un fișier JSON sau XML și apelează API-urile furnizorului cu un simbol de autentificare pe măsură ce își expun API-urile și, ca răspuns, site-ul furnizorului de zbor trimite înapoi răspunsul JSON / XML către MakeMyTrip și convertesc răspunsul primit și afișează detaliile în interfața de utilizare.
Tipuri de servicii web
Există două tipuri de servicii web și anume
- API SOAP
- API REST
Să vedem diferențele dintre aceste două servicii web așa cum sunt enumerate în imaginea de mai jos.
Fișiere JSON / XML în serviciul web
Permiteți ca sistemul S1 să fie returnat în limbajul J2EE, iar sistemul S2 să fie returnat în .NET sau Python și știm că ambele tehnologii sunt complet diferite una de cealaltă și din motive de securitate. Atunci cum va partaja sistemul S2 codul cu alt sistem?
Deci, sistemul S2 își expune API-urile la sistemul S1 fără a expune logica de afaceri, iar sistemul S2 partajează numele API, URL-ul API, formatul API și cheia de autentificare / cheia Token pentru a-și accesa sistemul. Comunicarea are loc între cele două sisteme folosind fie fișiere JSON, fie XML.
De ce numai fișierul JSON / XML?
Se folosesc fișiere JSON / XML deoarece acestea sunt colectoare de date. Orice informație particulară este stocată fie în format JSON, fie în format XML, deoarece acestea sunt ușoare și sunt un limbaj standard pentru a comunica între două interfețe / platforme sau sisteme diferite.
Deci, API-ul este întotdeauna utilizat atunci când două sisteme independente interacționează între ele, fie local, în cadrul sistemului, fie prin rețea.
Ce este clientul REST?
REST Client este un instrument care apelează API-urile. Este utilizat în testarea backend-ului atunci când nu există o interfață de utilizare pentru a apela API-urile. Unii clienți REST populari sunt clientul HTTP Apache, POSTMAN, SOAP UI, Swagger și multe altele.
Aici, în acest articol, vom discuta numai despre clientul HTTP Apache și vom acoperi alți clienți HTTP diferiți în articolele noastre viitoare.
Configurarea clientului Http în Eclipse
# 1) Deschide Eclipse și creează un nou proiect Maven.
#Două) Ștergeți pachetele fictive furnizate de MAVEN i.e. „Src / main / java” și „Src / test / java”
# 3) Accesați fișierul pom.xml și eliminați dependența JUnit deoarece nu avem nevoie de el.
# 4) Apoi, avem nevoie de biblioteca HTTP Client, biblioteca HTTP Core, biblioteca JSON Parser, biblioteca TestNG, biblioteca Jackson-data bind
# 5) Adăugați dependențele de mai sus (biblioteca) în fișierul pom.xml.
Biblioteca client HTTP:
Biblioteca de bază HTTP:
Biblioteca JSON Parser:
Biblioteca TestNG:
# 6) Descărcați cele mai recente versiuni stabile. Nu vom adăuga borcan de seleniu în proiectul nostru, deoarece facem teste complete de backend. Fișierul final pom.xml arată așa cum se arată în imaginea de mai jos:
# 7) Apoi, creați un cadru pentru testul API
la) Creați un pachet „com.qa.config” -> Creați un fișier „config.properties” și stocați toate adresele URL.
b) Creați un alt pachet „qa.com.base” -> Creați o clasă „testBase.java” care va fi o clasă părinte pentru toate clasele. Conține funcții comune pentru a fi utilizate de toate metodele.
c) Creați un alt pachet „com.qa.client” și clasa „restClient.java”. Acesta conține cod pentru a prelua apeluri GET, POST, DELETE, PUT.
d) Creați un alt pachet „com.qa.data” și clasa „user.java” care definește diferite proprietăți ale utilizatorului.
este) În cele din urmă, creați un pachet „com.qa.Test” sub „src / test / java” și declarați o metodă principală și funcții pentru a testa toate metodele GET, PUT, POST și Delete.
f) Structura cadrului final va arăta după cum se arată mai jos:
g) Utilizați API fictiv furnizat de acest site REQ RES .
Metode HTTP sau operațiuni CRUD
Să vedem diferite metode HTTP sau operații CRUD pe care le automatizăm.
Operațiunile de mai jos sunt denumite operații CRUD:
- C : Creați (înseamnă apel POST)
- R : Preluare (înseamnă apel GET)
- U : Actualizare (înseamnă apel PUT)
- D : Șterge (înseamnă Șterge apel)
Parametri în serviciile web REST
Validați sau subliniați parametrii de mai jos din serviciile web REST:
(i) URI: URI este combinația dintre parametrul URL + cale și parametrul de interogare.
Exemplu: http://api.com/service/account/1
Aici, api.com este adresa URL a serverului S2, serviciu este titularul. În acest serviciu, titularul merge la cont class, iar din această clasă de cont, apelează metoda account = 1. În fiecare apel, trecem URI-ul.
(ii) Sarcina utilă: Datele JSON / XML pe care le alimentăm sistemului.
(iii) Cod de stare: Pentru fiecare răspuns, primim codurile de stare.
Aici, câteva coduri sunt enumerate mai jos:
- 200: Ok, totul funcționează bine.
- 201: Creat cu succes, ori de câte ori efectuați un apel POST sau creați o entitate nouă.
- 400: Sarcina utilă este greșită, adresa URL finală este greșită, afișează o cerere greșită.
- 404: Actualizați sau ștergeți o entitate și entitatea respectivă nu este disponibilă, atunci obținem rezultatul ca cerere care nu a fost găsită.
- 500: Să presupunem că serverul S2 este defect, vom primi o eroare internă a serverului.
- 401: Eroare de autentificare
Clic Aici pentru a obține toate codurile de stare.
(iv) Anteturi: De exemplu jeton de autentificare, ID utilizator / parolă, tip conținut etc.
Întrebări și răspunsuri la interviu PHP pentru o experiență de 2 ani
Operații CRUD folosind clientul HTTP Apache
# 1) GET Call
Cum se comportă operația GET Call?
Primirea apelului trimite cererea și primește înapoi răspunsul. Nu trecem niciun JSON sau sarcina utilă aici, trecem un URI, în care URL (parametru cale finală, parametru interogare) împreună cu antet, dacă este disponibil.
downloader video gratuit de pe orice versiune completă a site-ului
Înainte de a scrie codul de apel GET, rețineți lucrurile de mai jos:
- Aveți nevoie de o metodă GET
- Apoi, aveți nevoie de o adresă URL
- Odată apăsat butonul de trimitere, veți primi răspunsul. Apoi stocați răspunsul.
- Aveți nevoie de cod de stare, anteturi.
Consultați imaginea de mai jos a clientului POSTMAN care afișează răspunsul la apel GET:
În clasa restClient.java,
(i) Creați metoda GET care va apela adresa URL și obține răspunsul sub formă de obiect JSON fără antet.
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) Creați clasa principală „getAPITest.java” sub „src / test / java”
Ieșire
# 2) Apel POST
POST Call creează un cont sau creează o entitate nouă.
Exemplu - Transmiteți aceste detalii precum numele, jobul și antetul la sarcina utilă JSON. Serverul S2 va fi conectat la o bază de date, spun Oracle și are un nume de tabel numit Cont tabel. Metoda POST va crea o intrare în baza de date și serverul S2 transmite informațiile clientului S1. Amintiți-vă că, operația de apel POST este întotdeauna utilizată pentru a crea o entitate nouă.
În metoda POST, trebuie să trecem adresa URL și sarcina utilă.
Descărcați această dependență deoarece trebuie să convertim clasa Java în obiect Java decât în obiect JSON.
În clasa restClient.java,
(i) Creați o metodă POST, care va apela adresa URL și va posta răspunsul.
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) Creați clasa principală „postAPI_Test.java” sub „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()));} }
Ieșire:
# 3) Apel PUT
Folosind operația de apel PUT, puteți crea o entitate nouă și puteți actualiza o entitate existentă.
În clasa restClient.java,
(i) Creați o metodă PUT, care va apela adresa URL și va actualiza răspunsul.
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) Creați clasa principală „putAPI_Test.java” sub „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);}
Ieșire
# 4) Ștergeți apelul
Operațiunea de ștergere a apelului este simplă, adică ștergeți contul ID-100 și treceți informațiile într-un fișier JSON.
În clasa restClient.java,
(i) Creați o metodă de ștergere, care va apela URL și șterge înregistrarea.
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) Creați clasa principală „deleteAPI_Test.java” sub „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'); }
Ieșire
Înainte de validarea oricărui răspuns, obțineți adresa URL corectă de la dezvoltator, apoi verificați dacă primiți răspunsul așteptat de la server, pregătiți cazurile de testare pentru fiecare scenariu și aranjați cazurile de testare în funcție de funcționalitatea w.r.t.
Concluzie
În acest articol, am prezentat modul de utilizare a clientului Apache HTTP pentru automatizarea în detaliu a apelurilor POST, PUT, GET și Delete, cu exemple de cod. De asemenea, am discutat despre tipurile de servicii web și despre importanța fișierelor JSON / XML și de ce sunt utilizate.
PREV Tutorial | PRIMUL Tutorial
Lectură recomandată
- Tutorial Servicii Web: componente, arhitectură, tipuri și exemple
- 15+ Tutoriale SoapUI: Cel mai bun instrument de testare API pentru servicii web
- Întrebări și răspunsuri pentru interviuri Amazon Web Services (AWS)
- Top 20 Servicii Web RESTful Întrebare și răspunsuri la interviu
- Top 25 Java Web Services Interviu Întrebări și răspunsuri
- Top 45 Întrebări și răspunsuri pentru interviuri pentru servicii web (RESTful, SOAP, întrebări de securitate)
- Servicii Web Testarea performanței utilizând LoadRunner VuGen Scripting
- Tutorial API de testare: un ghid complet pentru începători