web services testing using apache http client
Denne vejledning handler om udførelse af forskellige CRUD-operationer på webservices og test af webservices ved hjælp af Apache HTTP-klient:
I denne Komplet API-testvejledningsserie , har vi lært, at Web Services fungerer som et kommunikationsmedium mellem klient- og servermaskiner, der interagerer over et netværk. Vi forklarede alt om API-test ved hjælp af POSTMAN i vores tidligere tutorial.
I denne artikel vil vi lægge vægt på, hvordan man tester Web Services ved hjælp af Apache HTTP Client og udfører forskellige CRUD-operationer på Web Services. De forskellige typer REST-klienter, der er tilgængelige til backend-test, vil også blive diskuteret.
hvordan man får sikkerhedsnøgle til wifi
Hvad du lærer:
- Hvad er en webservice?
- Hvad er REST-klient?
- CRUD-operationer ved hjælp af Apache HTTP-klient
- Konklusion
Hvad er en webservice?
Webtjenester er et kommunikationsmedium mellem klient- og servermaskiner, der interagerer over et netværk ved hjælp af HTTP-protokoller. Webtjenester er generelt API'er, der ikke er installeret eller gemt lokalt, men som er tilgængelige i skyer eller på nogle eksterne servere.
Se nedenstående eksempel for at forstå, hvordan webservices fungerer.
MakeMyTrip og Goibibo.com er nogle af de berømte websteder til flyvning og hotelbooking, og der findes forskellige flyselskaber som Indigo, Air India og Etihad osv.
Hvis en kunde ønsker at booke en flyrejse fra New York til London, kan de enten gennemse direkte på flyvesælgerportalen, eller de kan booke gennem tredjepartsleverandører. Hvis de booker via tredjepartsleverandører som MakeMyTrip og andre reservationssider, sammenligner de inden for få sekunder og viser resultater, der giver flyoplysninger som laveste pris, flyvetid og meget mere anden information.
Spørgsmålet opstår her er, hvordan præcist, inden for få sekunder, de giver os oplysningerne? Hvad gør de nøjagtigt?
Fra brugergrænsefladen tager de alle de nødvendige oplysninger og gemmer dem i en JSON- eller XML-fil og kalder deres leverandør-API'er med et godkendelsestoken, da de udsætter deres API'er, og som svar sender flyselskabens websted JSON / XML-svar tilbage til MakeMyTrip, og de konverterer det modtagne svar og viser detaljer i brugergrænsefladen.
Typer af webservices
Der er to typer webtjenester, nemlig
- SOAP API
- REST API
Lad os se forskellene mellem disse to webtjenester som anført i nedenstående billede.
JSON / XML-filer i webservice
Lad S1-systemet returneres på J2EE-sprog, og S2-systemet returneres i .NET eller Python, og vi ved, at begge teknologier også er helt forskellige fra hinanden med sikkerhedsproblemer. Hvordan deler S2-systemet derefter koden med et andet system?
Så S2-systemet udsætter sine API'er for S1-systemet uden at udsætte forretningslogik, og S2-systemet deler API-navn, API-URL, API-format og godkendelsesnøgle / tokenøgle for at få adgang til dets system. Kommunikation sker mellem de to systemer ved hjælp af enten JSON- eller XML-filer.
Hvorfor kun JSON / XML-fil?
JSON / XML-filer bruges, fordi disse er dataindsamlere. Enhver bestemt information gemmes enten i JSON- eller XML-formater, da disse er lette og er standardsprog til kommunikation mellem to forskellige grænseflader / platforme eller systemer.
Så API bruges altid, når to uafhængige systemer interagerer med hinanden, enten lokalt, inden i systemet eller over netværket.
Hvad er REST-klient?
REST Client er et værktøj, der kalder API'erne. Det bruges i backend-test, når der ikke er nogen brugergrænseflade til at kalde API'erne. Nogle populære REST-klienter er Apache HTTP-klient, POSTMAN, SOAP UI, Swagger og mange flere.
Her i denne artikel vil vi kun diskutere Apache HTTP-klient, og vi vil dække andre forskellige HTTP-klienter i vores fremtidige artikler.
Http-klientopsætning i formørkelse
# 1) Åbn Eclipse, og opret et nyt Maven-projekt.
#to) Slet dummy-pakker leveret af MAVEN dvs. “Src / main / java” og “Src / test / java”
# 3) Gå til pom.xml-filen og fjern JUnit-afhængigheden, da vi ikke har brug for den.
# 4) Derefter kræver vi HTTP-klientbiblioteket, HTTP-kernebiblioteket, JSON Parser-biblioteket, TestNG-biblioteket, Jackson-data bind-biblioteket
# 5) Tilføj ovenstående afhængigheder (bibliotek) i pom.xml-filen.
HTTP-klientbibliotek:
HTTP-kernebibliotek:
JSON Parser-bibliotek:
TestNG-bibliotek:
# 6) Download de nyeste og stabile versioner. Vi tilføjer ikke Selen-krukke i vores projekt, da vi udfører komplet backend-test. Den endelige pom.xml-fil ser ud som vist i billedet nedenfor:
# 7) Opret derefter en ramme for din API-test
til) Opret en pakke “com.qa.config” -> Opret en fil 'config.properties', og gem alle webadresser.
b) Opret en anden pakke “qa.com.base” -> Opret en klasse 'testBase.java', som vil være en overordnet klasse for alle klasser. Den indeholder almindelige funktioner, der skal bruges af alle metoder.
c) Opret en anden pakke “com.qa.client” og klasse “restClient.java”. Denne indeholder kode til at hente GET, POST, SLET, PUT opkald.
d) Opret en anden pakke 'com.qa.data' og klasse 'user.java', der definerer forskellige brugeregenskaber.
er) Til sidst skal du oprette en pakke 'com.qa.Test' under 'src / test / java' og erklære en hovedmetode og funktioner til at teste alle GET-, PUT-, POST- og Delete-metoder.
f) Den endelige rammestruktur ser ud som vist nedenfor:
g) Brug dummy API leveret af dette websted REQ RES .
HTTP-metoder eller CRUD-operationer
Lad os se forskellige HTTP-metoder eller CRUD-operationer, som vi automatiserer.
Nedenstående listede operationer kaldes CRUD-operationer:
- C : Opret (betyder POST-opkald)
- R : Hent (betyder GET-opkald)
- U : Opdatering (betyder PUT-opkald)
- D : Slet (betyder Slet opkald)
Parametre i REST-webtjenester
Valider eller fremhæv nedenstående parametre i REST Web Services:
(i) URI: URI er kombinationen af parameteren URL + sti og forespørgselsparameteren.
Eksempel: http://api.com/service/account/1
Her, api.com er S2-serverens URL, service er indehaveren. I denne tjeneste går indehaveren til konto klasse, og fra denne kontoklasse kalder den metoden konto = 1. I hvert opkald passerer vi URI.
(ii) Nyttelast: JSON / XML-data, som vi føder til systemet.
(iii) Statuskode: For hvert svar får vi statuskoder.
Her er få koder angivet nedenfor:
- 200: Ok, alt fungerer fint.
- 201: Oprettet med succes, hver gang du foretager et POST-opkald eller opretter en ny enhed.
- 400: Nyttelast er forkert, slut-URL er forkert, viser dårlig anmodning.
- 404: Opdater eller slet en enhed, og denne enhed er ikke tilgængelig, så får vi resultatet som ikke fundet anmodning.
- 500: Antag, at S2-serveren er nede, vi får en intern serverfejl.
- 401: Godkendelsesfejl
Klik på her for at få alle statuskoder.
(iv) Overskrifter: Ligesom godkendelsestoken, bruger-id / adgangskode, indholdstype osv.
gratis software til at rette fejl i registreringsdatabasen
CRUD-operationer ved hjælp af Apache HTTP-klient
# 1) FÅ OPKALD
Hvordan fungerer GET Call operation?
Get Call sender anmodningen og modtager svaret tilbage. Vi videregiver ikke nogen JSON eller nyttelasten her, vi sender en URI, hvor URL (slutpunktsparameter, forespørgselsparameter) sammen med overskriften, hvis den er tilgængelig.
hvad er de forskellige e-mail-konti
Inden du skriver GET-opkaldskoden, skal du huske nedenstående ting:
- Brug for en GET-metode
- Brug derefter en URL
- Når du trykker på sendeknappen, får du svaret. Gem derefter svaret.
- Brug for statuskode, overskrifter.
Se nedenstående skærmbillede af POSTMAN-klienten, der viser GET-opkaldssvar:
I restClient.java klasse,
(jeg) Opret GET-metoden, som kalder URL'en og får svaret i form af JSON-objekt uden header.
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) Opret hovedklasse “getAPITest.java” under “src / test / java”
Produktion
# 2) POST-opkald
POST Call opretter en konto eller opretter en ny enhed.
Eksempel - Giv disse detaljer som navn, job og overskrift til JSON-nyttelasten. S2-serveren vil være linket til en eller anden database, f.eks. Oracle, og har et tabelnavn, der hedder Kontotabel. POST-metoden opretter en post i databasen, og S2-serveren videregiver oplysningerne til S1-klienten. Husk, at POST-opkaldsfunktion altid bruges til at oprette en ny enhed.
I POST-metoden skal vi videregive URL'en og nyttelasten.
Download denne afhængighed, da vi har brug for at konvertere Java-klasse til Java-objekt end til JSON-objekt.
I restClient.java klasse,
(jeg) Opret POST-metode, som kalder URL'en og sender 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) Opret 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()));} }
Produktion:
# 3) PUT-opkald
Ved hjælp af PUT-opkaldsfunktionen kan du oprette en ny enhed og opdatere en eksisterende enhed.
I restClient.java klasse,
(jeg) Opret PUT-metode, som kalder URL'en og opdaterer 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) Opret 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);}
Produktion
# 4) Slet opkald
Slet opkaldsfunktion er enkel, dvs. slet konto-ID-100 og videregiv oplysningerne i en JSON-fil.
I restClient.java klasse,
(jeg) Opret Slet metode, som kalder URL og sletter 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) Opret 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'); }
Produktion
Inden du validerer et svar, skal du hente den korrekte URL fra udvikleren, og derefter kontrollere, om du får forventet svar fra serveren, forberede testcases til hvert eneste scenario og arrangere testcases i rækkefølge w.r.t-funktionalitet.
Konklusion
I denne artikel har vi dækket, hvordan man bruger Apache HTTP Client til automatisering af POST-, PUT-, GET- og Delete-opkald i detaljer med kodeeksempler. Vi har også diskuteret webservicetyper og vigtigheden af JSON / XML-filer, og hvorfor de bruges.
PREV-vejledning | FØRSTE vejledning
Anbefalet læsning
- Web Services-tutorial: Komponenter, arkitektur, typer og eksempler
- 15+ SoapUI Tutorials: Det bedste testtestværktøj til webtjenester API
- Amazon Web Services (AWS) Interviewspørgsmål og svar
- Top 20 RESTfulde webservicespørgsmål og svar
- Top 25 Java Web Services Interview Spørgsmål og svar
- Top 45 webtjenester Interviewspørgsmål og svar (RESTful, SOAP, sikkerhedsspørgsmål)
- Test af webtjenester præstation ved hjælp af LoadRunner VuGen Scripting
- API-testvejledning: En komplet guide til begyndere