web services testing using apache http client
Ta vadnica govori o izvajanju različnih CRUD operacij na spletnih storitvah in testiranju spletnih storitev z uporabo odjemalca Apache HTTP:
V tem Popolna serija vadnic za testiranje API smo izvedeli, da spletne storitve delujejo kot medij komunikacije med odjemalskimi in strežniškimi stroji, ki komunicirajo prek omrežja. Vse smo razložili Preizkušanje API-jev s pomočjo POSTMAN-a v naši prejšnji vadnici.
V tem članku bomo poudarili, kako preizkusiti spletne storitve z uporabo odjemalca Apache HTTP in izvajati različne CRUD operacije na spletnih storitvah. Razpravljali bomo tudi o različnih vrstah odjemalcev REST, ki so na voljo za testiranje ozadja.
qa vprašanja za intervju za sveže
Kaj se boste naučili:
Kaj je spletna storitev?
Spletne storitve so medij komunikacije med odjemalskimi in strežniškimi stroji, ki prek omrežja komunicira s pomočjo protokolov HTTP. Spletne storitve so običajno API-ji, ki niso nameščeni ali shranjeni lokalno, vendar so na voljo v oblakih ali nekaterih oddaljenih strežnikih.
Za razumevanje delovanja spletnih storitev si oglejte spodnji primer.
MakeMyTrip in Goibibo.com so nekatera znana spletna mesta za rezervacije letov in hotelov, na voljo pa so različni prodajalci letov, kot so Indigo, Air India in Etihad itd.
Če želi stranka rezervirati let iz New Yorka v London, lahko brska neposredno na portalu prodajalcev letov ali pa rezervira pri neodvisnih ponudnikih. Če rezervirajo pri neodvisnih ponudnikih, kot je MakeMyTrip, in drugih spletnih mestih za rezervacijo, bodo v nekaj sekundah primerjali in prikazali rezultate s podrobnostmi o letu, kot so najnižja cena, čas leta in še veliko več drugih informacij.
Tu se postavlja vprašanje, kako natančno, v nekaj sekundah nam posredujejo informacije? Kaj točno počnejo?
Iz uporabniškega vmesnika vzamejo vse potrebne podatke in jih shranijo v datoteko JSON ali XML ter med razkritjem svojih API-jev pokličejo API-je svojih prodajalcev z žetonom za preverjanje pristnosti, v odgovor pa spletno mesto prodajalca leta pošlje odgovor JSON / XML na MakeMyTrip in pretvorijo prejeti odgovor in prikažejo podrobnosti v uporabniškem vmesniku.
Vrste spletnih storitev
Obstajata dve vrsti spletnih storitev, in sicer
- SOAP API
- REST API
Oglejmo si razlike med tema spletnima storitvama, kot so navedene na spodnji sliki.
Datoteke JSON / XML v spletni storitvi
Naj se sistem S1 vrne v jeziku J2EE, sistem S2 pa v .NET ali Python, in vemo, da se obe tehnologiji popolnoma razlikujeta tudi zaradi varnosti. Kako bo potem sistem S2 delil kodo z drugim sistemom?
Torej, sistem S2 svoje API-je izpostavi sistemu S1, ne da bi izpostavil poslovno logiko, sistem S2 pa za dostop do svojega sistema deli ime API-ja, URL-je API-ja, format API-ja in ključ za preverjanje pristnosti / žeton. Komunikacija poteka med obema sistemoma z uporabo datotek JSON ali XML.
Zakaj samo datoteka JSON / XML?
Datoteke JSON / XML se uporabljajo, ker gre za zbiralce podatkov. Vse posebne informacije so shranjene v oblikah JSON ali XML, saj so lahke in so standardni jezik za komunikacijo med dvema različnima vmesnikoma / platformama ali sistemoma.
Torej, API se vedno uporablja, kadar dva neodvisna sistema sodelujeta med seboj bodisi lokalno, znotraj sistema bodisi prek omrežja.
Kaj je stranka REST?
REST Client je orodje, ki prikliče API-je. Uporablja se pri zalednem testiranju, kadar ni uporabniškega vmesnika za klicanje API-jev. Nekateri priljubljeni odjemalci REST so odjemalci Apache HTTP, POSTMAN, SOAP UI, Swagger in mnogi drugi.
V tem članku bomo obravnavali samo odjemalca Apache HTTP, v prihodnjih člankih pa bomo obravnavali druge različne odjemalce HTTP.
Nastavitev odjemalca Http v Eclipseu
# 1) Odprite Eclipse in ustvarite nov projekt Maven.
#two) Izbrišite lažne pakete, ki jih ponuja MAVEN, tj. “Src / main / java” in “Src / test / java”
# 3) Pojdite na datoteko pom.xml in odstranite odvisnost JUnit, saj je ne potrebujemo.
# 4) Nato potrebujemo knjižnico odjemalca HTTP, knjižnico HTTP Core, knjižnico JSON Parser, knjižnico TestNG, knjižnico Jackson-data bind
# 5) Dodajte zgoraj odvisnosti (knjižnico) v datoteko pom.xml.
Knjižnica odjemalca HTTP:
Knjižnica HTTP:
JSON Parser knjižnica:
Knjižnica TestNG:
# 6) Prenesite najnovejše in stabilne različice. V naš projekt ne bomo dodali kozarca selena, saj izvajamo popolno zaledno testiranje. Končna datoteka pom.xml je videti tako, kot je prikazano na spodnji sliki:
# 7) Nato ustvarite ogrodje za preizkus API-ja
do) Ustvarite paket 'com.qa.config' -> Ustvarite datoteko 'config.properties' in shranite vse URL-je.
b) Ustvarite nov paket »qa.com.base« -> Ustvarite razred 'testBase.java', ki bo nadrejeni razred za vse razrede. Vsebuje skupne funkcije, ki jih uporabljajo vse metode.
c) Ustvarite nov paket 'com.qa.client' in razred 'restClient.java'. Vsebuje kodo za pridobivanje klicev GET, POST, DELETE, PUT.
d) Ustvarite nov paket 'com.qa.data' in razred 'user.java', ki definira različne lastnosti uporabnika.
je) Na koncu ustvarite paket 'com.qa.Test' pod 'src / test / java' in razglasite glavno metodo in funkcije za preizkušanje vseh metod GET, PUT, POST in Delete.
f) Končna struktura okvira bo videti tako, kot je prikazano spodaj:
g) Uporabite lažni API, ki ga ponuja to spletno mesto REQ RES .
Metode HTTP ali CRUD operacije
Oglejmo si različne metode HTTP ali CRUD operacije, ki jih avtomatiziramo.
Spodaj navedene operacije se imenujejo CRUD operacije:
- C : Ustvari (pomeni klic POST)
- R : Pridobi (pomeni PRIDOBI klic)
- U : Posodobitev (pomeni klic PUT)
- D : Delete (pomeni Izbriši klic)
Parametri v spletnih storitvah REST
Preverite ali poudarite spodnje parametre v spletnih storitvah REST:
(i) URI: URI je kombinacija parametra URL + pot in parametra poizvedbe.
Primer: http://api.com/service/account/1
Tukaj, api.com je URL za strežnik S2, storitev je imetnik. Pri tej storitvi gre imetnik na račun razreda in iz tega razreda računa pokliče metodo account = 1. Pri vsakem klicu posredujemo URI.
(ii) koristni tovor: Podatki JSON / XML, ki jih dovajamo v sistem.
(iii) Statusna koda: Za vsak odgovor dobimo statusne kode.
Tukaj je spodaj navedenih nekaj kod:
- 200: Ok, vse deluje v redu.
- 201: Uspešno ustvarjeno, kadar koli kličete POST ali ustvarjate novo entiteto.
- 400: Koristni tovor je napačen, končni URL je napačen, prikazuje slabo zahtevo.
- 404: Posodobite ali izbrišite entiteto in ta entiteta ni na voljo, potem dobimo zahtevo kot ne najdeno zahtevo.
- 500: Recimo, da strežnik S2 ne deluje, dobimo notranjo napako strežnika.
- 401: Napaka preverjanje pristnosti
Kliknite tukaj da dobite vse statusne kode.
(iv) Glave: Tako kot žeton za preverjanje pristnosti, uporabniški ID / geslo, vrsta vsebine itd.
kakšen je najnovejši operacijski sistem
CRUD operacije z odjemalcem Apache HTTP
# 1) GET Call
Kako se obnaša operacija GET Call?
Get Call pošlje zahtevo in prejme odgovor. Tukaj ne posredujemo nobenega JSON-a ali koristnega tovora, ampak en URI, v katerem je URL (parameter poti končne točke, parameter poizvedbe) skupaj z glavo, če je na voljo.
c # vprašanja in odgovori za tehnični intervju
Pred pisanjem kode GET Call upoštevajte naslednje:
- Potrebujete metodo GET
- Potem potrebujete URL
- Ko pritisnete gumb za pošiljanje, boste prejeli odgovor. Nato shranite odgovor.
- Potrebujete kodo stanja, glave.
Oglejte si spodnji posnetek zaslona odjemalca POSTMAN, ki prikazuje GET odgovor na klic:
V razredu restClient.java,
(jaz) Ustvarite metodo GET, ki bo poklicala URL in dobila odgovor v obliki predmeta JSON brez glave.
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) Ustvari glavni razred »getAPITest.java« pod »src / test / java«
Izhod
# 2) POST klic
POST Call ustvari račun ali ustvari novo entiteto.
Primer - Te podatke, kot so ime, opravilo in glava, posredujte v tovor JSON. Strežnik S2 bo povezan z neko bazo podatkov, recimo Oracle, in ima nekaj tabel z imenom Account table. Metoda POST bo ustvarila vnos v zbirko podatkov in strežnik S2 posreduje informacije odjemalcu S1. Ne pozabite, da se operacija klica POST vedno uporablja za ustvarjanje nove entitete.
Pri metodi POST moramo predati URL in koristni tovor.
Prenesite to odvisnost, ker moramo pretvoriti razred Java v objekt Java kot v objekt JSON.
V razredu restClient.java,
(jaz) Ustvari metodo POST, ki bo poklicala URL in objavila odgovor.
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) Ustvarite glavni razred “postAPI_Test.java” pod “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()));} }
Izhod:
# 3) PUT klic
Z operacijo klica PUT lahko ustvarite novo entiteto in posodobite obstoječo entiteto.
V razredu restClient.java,
(jaz) Ustvari metodo PUT, ki bo poklicala URL in posodobila odgovor.
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) Ustvarite glavni razred “putAPI_Test.java” pod “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);}
Izhod
# 4) Izbriši klic
Postopek brisanja klica je preprost, to pomeni, da izbrišete račun id-100 in podatke prenesete v datoteko JSON.
V razredu restClient.java,
(jaz) Ustvari metodo brisanja, ki bo poklicala URL in izbrisala zapis.
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) Ustvarite glavni razred »deleteAPI_Test.java« pod »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'); }
Izhod
Pred potrditvijo kakršnega koli odgovora pridobite pravi URL od razvijalca, nato preverite, ali prejemate pričakovani odgovor s strežnika, pripravite testne primere za vsak scenarij in uredite testne primere v zaporedju s funkcijo w.r.t.
Zaključek
V tem članku smo podrobno opisali, kako uporabljati odjemalca Apache HTTP za avtomatizacijo klicev POST, PUT, GET in Delete s primeri kode. Razpravljali smo tudi o vrstah spletnih storitev in o pomenu datotek JSON / XML ter o tem, zakaj se uporabljajo.
Priporočeno branje
- Vadnica za spletne storitve: Komponente, arhitektura, tipi in primeri
- 15+ vadnic za SoapUI: najboljše orodje za testiranje API-jev za spletne storitve
- Vprašanja in odgovori za intervju s spletnimi storitvami Amazon (AWS)
- 20 najboljših vprašanj in odgovorov o intervjuju za spletne storitve RESTful
- Najboljših 25 vprašanj in odgovorov za intervju za spletne storitve Java
- 45 vprašanj in odgovorov za intervju za spletne storitve (RESTful, SOAP, varnostna vprašanja)
- Testiranje učinkovitosti spletnih storitev s pomočjo skriptov LoadRunner VuGen
- Vadnica za testiranje API-jev: Popoln vodnik za začetnike