web services testing using apache http client
Този урок е за извършване на различни CRUD операции в уеб услуги и тестване на уеб услуги с помощта на Apache HTTP клиент:
В това Пълна серия уроци за тестване на API , научихме, че уеб услугите действат като средство за комуникация между клиентски и сървърни машини, които взаимодействат през мрежа. Обяснихме всичко API тестване с помощта на POSTMAN в предишния ни урок.
В тази статия ще наблегнем на това как да тестваме уеб услугите с помощта на Apache HTTP клиент и да изпълняваме различни CRUD операции на уеб услуги. Ще бъдат обсъдени и различните типове REST клиенти, налични за тестване на бекенда.
как да добавя svn хранилище в eclipse
Какво ще научите:
Какво е уеб услуга?
Уеб услугите са средство за комуникация между клиентски и сървърни машини, което взаимодейства през мрежа с помощта на HTTP протоколи. Уеб услугите обикновено са API, които не се инсталират или съхраняват локално, но са налични в облаци или в някои отдалечени сървъри.
Вижте примера по-долу, за да разберете как работят уеб услугите.
MakeMyTrip и Goibibo.com са някои от известните уебсайтове за резервация на полети и хотели и има различни доставчици на полети като Indigo, Air India и Etihad и др.
Ако клиент иска да резервира полет от Ню Йорк до Лондон, или може да разглежда директно на портала за доставчици на полети, или да резервира чрез доставчици на трети страни. Ако резервират чрез доставчици на трети страни като MakeMyTrip и други сайтове за резервации, в рамките на няколко секунди те ще сравняват и показват резултати, като предоставят подробности за полета като най-ниска цена, време за полет и много повече друга информация.
Въпросът, който възниква тук е, как точно, за секунди, те ни предоставят информацията? Какво точно правят?
От потребителския интерфейс те вземат цялата необходима информация и я съхраняват в JSON или XML файл и извикват своите API на доставчици с токен за удостоверяване, докато излагат своите API, и в отговор сайтът на доставчика на полети изпраща обратно JSON / XML отговор на MakeMyTrip и те преобразуват получения отговор и показват подробности в потребителския интерфейс.
Видове уеб услуги
Има два вида уеб услуги, а именно
- SOAP API
- REST API
Нека видим разликите между тези две уеб услуги, както е посочено в изображението по-долу.
JSON / XML файлове в уеб услуга
Нека системата S1 се върне на езика J2EE, а системата S2 се върне в .NET или Python и знаем, че и двете технологии са напълно различни една от друга със загриженост за сигурността. Тогава как системата S2 ще споделя кода с друга система?
И така, системата S2 излага своите API на системата S1, без да излага бизнес логика, а системата S2 споделя име на API, API URL, API формат и ключ за удостоверяване / ключ за ключ за достъп до своята система. Комуникацията се случва между двете системи, използвайки JSON или XML файлове.
Защо само JSON / XML файл?
Използват се JSON / XML файлове, защото това са колектори на данни. Всяка конкретна информация се съхранява в JSON или XML формати, тъй като те са леки и са стандартен език за комуникация между два различни интерфейса / платформи или системи.
И така, API винаги се използва, когато две независими системи си взаимодействат, локално, в рамките на системата или по мрежата.
Какво е REST клиент?
REST Client е инструмент, който извиква API-тата. Използва се при вътрешно тестване, когато няма потребителски интерфейс за извикване на API. Някои популярни REST клиенти са Apache HTTP клиент, POSTMAN, SOAP UI, Swagger и много други.
Тук, в тази статия, ще обсъдим само HTTP клиента на Apache и ще разгледаме други различни HTTP клиенти в нашите бъдещи статии.
Http настройка на клиента в Eclipse
# 1) Отворете Eclipse и създайте нов проект Maven.
# две) Изтрийте фиктивни пакети, предоставени от MAVEN, т.е. “Src / main / java” и “Src / test / java”
# 3) Отидете на файла pom.xml и премахнете зависимостта JUnit, тъй като нямаме нужда от нея.
# 4) След това се нуждаем от HTTP клиентска библиотека, HTTP Core библиотека, JSON Parser библиотека, TestNG библиотека, Jackson-data bind Library
# 5) Добавете горните зависимости (библиотека) във файла pom.xml.
HTTP клиентска библиотека:
HTTP основна библиотека:
Библиотека на JSON Parser:
Библиотека на TestNG:
# 6) Изтеглете най-новите и стабилни версии. Няма да добавяме буркан от селен в нашия проект, тъй като правим цялостно бекенд тестване. Крайният файл pom.xml изглежда така, както е показано на изображението по-долу:
# 7) След това създайте рамка за вашия API тест
да се) Създайте пакет „com.qa.config“ -> Създайте файл „config.properties“ и съхранявайте всички URL адреси.
б) Създайте друг пакет „qa.com.base“ -> Създайте клас “testBase.java”, който ще бъде родителски клас за всички класове. Той съдържа общи функции, които да се използват от всички методи.
° С) Създайте друг пакет “com.qa.client” и клас “restClient.java”. Това съдържа код за извличане на GET, POST, DELETE, PUT повиквания.
д) Създайте друг пакет “com.qa.data” и клас “user.java”, който дефинира различни потребителски свойства.
е) И накрая, създайте пакет „com.qa.Test“ под „src / test / java“ и декларирайте основен метод и функции за тестване на всички методи GET, PUT, POST и Delete.
е) Окончателната рамкова структура ще изглежда както е показано по-долу:
ж) Използвайте фиктивен API, предоставен от този сайт REQ RES .
HTTP методи или CRUD операции
Нека да видим различни HTTP методи или CRUD операции, които автоматизираме.
По-долу изброените операции се наричат CRUD операции:
- ° С : Създаване (означава POST повикване)
- R : Извличане (означава GET повикване)
- U : Актуализация (означава PUT повикване)
- д : Изтриване (означава Изтриване на повикване)
Параметри в REST Web Services
Проверете или подчертайте параметрите по-долу в REST Web Services:
(i) URI: URI е комбинацията от параметъра URL + Path и параметъра на заявката.
Пример: http://api.com/service/account/1
Тук, api.com е URL адресът за S2 сървъра, обслужване е притежателят. В тази услуга притежателят отива в сметка клас и от този клас акаунт извиква метода account = 1. При всяко обаждане ние предаваме URI.
(ii) полезен товар: JSON / XML данни, които подаваме в системата.
(iii) Код на състоянието: За всеки отговор получаваме кодовете на състоянието.
Тук са изброени няколко кода по-долу:
- 200: Добре, всичко работи добре.
- 201: Създава се успешно, когато правите POST повикване или създавате нов обект.
- 400: Полезният товар е грешен, крайният URL адрес е грешен, показва лоша заявка.
- 404: Актуализирайте или изтрийте обект и този обект не е наличен, след което получаваме резултат като не е намерена заявка.
- 500: Да предположим, че сървърът S2 не работи, получаваме вътрешна грешка в сървъра.
- 401: Грешка при удостоверяване
Щракнете тук за да получите всички кодове на състоянието.
(iv) Заглавки: Като токен за удостоверяване, потребителски идентификатор / парола, тип съдържание и т.н.
виртуален уред с баланс на товара с отворен код
CRUD операции, използващи Apache HTTP клиент
# 1) ПОЛУЧЕТЕ обаждане
Как се държи операцията GET Call?
Get Call изпраща заявката и получава обратно отговора. Тук не предаваме никакъв JSON или полезния товар, а един URI, в който URL (параметър на крайната точка, параметър на заявката) заедно със заглавката, ако е налице.
какво е json файл как да се отвори
Преди да напишете кода на GET Call, имайте предвид нещата по-долу:
- Нуждаете се от GET метод
- След това се нуждаете от URL адрес
- След като натиснете бутона за изпращане, ще получите отговор. След това съхранявайте отговора.
- Нуждаете се от код на състоянието, заглавки.
Вижте скрийншота по-долу на клиента POSTMAN, който показва отговор на повикване GET:
В клас restClient.java,
(i) Създайте метода GET, който ще извика URL адреса и ще получи отговора под формата на JSON обект без 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) Създайте основен клас „getAPITest.java“ под „src / test / java“
Изход
# 2) POST повикване
POST Call създава акаунт или създава нов обект.
Пример - Предайте тези подробности като име, работа и заглавка на полезния товар на JSON. S2 сървърът ще бъде свързан с някаква база данни, да речем Oracle, и има някакво име на таблица, наречено Account table. Методът POST ще създаде запис в базата данни и сървърът S2 предава информацията на клиента S1. Не забравяйте, че операцията за повикване POST винаги се използва за създаване на нов обект.
В метода POST трябва да предадем URL и полезния товар.
Изтеглете тази зависимост, тъй като трябва да конвертираме Java клас в Java обект, отколкото в JSON обект.
В клас restClient.java,
(i) Създайте метод POST, който ще извика URL адреса и ще публикува отговора.
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) Създайте основния клас “postAPI_Test.java” под “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()));} }
Изход:
# 3) PUT Call
Използвайки операцията за повикване PUT, можете да създадете нов обект и да актуализирате съществуващ обект.
В клас restClient.java,
(i) Създайте метод PUT, който ще извика URL адреса и ще актуализира отговора.
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) Създайте основния клас “putAPI_Test.java” под “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);}
Изход
# 4) Изтриване на повикване
Операцията за изтриване на повикване е проста, т.е.изтрийте акаунта id-100 и предайте информацията в JSON файл.
В клас restClient.java,
(i) Създайте метод за изтриване, който ще извика URL и ще изтрие записа.
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) Създайте основния клас „deleteAPI_Test.java“ под „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'); }
Изход
Преди да проверите какъвто и да е отговор, вземете правилния URL от разработчика, след това проверете дали получавате очакван отговор от сървъра, подгответе тестови случаи за всеки сценарий и подредете тестови случаи в последователност с функционалност w.r.t.
Заключение
В тази статия разгледахме подробно как да използваме Apache HTTP клиент за автоматизиране на POST, PUT, GET и Delete извиквания в подробности с примери за кодове. Също така обсъдихме типовете уеб услуги и значението на JSON / XML файловете и защо те се използват.
Препоръчително четене
- Урок за уеб услуги: Компоненти, архитектура, типове и примери
- 15+ урока за SoapUI: Най-добрият инструмент за тестване на API за уеб услуги
- Въпроси и отговори за интервю за Amazon Web Services (AWS)
- Топ 20 RESTful Въпроси и отговори за интервюта за уеб услуги
- Топ 25 Въпроси и отговори за интервю за уеб услуги в Java
- Топ 45 въпроси и отговори за интервю за уеб услуги (RESTful, SOAP, въпроси за сигурност)
- Тестване на производителността на уеб услуги с помощта на LoadRunner VuGen Scripting
- Урок за API тестване: Пълно ръководство за начинаещи