web services testing using apache http client
Ten samouczek dotyczy wykonywania różnych operacji CRUD w usługach sieci Web i testowania usług sieci Web przy użyciu klienta Apache HTTP:
W tym Kompletna seria samouczków dotyczących testowania interfejsu API , dowiedzieliśmy się, że usługi sieciowe działają jako medium komunikacji między klientami a serwerami, które współdziałają w sieci. Wyjaśniliśmy wszystko Testowanie API przy użyciu POSTMAN w naszym poprzednim samouczku.
W tym artykule położymy nacisk na testowanie usług internetowych przy użyciu klienta Apache HTTP i wykonywanie różnych operacji CRUD w usługach internetowych. Omówione zostaną również różne typy klientów REST dostępnych do testowania zaplecza.
darmowy test online do testowania ręcznego
Czego się nauczysz:
- Co to jest usługa internetowa?
- Co to jest klient REST?
- Operacje CRUD przy użyciu klienta Apache HTTP
- Wniosek
Co to jest usługa internetowa?
Usługi sieci Web są środkiem komunikacji między komputerami klienckimi a serwerami, które współdziałają w sieci za pomocą protokołów HTTP. Usługi internetowe to zazwyczaj interfejsy API, które nie są instalowane ani przechowywane lokalnie, ale są dostępne w chmurach lub na niektórych zdalnych serwerach.
Zapoznaj się z poniższym przykładem, aby zrozumieć, jak działają usługi internetowe.
MakeMyTrip i Goibibo.com to tylko niektóre ze słynnych witryn do rezerwacji lotów i hoteli, a dostępne są różne firmy oferujące loty, takie jak Indigo, Air India i Etihad itp.
Jeśli klient chce zarezerwować lot z Nowego Jorku do Londynu, może przeglądać bezpośrednio w portalu sprzedawcy biletów lotniczych lub może dokonać rezerwacji za pośrednictwem dostawców zewnętrznych. Jeśli dokonują rezerwacji za pośrednictwem zewnętrznych dostawców, takich jak MakeMyTrip i inne witryny rezerwacyjne, w ciągu kilku sekund porównają i wyświetlą wyniki zawierające szczegóły lotu, takie jak najniższa cena, czas lotu i wiele innych informacji.
Powstaje pytanie, jak dokładnie w ciągu kilku sekund przekazują nam informacje? Co dokładnie robią?
Z interfejsu użytkownika pobierają wszystkie niezbędne informacje i przechowują je w pliku JSON lub XML i wywołują swoje interfejsy API dostawcy z tokenem uwierzytelniającym, gdy ujawniają swoje interfejsy API, aw odpowiedzi witryna dostawcy lotu odsyła odpowiedź JSON / XML do MakeMyTrip, oraz konwertują otrzymaną odpowiedź i wyświetlają szczegóły w interfejsie użytkownika.
Rodzaje usług internetowych
Istnieją dwa rodzaje usług internetowych, a mianowicie
- SOAP API
- REST API
Zobaczmy różnice między tymi dwoma usługami sieciowymi, jak pokazano na poniższym obrazku.
Pliki JSON / XML w usłudze sieciowej
Niech system S1 jest zwracany w języku J2EE, a system S2 jest zwracany w .NET lub Pythonie i wiemy, że obie technologie są od siebie zupełnie inne, jeśli chodzi o bezpieczeństwo. W jaki sposób system S2 będzie udostępniać kod innemu systemowi?
Tak więc system S2 udostępnia swoje interfejsy API w systemie S1 bez ujawniania logiki biznesowej, a system S2 udostępnia nazwę API, adres URL interfejsu API, format API i klucz uwierzytelniania / klucz tokenu, aby uzyskać dostęp do swojego systemu. Komunikacja między dwoma systemami odbywa się za pomocą plików JSON lub XML.
Dlaczego tylko plik JSON / XML?
Używane są pliki JSON / XML, ponieważ są to kolektory danych. Wszelkie określone informacje są przechowywane w formatach JSON lub XML, ponieważ są one lekkie i są standardowym językiem do komunikacji między dwoma różnymi interfejsami / platformami lub systemami.
Tak więc API jest używane zawsze, gdy dwa niezależne systemy współdziałają ze sobą lokalnie, wewnątrz systemu lub przez sieć.
Co to jest klient REST?
Klient REST to narzędzie, które wywołuje interfejsy API. Jest używany w testowaniu zaplecza, gdy nie ma interfejsu użytkownika do wywoływania interfejsów API. Niektórymi popularnymi klientami REST są klient Apache HTTP, POSTMAN, SOAP UI, Swagger i wiele innych.
W tym artykule omówimy tylko klienta Apache HTTP, a innych klientów HTTP omówimy w przyszłych artykułach.
Konfiguracja klienta HTTP w Eclipse
# 1) Otwórz Eclipse i utwórz nowy projekt Maven.
#dwa) Usuń fałszywe pakiety dostarczone przez MAVEN, tj. „Src / main / java” i „Src / test / java”
# 3) Przejdź do pliku pom.xml i usuń zależność JUnit, ponieważ jej nie potrzebujemy.
# 4) Następnie potrzebujemy biblioteki klienta HTTP, biblioteki HTTP Core, biblioteki JSON Parser, biblioteki TestNG, biblioteki powiązań danych Jackson
# 5) Dodaj powyższe zależności (bibliotekę) w pliku pom.xml.
Biblioteka klienta HTTP:
Biblioteka HTTP Core:
Biblioteka JSON Parser:
Biblioteka TestNG:
# 6) Pobierz najnowsze i stabilne wersje. Nie dodamy słoika Selenium do naszego projektu, ponieważ przeprowadzamy pełne testy backendu. Ostateczny plik pom.xml wygląda jak na poniższym obrazku:
# 7) Następnie utwórz strukturę do testu interfejsu API
do) Utwórz pakiet „com.qa.config” -> Utwórz plik „config.properties” i zapisz wszystkie adresy URL.
b) Utwórz kolejny pakiet „qa.com.base” -> Utwórz klasę „testBase.java”, która będzie klasą nadrzędną dla wszystkich klas. Zawiera wspólne funkcje używane we wszystkich metodach.
do) Utwórz kolejny pakiet „com.qa.client” i klasę „restClient.java”. Zawiera kod do pobierania wywołań GET, POST, DELETE, PUT.
re) Utwórz kolejny pakiet „com.qa.data” i klasę „user.java”, która definiuje różne właściwości użytkownika.
jest) Na koniec utwórz pakiet „com.qa.Test” w katalogu „src / test / java” i zadeklaruj główną metodę oraz funkcje do testowania wszystkich metod GET, PUT, POST i Delete.
f) Ostateczna struktura szkieletu będzie wyglądać jak poniżej:
sol) Użyj fikcyjnego interfejsu API udostępnionego przez tę witrynę REQ RES .
Metody HTTP lub operacje CRUD
Zobaczmy różne metody HTTP lub operacje CRUD, które automatyzujemy.
Poniżej wymienione operacje nazywane są operacjami CRUD:
- do : Utwórz (oznacza wywołanie POST)
- R : Retrieve (oznacza POBIERZ połączenie)
- U : Aktualizacja (oznacza połączenie PUT)
- re : Usuń (oznacza Usuń połączenie)
Parametry w usługach sieci Web REST
Sprawdź poprawność lub podkreśl poniższe parametry w usługach sieci Web REST:
(i) URI: Identyfikator URI to połączenie parametru URL + ścieżka i parametru zapytania.
Przykład: http://api.com/service/account/1
Tutaj, api.com to adres URL serwera S2, usługa jest posiadaczem. W tej usłudze posiadacz udaje się do konto class iz tej klasy konta wywołuje metodę account = 1. W każdym wywołaniu przekazujemy URI.
(ii) Ładowność: Dane JSON / XML, które wprowadzamy do systemu.
(iii) Kod statusu: Do każdej odpowiedzi otrzymujemy kody statusu.
Poniżej wymieniono kilka kodów:
- 200: Ok, wszystko działa dobrze.
- 201: Utworzono pomyślnie za każdym razem, gdy wykonujesz wywołanie POST lub tworzysz nową jednostkę.
- 400: Ładunek jest nieprawidłowy, końcowy URL jest nieprawidłowy, pokazuje złe żądanie.
- 404: Zaktualizuj lub usuń jednostkę, a ta jednostka nie jest dostępna, otrzymamy wynik jako żądanie nieznalezione.
- 500: Załóżmy, że serwer S2 nie działa, otrzymujemy wewnętrzny błąd serwera.
- 401: Błąd autoryzacji
Kliknij tutaj aby uzyskać wszystkie kody stanu.
(iv) Nagłówki: Podobnie jak token uwierzytelniający, identyfikator / hasło użytkownika, typ treści itp.
tablica java usuwa element pod indeksem
Operacje CRUD przy użyciu klienta Apache HTTP
# 1) ODBIERZ Zadzwoń
Jak zachowuje się operacja GET Call?
Get Call wysyła żądanie i odbiera odpowiedź. Nie przekazujemy tutaj żadnego kodu JSON ani ładunku, przekazujemy jeden identyfikator URI, w którym adres URL (parametr ścieżki punktu końcowego, parametr zapytania) wraz z nagłówkiem, jeśli jest dostępny.
Przed napisaniem kodu GET Call pamiętaj o następujących kwestiach:
jak wychwytywać błędy podczas automatyzacji kompilacji
- Potrzebujesz metody GET
- Następnie potrzebujesz adresu URL
- Po naciśnięciu przycisku wysyłania otrzymasz odpowiedź. Następnie zapisz odpowiedź.
- Potrzebujesz kodu statusu, nagłówków.
Zobacz poniższy zrzut ekranu klienta POSTMAN, który wyświetla odpowiedź na wezwanie GET:
W klasie restClient.java
(ja) Utwórz metodę GET, która wywoła adres URL i otrzyma odpowiedź w postaci obiektu JSON bez nagłówka.
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) Utwórz klasę główną „getAPITest.java” w katalogu „src / test / java”
Wynik
# 2) POST Call
POST Call tworzy konto lub tworzy nową jednostkę.
Przykład - Przekaż te szczegóły, takie jak nazwa, zadanie i nagłówek, do ładunku JSON. Serwer S2 będzie połączony z pewną bazą danych, na przykład Oracle, i ma nazwę tabeli zwaną tabelą kont. Metoda POST utworzy wpis w bazie danych, a serwer S2 przekaże informacje do klienta S1. Pamiętaj, że operacja wywołania POST jest zawsze używana do tworzenia nowej jednostki.
W metodzie POST musimy przekazać adres URL i ładunek.
Pobierz tę zależność, ponieważ musimy przekonwertować klasę Java na obiekt Java niż na obiekt JSON.
W klasie restClient.java
(ja) Utwórz metodę POST, która wywoła adres URL i opublikuje odpowiedź.
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) Utwórz główną klasę „postAPI_Test.java” w „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()));} }
Wynik:
# 3) PUT Call
Korzystając z operacji wywołania PUT, można utworzyć nową jednostkę i zaktualizować istniejącą.
W klasie restClient.java
(ja) Utwórz metodę PUT, która wywoła adres URL i zaktualizuje odpowiedź.
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) Utwórz główną klasę „putAPI_Test.java” w „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);}
Wynik
# 4) Usuń połączenie
Operacja usuwania połączenia jest prosta, tj. Usuń konto id-100 i przekaż informacje w pliku JSON.
W klasie restClient.java
(ja) Utwórz metodę usuwania, która wywoła adres URL i usunie rekord.
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) Utwórz główną klasę „deleteAPI_Test.java” w „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'); }
Wynik
Przed walidacją jakiejkolwiek odpowiedzi uzyskaj poprawny adres URL od programisty, a następnie sprawdź, czy otrzymujesz oczekiwaną odpowiedź z serwera, przygotuj przypadki testowe dla każdego scenariusza i ułóż przypadki testowe w kolejności w.r.t.
Wniosek
W tym artykule omówiliśmy szczegółowo, jak używać klienta Apache HTTP do automatyzacji wywołań POST, PUT, GET i Delete z przykładami kodu. Omówiliśmy również typy usług internetowych oraz znaczenie plików JSON / XML i dlaczego są one używane.
POPRZEDNIA samouczek | PIERWSZY samouczek
rekomendowane lektury
- Samouczek dotyczący usług internetowych: składniki, architektura, typy i przykłady
- Ponad 15 samouczków SoapUI: Najlepsze narzędzie do testowania interfejsu API usług internetowych
- Pytania i odpowiedzi do wywiadów z Amazon Web Services (AWS)
- 20 najczęściej zadawanych pytań i odpowiedzi dotyczących usług internetowych RESTful
- 25 najczęściej zadawanych pytań i odpowiedzi dotyczących usług internetowych Java
- 45 najczęściej zadawanych pytań i odpowiedzi podczas wywiadów dotyczących usług internetowych (RESTful, SOAP, pytania bezpieczeństwa)
- Testowanie wydajności usług sieci Web przy użyciu skryptów LoadRunner VuGen
- Samouczek testowania interfejsu API: kompletny przewodnik dla początkujących