web services testing using apache http client
Ovaj se vodič bavi izvođenjem različitih CRUD operacija na web uslugama i testiranjem web usluga pomoću Apache HTTP klijenta:
U ovome Kompletna serija vodiča za testiranje API-ja , saznali smo da web usluge djeluju kao medij komunikacije između klijentskih i poslužiteljskih strojeva koji komuniciraju putem mreže. Sve smo objasnili API ispitivanje pomoću POSTMAN-a u našem prethodnom vodiču.
U ovom ćemo članku naglasiti kako testirati web usluge pomoću Apache HTTP klijenta i izvoditi različite CRUD operacije na web uslugama. Također će se razgovarati o različitim vrstama REST klijenata dostupnih za pozadinsko testiranje.
što je stablo odluke u rudarstvu podataka
Što ćete naučiti:
Što je web usluga?
Web usluge su medij komunikacije između klijentskih i poslužiteljskih strojeva koji komuniciraju putem mreže uz pomoć HTTP protokola. Web usluge su obično API-ji koji se ne instaliraju ili pohranjuju lokalno, ali su dostupni u oblacima ili na nekim udaljenim poslužiteljima.
Pogledajte donji primjer da biste razumjeli kako funkcioniraju web usluge.
MakeMyTrip i Goibibo.com neke su od poznatih web lokacija za letove i rezervacije hotela, a dostupni su različiti dobavljači letova poput Indigo, Air India i Etihad itd.
Ako kupac želi rezervirati let od New Yorka do Londona, može pregledavati izravno na portalu dobavljača letova ili može rezervirati putem nezavisnih dobavljača. Ako rezerviraju putem dobavljača treće strane kao što je MakeMyTrip i drugih web mjesta za rezervaciju, u roku od nekoliko sekundi usporedit će i prikazati rezultate pružajući detalje o letu poput najniže cijene, vremena leta i mnogo više drugih informacija.
Ovdje se postavlja pitanje, kako nam točno, u roku od nekoliko sekundi pružaju informacije? Što točno rade?
Iz korisničkog sučelja uzimaju sve potrebne podatke i spremaju ih u JSON ili XML datoteku i pozivaju API-je dobavljača s tokenom za provjeru autentičnosti dok izlažu svoje API-je, a kao odgovor web lokacija dobavljača leta vraća natrag JSON / XML odgovor na MakeMyTrip i pretvaraju primljeni odgovor i prikazuju detalje u korisničkom sučelju.
Vrste web usluga
Postoje dvije vrste web usluga, naime
- SOAP API
- REST API
Pogledajmo razlike između ove dvije web usluge kako su navedene na donjoj slici.
JSON / XML datoteke u web usluzi
Neka se S1 sustav vrati na jeziku J2EE, a S2 sustav u .NET ili Python, a znamo da se obje tehnologije potpuno razlikuju jedna od druge zbog sigurnosne brige. Kako će onda sustav S2 podijeliti kôd s drugim sustavom?
Dakle, S2 sustav izlaže svoje API-je sustavu S1 bez izlaganja poslovne logike, a S2 sustav dijeli API ime, API URL, API format i autentifikacijski ključ / ključ tokena za pristup svom sustavu. Komunikacija se događa između dva sustava pomoću datoteka JSON ili XML.
Zašto samo JSON / XML datoteka?
Koriste se JSON / XML datoteke jer su to sakupljači podataka. Sve pojedine informacije pohranjuju se u JSON ili XML formatima, jer su lagani i standardni su jezik za komunikaciju između dva različita sučelja / platforme ili sustava.
Dakle, API se uvijek koristi kada dva neovisna sustava međusobno komuniciraju, bilo lokalno, unutar sustava ili preko mreže.
Što je REST klijent?
REST Client je alat koji poziva API-je. Koristi se u pozadinskom testiranju kada nema korisničkog sučelja za pozivanje API-ja. Neki popularni REST klijenti su Apache HTTP klijent, POSTMAN, SOAP UI, Swagger i mnogi drugi.
Ovdje ćemo u ovom članku raspravljati samo o Apache HTTP klijentu, a u drugim ćemo budućim člancima obrađivati i druge različite HTTP klijente.
Postavljanje HTTP klijenta u Eclipseu
# 1) Otvorite Eclipse i stvorite novi Maven projekt.
#dva) Izbrišite lažne pakete koje pruža MAVEN tj. “Src / main / java” i “Src / test / java”
# 3) Idite na datoteku pom.xml i uklonite ovisnost JUnit jer nam nije potrebna.
# 4) Zatim su nam potrebne knjižnica HTTP klijenta, HTTP temeljna knjižnica, JSON Parser knjižnica, TestNG knjižnica, Jackson-data bind Library
# 5) Dodajte gornje ovisnosti (knjižnicu) u datoteku pom.xml.
Knjižnica HTTP klijenta:
HTTP temeljna knjižnica:
JSON Parser knjižnica:
Biblioteka TestNG:
# 6) Preuzmite najnovije i stabilne verzije. U naš projekt nećemo dodati Selenium staklenku jer provodimo kompletno pozadinsko testiranje. Konačna datoteka pom.xml izgleda kako je prikazano na slici ispod:
# 7) Zatim stvorite okvir za svoj API test
do) Stvorite paket 'com.qa.config' -> Stvorite datoteku 'config.properties' i spremite sve URL-ove.
b) Izradite još jedan paket 'qa.com.base' -> Stvorite klasu 'testBase.java' koja će biti roditeljska klasa za sve klase. Sadrži uobičajene funkcije koje će koristiti sve metode.
c) Izradite drugi paket 'com.qa.client' i klasu 'restClient.java'. Sadrži kôd za dohvaćanje poziva GET, POST, DELETE, PUT.
d) Stvorite drugi paket 'com.qa.data' i klasu 'user.java' koji definira različita korisnička svojstva.
je) Na kraju, stvorite paket 'com.qa.Test' pod 'src / test / java' i proglasite glavnu metodu i funkcije za testiranje svih metoda GET, PUT, POST i Delete.
f) Konačna okvirna struktura izgledat će kao što je prikazano u nastavku:
g) Koristite lažni API koji nudi ova web stranica REQ RES .
HTTP metode ili CRUD operacije
Pogledajmo različite HTTP metode ili CRUD operacije koje automatiziramo.
Ispod navedene operacije nazivamo CRUD operacije:
- C : Stvori (znači POST poziv)
- R : Dohvati (znači DOBITI poziv)
- U : Ažuriranje (znači PUT poziv)
- D : Izbriši (znači Izbriši poziv)
Parametri u REST web uslugama
Potvrdite ili naglasite donje parametre u REST web uslugama:
(i) URI: URI je kombinacija parametra URL + puta i parametra upita.
Primjer: http://api.com/service/account/1
Ovdje, api.com je URL za S2 poslužitelj, servis je držač. U ovoj usluzi, nositelj ide na račun klase i iz ove klase računa poziva metodu account = 1. U svakom pozivu prosljeđujemo URI.
(ii) Korisni teret: JSON / XML podaci koje unosimo u sustav.
(iii) Statusni kod: Za svaki odgovor dobivamo statusne kodove.
Ovdje je u nastavku navedeno nekoliko kodova:
- 200: Ok, sve radi u redu.
- 201: Uspješno stvoreno, svaki put kad pozivate POST ili stvarate novi entitet.
- 400: Korisni teret je pogrešan, krajnji URL je pogrešan, prikazuje loš zahtjev.
- 404: Ažurirajte ili izbrišite entitet i taj entitet nije dostupan, tada dobivamo rezultat kao nenađen zahtjev.
- 500: Pretpostavimo da S2 poslužitelj ne radi, dobit ćemo internu pogrešku poslužitelja.
- 401: Pogreška provjere autentičnosti
Klik ovdje da biste dobili sve statusne kodove.
(iv) Zaglavlja: Poput tokena za provjeru autentičnosti, korisničkog ID-a / lozinke, vrste sadržaja itd.
kako biti programer za početnike
CRUD operacije pomoću Apache HTTP klijenta
# 1) GET Call
Kako se ponaša operacija GET Call?
Get Call šalje zahtjev i dobiva odgovor. Ovdje ne prosljeđujemo JSON ili korisni teret, već prosljeđujemo jedan URI u kojem URL (parametar puta krajnje točke, parametar upita), zajedno sa zaglavljem, ako je dostupan.
java web usluge intervju pitanja i odgovori za iskusne
Prije pisanja GET pozivnog koda, imajte na umu sljedeće:
- Trebate GET metodu
- Zatim trebate URL
- Jednom kada pritisnete gumb za slanje, dobit ćete odgovor. Zatim spremite odgovor.
- Trebate statusni kod, zaglavlja.
Pogledajte donju snimku zaslona POSTMAN klijenta koji prikazuje GET odgovor na poziv:
U klasi restClient.java,
(i) Stvorite GET metodu koja će pozvati URL i dobiti odgovor u obliku JSON objekta bez zaglavlja.
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) Stvorite glavnu klasu 'getAPITest.java' pod 'src / test / java'
Izlaz
# 2) POST poziv
POST Call stvara račun ili kreira novi entitet.
Primjer - Proslijedite ove detalje kao što su ime, posao i zaglavlje JSON-u. S2 poslužitelj bit će povezan s nekom bazom podataka recimo Oracleom i ima neki naziv tablice koji se naziva Account table. POST metoda stvorit će unos u bazi podataka, a S2 poslužitelj prosljeđuje informacije S1 klijentu. Imajte na umu da se operacija poziva POST uvijek koristi za stvaranje novog entiteta.
U POST metodi moramo proslijediti URL i korisni teret.
Preuzmite ovu ovisnost jer trebamo pretvoriti Java klasu u Java objekt nego u JSON objekt.
U klasi restClient.java,
(i) Stvorite POST metodu koja će pozvati URL i poslati 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) Stvorite glavnu klasu '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()));} }
Izlaz:
# 3) PUT poziv
Korištenjem operacije poziva PUT možete stvoriti novi entitet i ažurirati postojeći entitet.
U klasi restClient.java,
(i) Stvorite PUT metodu koja će pozvati URL i ažurirati 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) Stvorite glavnu klasu “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);}
Izlaz
# 4) Izbriši poziv
Operacija brisanja poziva je jednostavna, tj. Izbrišite račun id-100 i proslijedite podatke u JSON datoteku.
U klasi restClient.java,
(i) Stvorite metodu brisanja koja će pozvati URL i izbrisati 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) Stvorite glavnu klasu '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'); }
Izlaz
Prije validacije bilo kojeg odgovora, od programera nabavite točan URL, a zatim provjerite dobivate li očekivani odgovor od poslužitelja, pripremite test slučajeve za svaki scenarij i uredite test slučajeve u slijedu w.r.t funkcionalnosti.
Zaključak
U ovom smo članku detaljno opisali kako koristiti Apache HTTP klijent za automatizaciju poziva POST, PUT, GET i Delete s primjerima koda. Također smo razgovarali o vrstama web usluga i važnosti JSON / XML datoteka i zašto se one koriste.
Preporučena literatura
- Vodič za web usluge: Komponente, arhitektura, vrste i primjeri
- 15+ vodiča za SoapUI: Najbolji alat za testiranje API-ja za web usluge
- Pitanja i odgovori za internetske usluge Amazon Web Services (AWS)
- Top 20 RESTful pitanja i odgovora za internetske usluge
- Top 25 pitanja i odgovora za intervju za internetske usluge Java
- Vrh 45 pitanja i odgovora za internetske usluge (RESTful, SOAP, sigurnosna pitanja)
- Testiranje izvedbe web usluga pomoću LoadRunner VuGen skriptiranja
- Vodič za API testiranje: Cjelovit vodič za početnike