web services testing using apache http client
Denne veiledningen handler om å utføre forskjellige CRUD-operasjoner på webtjenester og teste webtjenester ved hjelp av Apache HTTP-klient:
I dette Komplett API Testing Tutorial Series , har vi lært at Web Services fungerer som et kommunikasjonsmedium mellom klient- og servermaskiner som samhandler over et nettverk. Vi forklarte alt om API-testing ved hjelp av POSTMAN i vår forrige opplæring.
I denne artikkelen vil vi legge vekt på hvordan du tester Web Services ved hjelp av Apache HTTP Client og utfører forskjellige CRUD-operasjoner på Web Services. De forskjellige typene REST-klienter som er tilgjengelige for backend-testing, vil også bli diskutert.
oracle 11g ytelsestuning intervju spørsmål
Hva du vil lære:
- Hva er en nettjeneste?
- Hva er REST Client?
- CRUD-operasjoner ved bruk av Apache HTTP-klient
- Konklusjon
Hva er en nettjeneste?
Web Services er et kommunikasjonsmedium mellom klient- og servermaskiner som samhandler over et nettverk ved hjelp av HTTP-protokoller. Webtjenester er vanligvis API-er som ikke er installert eller lagret lokalt, men som er tilgjengelige i skyer eller på noen eksterne servere.
Se eksemplet nedenfor for å forstå hvordan nettjenester fungerer.
MakeMyTrip og Goibibo.com er noen av de berømte nettstedene for fly- og hotellbooking, og det er forskjellige flyselskaper som Indigo, Air India og Etihad, etc.
Hvis en kunde ønsker å bestille en flytur fra New York til London, kan de enten bla direkte på flyselskapets portal, eller så kan de bestille gjennom tredjepartsleverandører. Hvis de bestiller gjennom tredjepartsleverandører som MakeMyTrip og andre bestillingssider, vil de i løpet av få sekunder sammenligne og vise resultater som gir flydetaljer som laveste pris, flytid og mye mer annen informasjon.
Spørsmålet som oppstår her er, hvordan nøyaktig, i løpet av sekunder, de gir oss informasjonen? Hva gjør de akkurat?
Fra brukergrensesnittet tar de all nødvendig informasjon og lagrer den i en JSON- eller XML-fil og ringer leverandør-API-ene sine med et godkjenningstoken når de avslører API-ene sine, og som svar, flyselskapets nettsted sender tilbake JSON / XML-svar til MakeMyTrip, og de konverterer mottatt respons og viser detaljer i brukergrensesnittet.
Typer webtjenester
Det er to typer nettjenester, nemlig
- SOAP API
- REST API
La oss se forskjellene mellom disse to webtjenestene som vist i bildet nedenfor.
JSON / XML-filer i nettjeneste
La S1-systemet returneres på J2EE-språk, og S2-systemet returneres i .NET eller Python, og vi vet at begge teknologiene også er helt forskjellige fra hverandre, med sikkerhetshensyn. Så hvordan vil S2-systemet dele koden med et annet system?
Så, S2-systemet eksponerer sine API-er for S1-systemet uten å eksponere forretningslogikk, og S2-systemet deler API-navn, API-URL, API-format og godkjenningsnøkkel / tokenøkkel for å få tilgang til systemet. Kommunikasjon skjer mellom de to systemene ved hjelp av enten JSON- eller XML-filer.
Hvorfor bare JSON / XML-filer?
JSON / XML-filer brukes fordi disse er datainnsamlere. Spesiell informasjon lagres enten i JSON- eller XML-formater, da disse er lette og de er standardspråk for å kommunisere mellom to forskjellige grensesnitt / plattformer eller systemer.
Så, API brukes alltid når to uavhengige systemer samhandler med hverandre, enten lokalt, i systemet eller over nettverket.
Hva er REST Client?
REST Client er et verktøy som kaller API-ene. Den brukes i backend-testing når det ikke er noe brukergrensesnitt for å ringe API-ene. Noen populære REST-klienter er Apache HTTP-klient, POSTMAN, SOAP UI, Swagger og mange flere.
Her, i denne artikkelen, vil vi bare diskutere Apache HTTP-klient, og vi vil dekke andre forskjellige HTTP-klienter i våre fremtidige artikler.
Http-klientoppsett i formørkelse
#1) Åpne Eclipse og opprett et nytt Maven-prosjekt.
#to) Slett dummy-pakker levert av MAVEN dvs. “Src / main / java” og “Src / test / java”
# 3) Gå til pom.xml-filen og fjern JUnit-avhengigheten ettersom vi ikke trenger den.
# 4) Deretter krever vi HTTP-klientbiblioteket, HTTP-kjernebiblioteket, JSON Parser-biblioteket, TestNG-biblioteket, Jackson-data bind-biblioteket
# 5) Legg til avhengigheter ovenfor (bibliotek) i pom.xml-filen.
HTTP-klientbibliotek:
HTTP Core-bibliotek:
JSON Parser-bibliotek:
TestNG-bibliotek:
# 6) Last ned de nyeste og stabile versjonene. Vi vil ikke legge til en Selen-krukke i prosjektet vårt, ettersom vi gjør fullstendig backend-testing. Den endelige pom.xml-filen ser ut som vist på bildet nedenfor:
# 7) Deretter oppretter du et rammeverk for API-testen din
til) Lag en pakke “com.qa.config” -> Lag en fil 'config.properties' og lagre alle URL-er.
b) Lag en annen pakke “qa.com.base” -> Lag en klasse 'testBase.java' som vil være en overordnet klasse for alle klasser. Den inneholder vanlige funksjoner som skal brukes av alle metoder.
c) Lag en annen pakke “com.qa.client” og klasse “restClient.java”. Denne inneholder koden for å hente GET, POST, SLETT, PUT samtaler.
d) Lag en annen pakke “com.qa.data” og klasse “user.java” som definerer forskjellige brukeregenskaper.
er) Til slutt oppretter du en pakke “com.qa.Test” under “src / test / java” og erklærer en hovedmetode og funksjoner for å teste alle GET-, PUT-, POST- og Delete-metoder.
f) Den endelige rammestrukturen vil se ut som vist nedenfor:
g) Bruk dummy API levert av dette nettstedet REQ RES .
HTTP-metoder eller CRUD-operasjoner
La oss se forskjellige HTTP-metoder eller CRUD-operasjoner som vi automatiserer.
Nedenfor oppførte operasjoner kalles CRUD-operasjoner:
- C : Opprett (betyr POST-samtale)
- R : Hent (betyr GET call)
- U : Oppdatering (betyr PUT-samtale)
- D : Slett (betyr Slett samtale)
Parametere i REST Web Services
Valider eller understreke parametrene nedenfor i REST Web Services:
(i) URI: URI er kombinasjonen av URL + Path-parameteren og spørringsparameteren.
Eksempel: http://api.com/service/account/1
Her, api.com er URL-adressen til S2-serveren, service er holderen. I denne tjenesten går innehaveren til regnskap klasse, og fra denne kontoklassen kaller den metoden konto = 1. I hver samtale passerer vi URI.
(ii) Nyttelast: JSON / XML-data som vi mater til systemet.
(iii) Statuskode: For hvert svar får vi statuskodene.
Her er få koder listet opp nedenfor:
- 200: Ok, alt fungerer bra.
- 201: Opprettet vellykket hver gang du ringer etter POST eller oppretter en ny enhet.
- 400: Nyttelasten er feil, slutt-URL er feil, viser dårlig forespørsel.
- 404: Oppdater eller slett en enhet, og den enheten er ikke tilgjengelig, så får vi resultatet som ikke funnet forespørsel.
- 500: Anta at S2-serveren er nede, vi får en intern serverfeil.
- 401: Godkjenningsfeil
Klikk her for å få alle statuskodene.
(iv) Overskrifter: Som godkjenningstoken, bruker-ID / passord, innholdstype, etc.
tilfeldig tallgenerator 0-1
CRUD-operasjoner ved bruk av Apache HTTP-klient
# 1) FÅ Ring
Hvordan opptrer GET Call-operasjon?
Get Call sender forespørselen og mottar svaret. Vi sender ikke noen JSON eller nyttelasten her, vi sender en URI, der URL (endepunktparameter, spørringsparameter) sammen med overskriften, hvis tilgjengelig.
hvordan kan jeg bli en produkttester
Husk nedenfor ting før du skriver GET-ringekoden:
- Trenger en GET-metode
- Trenger da en URL
- Når du trykker på sendeknappen, får du svaret. Lagre deretter svaret.
- Trenger statuskode, overskrifter.
Se skjermbildet nedenfor av POSTMAN-klienten som viser GET-svar:
I restClient.java-klassen,
(Jeg) Lag GET-metoden som vil ringe URL-en og få svaret i form av JSON-objekt uten overskrift.
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) Opprett hovedklasse “getAPITest.java” under “src / test / java”
Produksjon
# 2) POST-samtale
POST Call oppretter en konto eller oppretter en ny enhet.
Eksempel - Gi disse detaljene som navn, jobb og topptekst til JSON-nyttelasten. S2-serveren vil være koblet til noen database, si Oracle, og har noe tabellnavn som heter Kontotabell. POST-metoden vil opprette en oppføring i databasen, og S2-serveren sender informasjonen til S1-klienten. Husk at POST-samtaleoperasjon alltid brukes til å opprette en ny enhet.
I POST-metoden må vi sende URL-en og nyttelasten.
Last ned denne avhengigheten ettersom vi trenger å konvertere Java-klasse til Java-objekt enn til JSON-objekt.
I restClient.java-klassen,
(Jeg) Opprett POST-metode, som vil ringe URL-en og legge ut svaret.
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) Lag hovedklassen “postAPI_Test.java” under “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()));} }
Produksjon:
# 3) PUT Ring
Ved å bruke PUT-samtalen kan du opprette en ny enhet og oppdatere en eksisterende enhet.
I restClient.java-klassen,
(Jeg) Lag PUT-metode, som vil ringe URL-en og oppdatere svaret.
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) Lag hovedklassen “putAPI_Test.java” under “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);}
Produksjon
# 4) Slett samtalen
Slett samtaleoperasjon er enkel, dvs. slett konto-ID-100 og send informasjonen i en JSON-fil.
I restClient.java-klassen,
(Jeg) Lag slettemetode, som vil ringe URL og slette posten.
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) Opprett hovedklassen “deleteAPI_Test.java” under “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'); }
Produksjon
Før du validerer et svar får du riktig URL fra utvikleren, og deretter sjekker du om du får forventet svar fra serveren, forbereder testtilfeller for hvert eneste scenario og ordner testtilfeller i rekkefølge med funksjonalitet.
Konklusjon
I denne artikkelen har vi dekket hvordan du bruker Apache HTTP Client for å automatisere POST-, PUT-, GET- og Delete-samtaler i detalj med kodeeksempler. Vi har også diskutert typer webtjenester og viktigheten av JSON / XML-filer og hvorfor de brukes.
PREV Opplæring | FØRSTE veiledning
Anbefalt lesing
- Opplæring i webtjenester: komponenter, arkitektur, typer og eksempler
- 15+ SoapUI Tutorials: The Best Web Services API Testing Tool
- Amazon Web Services (AWS) intervjuspørsmål og svar
- Topp 20 RESTful Intervju Spørsmål og svar
- Topp 25 Java Web Services Intervju Spørsmål og svar
- Topp 45 webtjenestesamtaler og spørsmål (RESTful, SOAP, sikkerhetsspørsmål)
- Test av ytelsestjenester ved bruk av LoadRunner VuGen Scripting
- API Testing Tutorial: En komplett guide for nybegynnere