web services testing using apache http client
Táto výučba sa týka vykonávania rôznych operácií CRUD vo webových službách a testovania webových služieb pomocou klienta Apache HTTP:
V tomto Kompletná séria výučby testovania API , sme sa dozvedeli, že webové služby fungujú ako médium komunikácie medzi strojmi klienta a servera, ktoré interagujú cez sieť. Všetko sme si vysvetlili Testovanie API pomocou programu POSTMAN v našom predchádzajúcom návode.
V tomto článku zdôrazníme, ako testovať webové služby pomocou klienta Apache HTTP a vykonávať rôzne operácie CRUD vo webových službách. Budú tiež prediskutované rôzne typy klientov REST, ktoré sú k dispozícii na testovanie backendu.
ako spustiť súbor SWF v Chrome
Čo sa dozviete:
Čo je to webová služba?
Webové služby sú médiom komunikácie medzi klientskými a serverovými strojmi, ktoré interaguje v sieti pomocou protokolov HTTP. Webové služby sú všeobecne API, ktoré nie sú nainštalované alebo uložené lokálne, ale sú dostupné v cloudoch alebo na niektorých vzdialených serveroch.
V nasledujúcom príklade nájdete informácie o fungovaní webových služieb.
MakeMyTrip a Goibibo.com sú niektoré zo slávnych webových stránok na rezervácie letov a hotelov. K dispozícii sú rôzni predajcovia letov ako Indigo, Air India a Etihad atď.
Ak si zákazník chce rezervovať let z New Yorku do Londýna, môže listovať priamo na portáli predajcov letov alebo si môže rezervovať let prostredníctvom tretích strán. Ak uskutočňujú rezerváciu prostredníctvom dodávateľov tretích strán, ako je MakeMyTrip a ďalších rezervačných webov, behom niekoľkých sekúnd ich porovnajú a zobrazia výsledky poskytujúce podrobnosti letu, ako je najnižšia cena, čas letu a oveľa viac ďalších informácií.
Tu vyvstáva otázka, ako presne, v priebehu niekoľkých sekúnd, nám poskytujú informácie? Čo presne robia?
Z používateľského rozhrania vezmú všetky potrebné informácie a uložia ich do súboru JSON alebo XML a pri vystavení svojich rozhraní API zavolajú API svojich dodávateľov pomocou autentifikačného tokenu a v reakcii na to stránka predajcu letu odošle späť odpoveď JSON / XML spoločnosti MakeMyTrip a prevádzajú prijatú odpoveď a zobrazujú podrobnosti v používateľskom rozhraní.
Typy webových služieb
Existujú dva typy webových služieb, a to
- SOAP API
- REST API
Pozrime sa na rozdiely medzi týmito dvoma webovými službami, ktoré sú uvedené na nasledujúcom obrázku.
Súbory JSON / XML vo webovej službe
Nech je systém S1 vrátený v jazyku J2EE a systém S2 je vrátený v .NET alebo Python a vieme, že obe technológie sa navzájom úplne líšia, čo sa týka bezpečnosti. Ako potom bude systém S2 zdieľať kód s iným systémom?
Systém S2 teda vystavuje svoje rozhrania API systému S1 bez odhalenia obchodnej logiky a systém S2 zdieľa názov API, adresu URL API, formát API a autentifikačný kľúč / kľúč tokenu na prístup do svojho systému. Komunikácia prebieha medzi týmito dvoma systémami pomocou súborov JSON alebo XML.
Prečo iba súbor JSON / XML?
Používajú sa súbory JSON / XML, pretože ide o zberače údajov. Všetky konkrétne informácie sú uložené buď vo formáte JSON, alebo XML, pretože sú ľahké a sú štandardným jazykom na komunikáciu medzi dvoma rôznymi rozhraniami / platformami alebo systémami.
API sa teda vždy používa, keď dva nezávislé systémy navzájom interagujú, a to buď lokálne, v rámci systému, alebo prostredníctvom siete.
Čo je klient REST?
Klient REST je nástroj, ktorý volá API. Používa sa pri backendovom testovaní, keď neexistuje rozhranie, ktoré by volalo API. Medzi obľúbených klientov REST patria Apache HTTP klient, POSTMAN, SOAP UI, Swagger a mnoho ďalších.
Tu, v tomto článku, sa budeme venovať iba klientom Apache HTTP a v ďalších článkoch sa budeme zaoberať ďalšími rôznymi klientmi HTTP.
Http nastavenie klienta v Eclipse
# 1) Otvorte Eclipse a vytvorte nový projekt Maven.
#dva) Vymažte fiktívne balíčky poskytované MAVENOM t.j. „Src / main / java“ a „Src / test / java“
# 3) Prejdite do súboru pom.xml a odstráňte závislosť JUnit, pretože to nepotrebujeme.
# 4) Potom požadujeme knižnicu klienta HTTP, knižnicu HTTP Core, knižnicu JSON Parser, knižnicu TestNG, knižnicu Jackson-data bind
# 5) Pridajte vyššie uvedené závislosti (knižnica) do súboru pom.xml.
Knižnica klienta HTTP:
Knižnica HTTP Core:
Knižnica analyzátora JSON:
Knižnica TestNG:
# 6) Stiahnite si najnovšiu a stabilnú verziu. Do nášho projektu nepridáme selenovú nádobu, pretože robíme kompletné backendové testovanie. Výsledný súbor pom.xml vyzerá takto:
# 7) Ďalej vytvorte rámec pre svoj test API
do) Vytvorte balík „com.qa.config“ -> Vytvorte súbor „config.properties“ a uložte všetky adresy URL.
b) Vytvoriť ďalší balík „qa.com.base“ -> Vytvorte triedu „testBase.java“, ktorá bude nadradenou triedou pre všetky triedy. Obsahuje bežné funkcie, ktoré môžu používať všetky metódy.
c) Vytvorte ďalší balík „com.qa.client“ a triedu „restClient.java“. Obsahuje kód na načítanie hovorov GET, POST, DELETE, PUT.
d) Vytvorte ďalší balík „com.qa.data“ a triedu „user.java“, ktorý definuje rôzne vlastnosti používateľa.
je) Nakoniec vytvorte balíček „com.qa.Test“ pod „src / test / java“ a deklarujte hlavnú metódu a funkcie na testovanie všetkých metód GET, PUT, POST a Delete.
f) Konečná štruktúra rámca bude vyzerať takto:
g) Použite fiktívne rozhranie API poskytované touto stránkou REQ RES .
Metódy HTTP alebo operácie CRUD
Pozrime sa na rôzne metódy HTTP alebo operácie CRUD, ktoré automatizujeme.
Ďalej uvedené operácie sa nazývajú operácie CRUD:
- C. : Vytvoriť (znamená POST volanie)
- R : Načítať (znamená ZÍSKAŤ)
- U : Aktualizácia (znamená PUT hovor)
- D : Odstrániť (znamená Odstrániť hovor)
Parametre vo webových službách REST
Overte alebo zdôraznite nižšie uvedené parametre vo webových službách REST:
i) URI: URI je kombinácia parametra URL + Cesta a parametra dopytu.
Príklad: http://api.com/service/account/1
Tu, api.com je URL pre server S2, služba je držiteľom. V tejto službe držiteľ ide do účet triedy a z tejto triedy účtu volá metódu account = 1. V každom jednom hovore prechádzame cez URI.
ii) užitočné zaťaženie: Údaje JSON / XML, ktoré dodávame do systému.
(iii) Stavový kód: Za každú odpoveď dostaneme stavové kódy.
Tu je uvedených niekoľko kódov:
- 200: Dobre, všetko funguje dobre.
- 201: Úspešné vytvorenie, kedykoľvek robíte POST alebo vytvárate novú entitu.
- 400: Užitočné zaťaženie je nesprávne, koncová URL je nesprávna, zobrazuje sa zlá požiadavka.
- 404: Aktualizujte alebo odstráňte entitu a táto entita nie je k dispozícii, potom dostaneme výsledok ako nenájdená požiadavka.
- 500: Predpokladajme, že server S2 nefunguje. Dostaneme internú chybu servera.
- 401: Chyba overenia
Kliknite tu získať všetky stavové kódy.
iv) Hlavičky: Rovnako ako autentifikačný token, ID používateľa / heslo, Typ obsahu atď.
ako pridať reťazec do poľa reťazca -
CRUD operácie využívajúce klienta Apache HTTP
# 1) ZÍSKAJTE Volať
Ako sa správa operácia GET Call?
Získať volanie odošle žiadosť a dostane späť odpoveď. Neposielame sem žiaden JSON ani užitočné zaťaženie, odovzdávame jeden URI, v ktorom je adresa URL (parameter cesty koncového bodu, parameter dopytu) spolu s hlavičkou, ak je k dispozícii.
informatica rozhovor otázky a odpovede na 5 rokov skúseností
Pred napísaním kódu GET hovoru nezabudnite na nasledujúce veci:
- Potrebujete metódu GET
- Potom potrebujete adresu URL
- Hneď ako kliknete na tlačidlo odoslať, dostanete odpoveď. Potom uložte odpoveď.
- Potrebujete stavový kód, hlavičky.
Prečítajte si nasledujúcu snímku obrazovky klienta POSTMAN, ktorý zobrazuje odpoveď GET na volanie:
V triede restClient.java,
i) Vytvorte metódu GET, ktorá zavolá adresu URL a získa odpoveď vo forme objektu JSON bez hlavičky.
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) Vytvorte hlavnú triedu „getAPITest.java“ v časti „src / test / java“
Výkon
# 2) POST Volať
POST Call vytvorí účet alebo vytvorí novú entitu.
Príklad - Tieto podrobnosti, ako je meno, úloha a hlavička, odovzdajte do užitočného zaťaženia JSON. Server S2 bude prepojený s nejakou databázou, povedzme Oracle, a má nejaký názov tabuľky, ktorý sa nazýva Tabuľka účtov. Metóda POST vytvorí záznam v databáze a server S2 odovzdá informácie klientovi S1. Pamätajte, že operácia volania POST sa vždy používa na vytvorenie novej entity.
V metóde POST musíme odovzdať adresu URL a užitočné zaťaženie.
Stiahnite si túto závislosť, pretože potrebujeme previesť triedu Java na objekt Java ako na objekt JSON.
V triede restClient.java,
i) Vytvorte metódu POST, ktorá zavolá adresu URL a odošle odpoveď.
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) Vytvorte hlavnú triedu „postAPI_Test.java“ v časti „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()));} }
Výkon:
# 3) PUT Volajte
Pomocou operácie volania PUT môžete vytvoriť novú entitu a aktualizovať existujúcu entitu.
V triede restClient.java,
i) Vytvorte metódu PUT, ktorá zavolá adresu URL a aktualizuje odpoveď.
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) Vytvorte hlavnú triedu „putAPI_Test.java“ v časti „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);}
Výkon
# 4) Odstrániť hovor
Operácia odstránenia hovoru je jednoduchá, t. J. Odstráňte účet s číslom 100 a odošlite informácie do súboru JSON.
V triede restClient.java,
i) Vytvorte metódu odstránenia, ktorá zavolá adresu URL a vymaže záznam.
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) Vytvorte hlavnú triedu „deleteAPI_Test.java“ v časti „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'); }
Výkon
Pred overením akejkoľvek odpovede získajte od vývojára správnu adresu URL, potom skontrolujte, či od servera dostávate očakávanú odpoveď, pripravte testovacie prípady pre každý scenár a usporiadajte testovacie prípady v poradí podľa funkčnosti w.r.t.
Záver
V tomto článku sme sa podrobne venovali tomu, ako používať Apache HTTP klienta na automatizáciu hovorov POST, PUT, GET a Delete s príkladmi kódu. Diskutovali sme tiež o typoch webových služieb a dôležitosti súborov JSON / XML a o tom, prečo sa používajú.
Výukový program PREV | PRVÝ výukový program
Odporúčané čítanie
- Výukový program pre webové služby: Komponenty, architektúra, typy a príklady
- 15+ návodov na SoapUI: najlepší nástroj na testovanie API webových služieb
- Dotaz a odpovede na rozhovor s webovými službami Amazon (AWS)
- Top 20 RESTful Web Services Interview Otázka a odpovede
- Top 25 Java Web Services Interview Otázky a odpovede
- Najvyšších 45 otázok a odpovedí na pohovory s webovými službami (RESTful, SOAP, bezpečnostné otázky)
- Testovanie výkonu webových služieb pomocou skriptovania LoadRunner VuGen
- Výukový program pre testovanie API: Kompletný sprievodca pre začiatočníkov