web services testing using apache http client
Овај водич говори о обављању различитих ЦРУД операција на веб услугама и тестирању веб услуга помоћу Апацхе ХТТП клијента:
У ово Комплетна серија водича за тестирање АПИ-ја , сазнали смо да Веб услуге делују као медиј комуникације између клијентских и серверских машина које комуницирају преко мреже. Све смо објаснили АПИ тестирање помоћу ПОСТМАН-а у нашем претходном упутству.
У овом чланку ћемо нагласити како тестирати веб услуге помоћу Апацхе ХТТП клијента и изводити различите ЦРУД операције на веб услугама. Такође ће се разговарати о различитим типовима РЕСТ клијената доступних за позадинско тестирање.
како ухватити грешке током аутоматизације израде
Шта ћете научити:
Шта је веб услуга?
Веб услуге су медиј комуникације између клијентских и серверских машина који комуницирају преко мреже уз помоћ ХТТП протокола. Веб услуге су обично АПИ-ји који се не инсталирају или складиште локално, али су доступни у облацима или на неким удаљеним серверима.
Погледајте пример у наставку да бисте разумели како функционишу веб услуге.
МакеМиТрип и Гоибибо.цом су неке од познатих веб локација за резервације летова и хотела, а доступни су и различити продавци летова попут Индиго, Аир Индиа и Етихад итд.
Ако купац жели да резервише лет од Њујорка до Лондона, или може да претражује директно на порталу добављача летова или може да резервише преко независних добављача. Ако резервишу преко независних добављача попут МакеМиТрип и других веб локација за резервацију, у року од неколико секунди упоредиће и приказати резултате пружајући детаље о лету попут најниже цене, времена лета и још много других информација.
Овде се поставља питање, како тачно, у року од неколико секунди пружају нам информације? Шта тачно раде?
Из корисничког интерфејса узимају све потребне информације и чувају их у ЈСОН или КСМЛ датотеци и позивају АПИ-је својих добављача са токеном за потврду идентитета док излажу своје АПИ-је, а као одговор, локација добављача лета шаље ЈСОН / КСМЛ одговор на МакеМиТрип и конвертују примљени одговор и приказују детаље у корисничком интерфејсу.
Врсте веб услуга
Постоје две врсте веб услуга, наиме
- СОАП АПИ
- РЕСТ АПИ
Погледајмо разлике између ове две веб услуге како су наведене на доњој слици.
ЈСОН / КСМЛ датотеке у веб услузи
Нека се С1 систем врати на језику Ј2ЕЕ, а С2 систем у .НЕТ или Питхон, а знамо да се обе технологије потпуно разликују једна од друге због безбедности. Како ће онда систем С2 делити код са другим системом?
Дакле, С2 систем излаже своје АПИ-је систему С1 без излагања пословне логике, а С2 систем дели АПИ име, АПИ УРЛ, АПИ формат и Аутхентицатион кеи / Токен Кеи за приступ свом систему. Комуникација се дешава између два система користећи ЈСОН или КСМЛ датотеке.
Зашто само ЈСОН / КСМЛ датотека?
Користе се ЈСОН / КСМЛ датотеке јер су то сакупљачи података. Све одређене информације чувају се у ЈСОН или КСМЛ форматима, јер су лагане и стандардни су језик за комуникацију између два различита интерфејса / платформе или система.
Дакле, АПИ се увек користи када два независна система међусобно комуницирају, било локално, унутар система или преко мреже.
Шта је РЕСТ клијент?
РЕСТ клијент је алат који позива АПИ-је. Користи се у позадинском тестирању када не постоји кориснички интерфејс за позивање АПИ-ја. Неки популарни РЕСТ клијенти су Апацхе ХТТП клијент, ПОСТМАН, СОАП УИ, Сваггер и многи други.
Овде, у овом чланку, разговараћемо само о Апацхе ХТТП клијенту, а у другим будућим чланцима покриваћемо и друге различите ХТТП клијенте.
Подешавање ХТТП клијента у Ецлипсе-у
# 1) Отворите Ецлипсе и креирајте нови Мавен пројекат.
#два) Избришите лажне пакете које пружа МАВЕН тј. „Срц / маин / јава“ и „Срц / тест / јава“
# 3) Идите на датотеку пом.кмл и уклоните зависност ЈУнит јер нам није потребна.
# 4) Затим су нам потребне ХТТП клијентска библиотека, ХТТП Цоре библиотека, ЈСОН Парсер библиотека, ТестНГ библиотека, Јацксон-дата бинд Либрари
# 5) Додајте горе наведене зависности (библиотеку) у датотеку пом.кмл.
ХТТП библиотека клијента:
ХТТП основна библиотека:
ЈСОН Парсер библиотека:
Библиотека ТестНГ:
# 6) Преузмите најновије и стабилне верзије. Нећемо додати течај Селениум у наш пројекат, јер вршимо комплетно позадинско тестирање. Коначна датотека пом.кмл изгледа као што је приказано на слици испод:
# 7) Затим створите оквир за свој АПИ тест
до) Направите пакет „цом.ка.цонфиг“ -> Направите датотеку „цонфиг.пропертиес“ и сачувајте све УРЛ адресе.
б) Направите још један пакет „ка.цом.басе“ -> Направите класу „тестБасе.јава“ која ће бити родитељска класа за све класе. Садржи уобичајене функције које ће користити све методе.
ц) Креирајте други пакет „цом.ка.цлиент“ и класу „рестЦлиент.јава“. Садржи код за преузимање позива ГЕТ, ПОСТ, ДЕЛЕТЕ, ПУТ.
д) Направите још један пакет „цом.ка.дата“ и класу „усер.јава“ која дефинише различита корисничка својства.
је) На крају, креирајте пакет „цом.ка.Тест“ под „срц / тест / јава“ и прогласите главну методу и функције за тестирање свих метода ГЕТ, ПУТ, ПОСТ и Делете.
ф) Коначна структура оквира ће изгледати као што је приказано доле:
г) Користите лажни АПИ који нуди ова веб локација РЕК РЕС .
ХТТП методе или ЦРУД операције
Погледајмо различите ХТТП методе или ЦРУД операције које аутоматизујемо.
Испод наведене операције називамо ЦРУД операције:
- Ц. : Направи (значи ПОСТ позив)
- Р. : Преузми (значи ГЕТ цалл)
- У : Ажурирање (значи ПУТ позив)
- Д. : Делете (значи Избриши позив)
Параметри у РЕСТ веб услугама
Потврдите или нагласите доње параметре у РЕСТ веб услугама:
(и) УРИ: УРИ је комбинација параметра УРЛ + путања и параметра упита.
Пример: хттп://апи.цом/сервице/аццоунт/1
Ево, апи.цом је УРЛ за С2 сервер, услуга је држач. У овој услузи, носилац иде на рачун класе и из ове класе налога позива методу аццоунт = 1. У сваком позиву проследимо УРИ.
(ии) Корисни терет: ЈСОН / КСМЛ подаци које доводимо у систем.
(иии) Статусни код: За сваки одговор добијамо статусне кодове.
Овде је доле наведено неколико кодова:
- 200: Ок, све ради у реду.
- 201: Успешно створено, сваки пут када вршите ПОСТ позив или креирате нови ентитет.
- 400: Корисни терет је погрешан, крајњи УРЛ је погрешан, приказује лош захтев.
- 404: Ажурирајте или избришите ентитет и тај ентитет није доступан, а онда добијамо резултат као ненађен захтев.
- 500: Претпоставимо да С2 сервер не ради, добијамо унутрашњу грешку сервера.
- 401: Грешка потврда идентитета
Кликните овде да бисте добили све статусне кодове.
(ив) Заглавља: Попут токена за потврду идентитета, корисничког ИД-а / лозинке, типа садржаја итд.
примене јаве у стварном свету
ЦРУД операције помоћу Апацхе ХТТП клијента
# 1) ГЕТ Цалл
Како се понаша операција ГЕТ Цалл?
Гет Цалл шаље захтев и прима одговор. Овде не прослеђујемо ЈСОН или корисни терет, већ прослеђујемо један УРИ у којем УРЛ (параметар пута крајње тачке, параметар упита) заједно са заглављем, ако је доступан.
најбољи софтвер за виртуелне машине за Виндовс 10
Пре писања ГЕТ позивног кода, имајте на уму следеће ствари:
- Треба вам ГЕТ метода
- Тада треба УРЛ
- Једном када притиснете дугме за слање, добићете одговор. Затим спремите одговор.
- Потребан вам је статусни код, заглавља.
Погледајте доњи снимак заслона ПОСТМАН клијента који приказује ГЕТ одговор на позив:
У класи рестЦлиент.јава,
(и) Направите ГЕТ метод који ће позвати УРЛ и добити одговор у облику ЈСОН објекта без заглавља.
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; } }
(ии) Направите главну класу „гетАПИТест.јава“ под „срц / тест / јава“
Оутпут
# 2) ПОСТ позив
ПОСТ Цалл креира рачун или креира нови ентитет.
Пример - Проследите ове детаље као што су име, посао и заглавље ЈСОН-у. С2 сервер ће бити повезан са неком базом података, рецимо Орацле, и има неко име табеле звано Аццоунт табле. ПОСТ метода ће створити унос у бази података и С2 сервер прослеђује информације С1 клијенту. Запамтите да се операција ПОСТ позива увек користи за стварање новог ентитета.
У ПОСТ методи, морамо проследити УРЛ и корисни терет.
Преузмите ову зависност јер треба да претворимо Јава класу у Јава објекат него у ЈСОН објекат.
У класи рестЦлиент.јава,
(и) Направите ПОСТ методу која ће позвати УРЛ и послати одговор.
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; } }
(ии) Направите главну класу „постАПИ_Тест.јава“ под „срц / тест / јава“.
//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) ПУТ позив
Користећи операцију позива ПУТ, можете створити нови ентитет и ажурирати постојећи ентитет.
У класи рестЦлиент.јава,
(и) Направите ПУТ метод који ће позвати УРЛ и ажурирати одговор.
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; } }
(ии) Направите главну класу „путАПИ_Тест.јава“ под „срц / тест / јава“
//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) Избриши позив
Операција брисања позива је једноставна, тј. Избришите рачун ид-100 и проследите информације у ЈСОН датотеку.
У класи рестЦлиент.јава,
(и) Направите методу брисања која ће позвати УРЛ и избрисати запис.
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; }
(ии) Направите главну класу „делетеАПИ_Тест.јава“ под „срц / тест / јава“.
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'); }
Оутпут
Пре него што потврдите било који одговор, узмите тачан УРЛ од програмера, затим проверите да ли добијате очекивани одговор од сервера, припремите тест случајеве за сваки сценарио и уредите тест случајеве у низу в.р.т функционалности.
Закључак
У овом чланку детаљно смо описали како се користи Апацхе ХТТП клијент за аутоматизацију позива ПОСТ, ПУТ, ГЕТ и Делете са примерима кода. Такође смо разговарали о врстама веб услуга и важности ЈСОН / КСМЛ датотека и зашто се оне користе.
ПРЕВ Туториал |. | ПРВИ Водич
Препоручено читање
- Водич за веб услуге: Компоненте, архитектура, типови и примери
- 15+ водича за СоапУИ: Најбољи алат за тестирање АПИ-ја за веб услуге
- Питања и одговори за интервју за Амазон Веб Сервицес (АВС)
- Топ 20 РЕСТфул питања и одговора за интернетске услуге
- Топ 25 питања и одговора за интервју за Јава Веб Сервицес
- 45 питања и одговора за интервју за веб услуге (РЕСТфул, СОАП, безбедносна питања)
- Тестирање перформанси веб услуга помоћу ЛоадРуннер ВуГен скриптирања
- Водич за тестирање АПИ-ја: Комплетан водич за почетнике