web services testing using apache http client
In diesem Lernprogramm werden verschiedene CRUD-Vorgänge für Webdienste ausgeführt und Webdienste mit dem Apache HTTP-Client getestet:
In diesem Komplette API-Test-Tutorial-Serie Wir haben erfahren, dass Web Services als Kommunikationsmedium zwischen Client- und Server-Computern fungieren, die über ein Netzwerk interagieren. Wir haben alles erklärt API-Tests mit POSTMAN in unserem vorherigen Tutorial.
In diesem Artikel wird erläutert, wie Webdienste mit dem Apache HTTP-Client getestet und verschiedene CRUD-Vorgänge für Webdienste ausgeführt werden. Die verschiedenen Arten von REST-Clients, die für Backend-Tests verfügbar sind, werden ebenfalls erläutert.
Wie erstelle ich ein Array vom generischen Typ in Java?
Was du lernen wirst:
Was ist ein Webdienst?
Webdienste sind ein Kommunikationsmedium zwischen Client- und Servercomputern, das mithilfe von HTTP-Protokollen über ein Netzwerk interagiert. Webdienste sind im Allgemeinen APIs, die nicht lokal installiert oder gespeichert werden, sondern in Clouds oder auf einigen Remoteservern verfügbar sind.
Im folgenden Beispiel erfahren Sie, wie Webdienste funktionieren.
MakeMyTrip und Goibibo.com sind einige der bekanntesten Websites für Flug- und Hotelbuchungen. Es gibt verschiedene Fluganbieter wie Indigo, Air India und Etihad usw.
Wenn ein Kunde einen Flug von New York nach London buchen möchte, kann er entweder direkt im Portal des Fluganbieters surfen oder über Drittanbieter buchen. Wenn sie über Drittanbieter wie MakeMyTrip und andere Buchungsseiten buchen, vergleichen und zeigen sie innerhalb weniger Sekunden die Ergebnisse mit Flugdetails wie dem niedrigsten Preis, der niedrigsten Flugzeit und vielen weiteren Informationen.
Hier stellt sich die Frage, wie genau sie uns innerhalb von Sekunden die Informationen liefern. Was genau machen sie?
Über die Benutzeroberfläche nehmen sie alle erforderlichen Informationen und speichern sie in einer JSON- oder XML-Datei. Sie rufen ihre Hersteller-APIs mit einem Authentifizierungstoken auf, während sie ihre APIs verfügbar machen. Als Antwort sendet die Site des Fluganbieters die JSON / XML-Antwort an MakeMyTrip zurück Sie konvertieren die empfangene Antwort und zeigen Details in der Benutzeroberfläche an.
Arten von Webdiensten
Es gibt zwei Arten von Webdiensten, nämlich
- SOAP-API
- REST-API
Lassen Sie uns die Unterschiede zwischen diesen beiden Webdiensten sehen, wie im folgenden Bild dargestellt.
JSON / XML-Dateien im Webdienst
Das S1-System wird in der Sprache J2EE und das S2-System in .NET oder Python zurückgegeben, und wir wissen, dass sich beide Technologien auch aus Sicherheitsgründen vollständig voneinander unterscheiden. Wie teilt das S2-System dann den Code mit einem anderen System?
Das S2-System stellt seine APIs dem S1-System zur Verfügung, ohne die Geschäftslogik offenzulegen, und das S2-System teilt den API-Namen, die API-URL, das API-Format und den Authentifizierungsschlüssel / Token-Schlüssel, um auf sein System zuzugreifen. Die Kommunikation zwischen den beiden Systemen erfolgt entweder über JSON- oder XML-Dateien.
Warum nur JSON / XML-Datei?
JSON / XML-Dateien werden verwendet, da es sich um Datensammler handelt. Bestimmte Informationen werden entweder im JSON- oder im XML-Format gespeichert, da diese leichtgewichtig sind und die Standardsprache für die Kommunikation zwischen zwei verschiedenen Schnittstellen / Plattformen oder Systemen darstellen.
Daher wird die API immer dann verwendet, wenn zwei unabhängige Systeme entweder lokal, innerhalb des Systems oder über das Netzwerk miteinander interagieren.
Was ist ein REST-Client?
REST Client ist ein Tool, das die APIs aufruft. Es wird beim Backend-Testen verwendet, wenn keine Benutzeroberfläche zum Aufrufen der APIs vorhanden ist. Einige beliebte REST-Clients sind Apache HTTP-Client, POSTMAN, SOAP UI, Swagger und viele mehr.
In diesem Artikel werden wir nur den Apache-HTTP-Client behandeln und in unseren zukünftigen Artikeln andere verschiedene HTTP-Clients behandeln.
HTTP-Client-Setup in Eclipse
# 1) Öffnen Sie Eclipse und erstellen Sie ein neues Maven-Projekt.
#zwei) Löschen Sie von MAVEN bereitgestellte Dummy-Pakete, d. H. 'Src / main / java' und 'Src / test / java'
#3) Gehen Sie zur Datei pom.xml und entfernen Sie die JUnit-Abhängigkeit, da wir sie nicht benötigen.
# 4) Dann benötigen wir die HTTP-Client-Bibliothek, die HTTP-Core-Bibliothek, die JSON-Parser-Bibliothek, die TestNG-Bibliothek und die Jackson-Datenbindungsbibliothek
# 5) Fügen Sie die obigen Abhängigkeiten (Bibliothek) in die Datei pom.xml ein.
HTTP-Client-Bibliothek:
HTTP-Kernbibliothek:
JSON-Parser-Bibliothek:
TestNG-Bibliothek:
# 6) Laden Sie die neuesten und stabilsten Versionen herunter. Wir werden kein Seleniumglas in unser Projekt aufnehmen, da wir vollständige Backend-Tests durchführen. Die endgültige pom.xml-Datei sieht wie im folgenden Bild aus:
# 7) Erstellen Sie als Nächstes ein Framework für Ihren API-Test
zu) Erstellen Sie ein Paket 'com.qa.config' -> Erstellen Sie eine Datei 'config.properties' und speichern Sie alle URLs.
b) Erstellen Sie ein weiteres Paket 'qa.com.base' -> Erstellen Sie eine Klasse 'testBase.java', die eine übergeordnete Klasse für alle Klassen ist. Es enthält gemeinsame Funktionen, die von allen Methoden verwendet werden können.
c) Erstellen Sie ein weiteres Paket 'com.qa.client' und die Klasse 'restClient.java'. Dieser enthält Code zum Abrufen von GET-, POST-, DELETE- und PUT-Aufrufen.
d) Erstellen Sie ein weiteres Paket 'com.qa.data' und eine Klasse 'user.java', die verschiedene Benutzereigenschaften definiert.
ist) Erstellen Sie abschließend unter 'src / test / java' ein Paket 'com.qa.Test' und deklarieren Sie eine Hauptmethode und Funktionen zum Testen aller GET-, PUT-, POST- und Delete-Methoden.
f) Die endgültige Framework-Struktur sieht wie folgt aus:
G) Verwenden Sie die von dieser Site bereitgestellte Dummy-API REQ RES .
HTTP-Methoden oder CRUD-Operationen
Lassen Sie uns verschiedene HTTP-Methoden oder CRUD-Operationen sehen, die wir automatisieren.
Die unten aufgeführten Operationen werden als CRUD-Operationen bezeichnet:
- C. : Erstellen (bedeutet POST-Aufruf)
- R. : Abrufen (bedeutet GET-Anruf)
- U. : Update (bedeutet PUT-Aufruf)
- D. : Löschen (bedeutet Anruf löschen)
Parameter in REST-Webdiensten
Überprüfen oder betonen Sie die folgenden Parameter in REST Web Services:
(i) URI: URI ist die Kombination aus dem Parameter URL + Pfad und dem Abfrageparameter.
Beispiel: http://api.com/service/account/1
Hier, api.com ist die URL für den S2-Server, Bedienung ist der Inhaber. Bei diesem Service geht der Inhaber an die Konto Klasse, und von dieser Kontoklasse ruft es die Methode account = 1 auf. Bei jedem Anruf übergeben wir die URI.
(ii) Nutzlast: JSON / XML-Daten, die wir dem System zuführen.
(iii) Statuscode: Für jede Antwort erhalten wir die Statuscodes.
Hier sind einige Codes aufgeführt:
- 200: Ok, alles funktioniert gut.
- 201: Erfolgreich erstellt, wenn Sie einen POST-Aufruf ausführen oder eine neue Entität erstellen.
- 400: Payload ist falsch, End-URL ist falsch, zeigt schlechte Anfrage.
- 404: Aktualisieren oder löschen Sie eine Entität, und diese Entität ist nicht verfügbar. Dann erhalten wir das Ergebnis als nicht gefundene Anforderung.
- 500: Angenommen, der S2-Server ist ausgefallen, wir erhalten einen internen Serverfehler.
- 401: Authentifizierungsfehler
Klicken Hier um alle Statuscodes zu erhalten.
(iv) Überschriften: Wie Authentifizierungstoken, Benutzer-ID / Passwort, Inhaltstyp usw.
pl / sql Entwickler Interview Fragen
CRUD-Operationen mit dem Apache HTTP-Client
# 1) Anruf erhalten
Wie verhält sich der GET Call-Betrieb?
Get Call sendet die Anfrage und erhält die Antwort zurück. Wir übergeben hier weder JSON noch die Nutzdaten, sondern einen URI, in dem die URL (Endpunktpfadparameter, Abfrageparameter) zusammen mit dem Header, falls verfügbar, angegeben ist.
bestes Systemdienstprogramm für Windows 10
Beachten Sie vor dem Schreiben des GET Call-Codes die folgenden Punkte:
- Benötigen Sie eine GET-Methode
- Dann brauche eine URL
- Sobald Sie auf die Schaltfläche 'Senden' klicken, erhalten Sie die Antwort. Speichern Sie dann die Antwort.
- Benötigen Sie Statuscode, Überschriften.
Sehen Sie sich den folgenden Screenshot des POSTMAN-Clients an, in dem die GET-Anrufantwort angezeigt wird:
In der Klasse restClient.java
(ich) Erstellen Sie die GET-Methode, die die URL aufruft und die Antwort in Form eines JSON-Objekts ohne Header erhält.
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) Erstellen Sie die Hauptklasse 'getAPITest.java' unter 'src / test / java'.
Ausgabe
# 2) POST-Anruf
POST Call erstellt ein Konto oder eine neue Entität.
Beispiel - Übergeben Sie diese Details wie Name, Job und Header an die JSON-Nutzdaten. Der S2-Server wird mit einer Datenbank verbunden, beispielsweise Oracle, und hat einen Tabellennamen namens Account table. Die POST-Methode erstellt einen Eintrag in der Datenbank und der S2-Server leitet die Informationen an den S1-Client weiter. Denken Sie daran, dass die POST-Aufrufoperation immer zum Erstellen einer neuen Entität verwendet wird.
Bei der POST-Methode müssen wir die URL und die Nutzdaten übergeben.
Laden Sie diese Abhängigkeit herunter, da wir die Java-Klasse in ein Java-Objekt als in ein JSON-Objekt konvertieren müssen.
In der Klasse restClient.java
(ich) Erstellen Sie eine POST-Methode, die die URL aufruft und die Antwort veröffentlicht.
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) Erstellen Sie die Hauptklasse 'postAPI_Test.java' unter '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()));} }
Ausgabe:
# 3) PUT-Anruf
Mit der PUT-Aufrufoperation können Sie eine neue Entität erstellen und eine vorhandene Entität aktualisieren.
In der Klasse restClient.java
(ich) Erstellen Sie eine PUT-Methode, die die URL aufruft und die Antwort aktualisiert.
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) Erstellen Sie die Hauptklasse 'putAPI_Test.java' unter '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);}
Ausgabe
# 4) Anruf löschen
Das Löschen der Anrufoperation ist einfach, d. H. Löschen Sie die Konto-ID 100 und übergeben Sie die Informationen in einer JSON-Datei.
In der Klasse restClient.java
(ich) Löschmethode erstellen, die die URL aufruft und den Datensatz löscht.
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) Erstellen Sie die Hauptklasse 'deleteAPI_Test.java' unter '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'); }
Ausgabe
Bevor Sie eine Antwort validieren, erhalten Sie die richtige URL vom Entwickler. Überprüfen Sie dann, ob Sie eine erwartete Antwort vom Server erhalten, bereiten Sie Testfälle für jedes Szenario vor und ordnen Sie die Testfälle nacheinander mit der Funktionalität an.
Fazit
In diesem Artikel haben wir anhand von Codebeispielen ausführlich beschrieben, wie Sie den Apache HTTP-Client zum Automatisieren von POST-, PUT-, GET- und Delete-Aufrufen verwenden. Wir haben auch die Webdiensttypen und die Bedeutung von JSON / XML-Dateien sowie deren Verwendung erörtert.
PREV Tutorial | ERSTES Tutorial
Literatur-Empfehlungen
- Web Services Tutorial: Komponenten, Architektur, Typen und Beispiele
- 15+ SoapUI-Tutorials: Das beste API-Testtool für Webdienste
- Fragen und Antworten zum Interview mit Amazon Web Services (AWS)
- Top 20 Fragen und Antworten zum RESTful Web Services-Interview
- Top 25 Fragen und Antworten zum Java Web Services-Interview
- Top 45 Fragen und Antworten zu Web Services-Interviews (RESTful-, SOAP- und Sicherheitsfragen)
- Testen der Webdienstleistung mit LoadRunner VuGen Scripting
- API-Test-Tutorial: Eine vollständige Anleitung für Anfänger