web services testing using apache http client
Tento kurz je o provádění různých operací CRUD ve webových službách a testování webových služeb pomocí klienta Apache HTTP:
V tomhle Kompletní řada výukových programů pro testování API , jsme se dozvěděli, že webové služby fungují jako médium komunikace mezi klientskými a serverovými stroji, které interagují přes síť. Vysvětlili jsme vše o Testování API pomocí POSTMANU v našem předchozím tutoriálu.
V tomto článku zdůrazníme, jak testovat webové služby pomocí klienta Apache HTTP a provádět různé operace CRUD ve webových službách. Budou také diskutovány různé typy klientů REST, které jsou k dispozici pro testování back-endu.
co je flash soubor s rázovou vlnou
Co se naučíte:
Co je to webová služba?
Webové služby jsou médiem komunikace mezi klientskými a serverovými stroji, které interaguje v síti pomocí protokolů HTTP. Webové služby jsou obecně rozhraní API, která nejsou nainstalována nebo uložena lokálně, ale jsou k dispozici v cloudech nebo na některých vzdálených serverech.
V následujícím příkladu se dozvíte, jak fungují webové služby.
MakeMyTrip a Goibibo.com jsou některé ze slavných webových stránek pro rezervace letů a hotelů a jsou k dispozici různí prodejci letů, jako jsou Indigo, Air India a Etihad atd.
Pokud si zákazník chce rezervovat let z New Yorku do Londýna, může buď procházet přímo na portálu prodejců letů, nebo si může rezervovat prostřednictvím prodejců třetích stran. Pokud provádějí rezervaci prostřednictvím dodavatelů třetích stran, jako je MakeMyTrip a dalších rezervačních webů, během několika sekund porovná a zobrazí výsledky s podrobnostmi letu, jako je nejnižší cena, doba letu a mnoho dalších informací.
Zde vyvstává otázka, jak přesně nám během několika sekund poskytnou informace? Co přesně dělají?
Z uživatelského rozhraní vezmou všechny potřebné informace a uloží je do souboru JSON nebo XML a při vystavení svých API volají API svých dodavatelů s ověřovacím tokenem a v reakci na to web prodejce letu pošle zpět odpověď JSON / XML na MakeMyTrip a převádějí přijatou odpověď a zobrazují podrobnosti v uživatelském rozhraní.
Druhy webových služeb
Existují dva typy webových služeb, a to
- SOAP API
- REST API
Podívejme se na rozdíly mezi těmito dvěma webovými službami, jak jsou uvedeny na následujícím obrázku.
Soubory JSON / XML ve webové službě
Nechť je systém S1 vrácen v jazyce J2EE a systém S2 je vrácen v .NET nebo Pythonu a víme, že obě technologie se od sebe navzájem zcela liší. Jak potom bude systém S2 sdílet kód s jiným systémem?
Systém S2 tedy vystavuje svá rozhraní API systému S1, aniž by odhalil obchodní logiku, a systém S2 sdílí název API, adresu URL API, formát API a ověřovací klíč / tokenový klíč pro přístup do svého systému. Komunikace probíhá mezi těmito dvěma systémy pomocí souborů JSON nebo XML.
Proč pouze soubor JSON / XML?
Používají se soubory JSON / XML, protože se jedná o datové kolektory. Jakékoli konkrétní informace jsou uloženy ve formátech JSON nebo XML, protože jsou lehké a jsou standardním jazykem pro komunikaci mezi dvěma různými rozhraními / platformami nebo systémy.
Rozhraní API se tedy vždy používá, když dva nezávislé systémy vzájemně interagují, a to buď lokálně, v rámci systému, nebo po síti.
Co je klient REST?
Klient REST je nástroj, který volá API. Používá se při testování backendu, když není k dispozici žádné uživatelské rozhraní pro volání API. Mezi oblíbené klienty REST patří klient Apache HTTP, POSTMAN, SOAP UI, Swagger a mnoho dalších.
Zde v tomto článku budeme diskutovat pouze o klientovi Apache HTTP a v dalších článcích se budeme věnovat dalším různým klientům HTTP.
Nastavení klienta Http v Eclipse
# 1) Otevřete Eclipse a vytvořte nový projekt Maven.
#dva) Odstraňte fiktivní balíčky poskytované společností MAVEN, tj. „Src / main / java“ a „Src / test / java“
# 3) Přejděte do souboru pom.xml a odstraňte závislost JUnit, protože to nepotřebujeme.
# 4) Potom požadujeme knihovnu klienta HTTP, knihovnu HTTP Core, knihovnu JSON Parser, knihovnu TestNG, knihovnu Jackson-data bind
# 5) Přidejte výše uvedené závislosti (knihovna) do souboru pom.xml.
Klientská knihovna HTTP:
Základní knihovna HTTP:
Knihovna analyzátoru JSON:
Knihovna TestNG:
# 6) Stáhněte si nejnovější a stabilní verze. Do našeho projektu nepřidáme selenovou nádobu, protože provádíme kompletní testování backendu. Konečný soubor pom.xml vypadá, jak je znázorněno na následujícím obrázku:
# 7) Dále vytvořte rámec pro svůj test API
na) Vytvořit balíček „com.qa.config“ -> Vytvořte soubor „config.properties“ a uložte všechny adresy URL.
b) Vytvořit další balíček „qa.com.base“ -> Vytvořte třídu „testBase.java“, která bude nadřazenou třídou pro všechny třídy. Obsahuje běžné funkce, které mají být použity všemi metodami.
C) Vytvořte další balíček „com.qa.client“ a třídu „restClient.java“. Obsahuje kód pro načtení volání GET, POST, DELETE, PUT.
d) Vytvořte další balíček „com.qa.data“ a třídu „user.java“, která definuje různé vlastnosti uživatele.
je) Nakonec vytvořte balíček „com.qa.Test“ pod „src / test / java“ a deklarujte hlavní metodu a funkce pro testování všech metod GET, PUT, POST a Delete.
f) Konečná struktura rámce bude vypadat takto:
G) Použijte fiktivní API poskytované touto stránkou REQ RES .
Metody HTTP nebo operace CRUD
Podívejme se na různé metody HTTP nebo operace CRUD, které automatizujeme.
Níže uvedené operace se nazývají operace CRUD:
- C : Vytvořit (znamená POST volání)
- R : Načíst (znamená ZÍSKAT volání)
- U : Aktualizace (znamená PUT volání)
- D : Smazat (znamená Smazat hovor)
Parametry ve webových službách REST
Ověřte nebo zdůrazněte níže uvedené parametry ve webových službách REST:
i) URI: URI je kombinace parametru URL + cesta a parametru dotazu.
Příklad: http://api.com/service/account/1
Tady, api.com je URL pro server S2, servis je držitel. V této službě jde držitel do účet třídy az této třídy účtu volá metodu account = 1. V každém hovoru předáme URI.
ii) Užitečné zatížení: Data JSON / XML, která dodáváme do systému.
(iii) Stavový kód: Za každou odpověď dostáváme stavové kódy.
Zde je uvedeno několik kódů:
- 200: Dobře, všechno funguje dobře.
- 201: Úspěšně vytvořeno, kdykoli provádíte POST volání nebo vytváříte novou entitu.
- 400: Užitečné zatížení je špatné, koncová URL je špatná, zobrazuje špatný požadavek.
- 404: Aktualizujte nebo odstraňte entitu a tato entita není k dispozici, pak dostaneme výsledek jako požadavek nenalezen.
- 500: Předpokládejme, že server S2 nefunguje, dostaneme interní chybu serveru.
- 401: Chyba ověření
Klepněte na tady získat všechny stavové kódy.
iv) Záhlaví: Stejně jako ověřovací token, ID / heslo uživatele, Typ obsahu atd.
otázky a odpovědi s technikem zajišťujícím kvalitu
Operace CRUD pomocí klienta HTTP Apache
# 1) ZÍSKEJTE volání
Jak se chová operace GET Call?
Get Call odešle požadavek a přijme zpět odpověď. Nepředáváme zde žádný JSON ani užitečné zatížení, předáváme jeden URI, ve kterém je adresa URL (parametr cesty koncového bodu, parametr dotazu) spolu se záhlaví, pokud je k dispozici.
implementace třídění bublin c ++
Než začnete psát kód volání GET, nezapomeňte na následující věci:
- Potřebujete metodu GET
- Pak potřebujete adresu URL
- Jakmile stisknete tlačítko Odeslat, dostanete odpověď. Poté uložte odpověď.
- Potřebujete stavový kód, záhlaví.
Viz níže uvedený snímek obrazovky klienta POSTMAN, který zobrazuje odpověď GET volání:
Ve třídě restClient.java,
(i) Vytvořte metodu GET, která zavolá adresu URL a získá odpověď ve formě objektu JSON bez záhlaví.
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) Vytvořte hlavní třídu „getAPITest.java“ pod „src / test / java“
Výstup
# 2) POST volání
POST Call vytvoří účet nebo vytvoří novou entitu.
Příklad - Předejte tyto podrobnosti, jako je jméno, úloha a hlavička, užitečnému obsahu JSON. Server S2 bude propojen s nějakou databází, řekněme Oracle, a má nějaký název tabulky nazvaný Tabulka účtů. Metoda POST vytvoří záznam v databázi a server S2 předá informace klientovi S1. Nezapomeňte, že operace volání POST se vždy používá k vytvoření nové entity.
V metodě POST musíme předat URL a užitečné zatížení.
Stáhněte si tuto závislost, protože potřebujeme převést třídu Java na objekt Java než na objekt JSON.
Ve třídě restClient.java,
(i) Vytvořte metodu POST, která zavolá adresu URL a odešle odpověď.
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) Vytvořte hlavní třídu „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()));} }
Výstup:
# 3) PUT volání
Pomocí operace volání PUT můžete vytvořit novou entitu a aktualizovat existující entitu.
Ve třídě restClient.java,
(i) Vytvořte metodu PUT, která zavolá adresu URL a aktualizuje odpověď.
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) Vytvořte hlavní třídu „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);}
Výstup
# 4) Smazat hovor
Operace mazání volání je jednoduchá, tj. Smažte účet s číslem 100 a předejte informace do souboru JSON.
Ve třídě restClient.java,
(i) Vytvořte metodu mazání, která zavolá URL a smaže záznam.
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) Vytvořte hlavní třídu „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'); }
Výstup
Před ověřením jakékoli odpovědi získejte od vývojáře správnou adresu URL, pak zkontrolujte, zda se vám ze serveru zobrazuje očekávaná odpověď, připravte testovací případy pro každý scénář a uspořádejte testovací případy v pořadí podle funkce w.r.t.
Závěr
V tomto článku jsme podrobně popsali, jak používat Apache HTTP Client pro automatizaci volání POST, PUT, GET a Delete s příklady kódu. Rovněž jsme diskutovali o typech webových služeb a důležitosti souborů JSON / XML a proč se používají.
Výukový program PREV | PRVNÍ výuka
Doporučené čtení
- Výukový program webových služeb: Komponenty, architektura, typy a příklady
- 15+ SoapUI Tutorials: The Best Web Services API Testing Tool
- Dotazy a odpovědi na rozhovor s Amazon Web Services (AWS)
- Top 20 RESTful Web Services Interview Question and Answers
- Top 25 Java Web Services Interview Dotazy a odpovědi
- 45 nejčastějších dotazů a odpovědí na webové služby (RESTful, SOAP, bezpečnostní otázky)
- Testování výkonu webových služeb pomocí skriptování LoadRunner VuGen
- Výukový program pro testování API: Kompletní průvodce pro začátečníky