rest api testing with spring resttemplate
Овај детаљни водич објашњава како започети са РЕСТ АПИ тестирањем помоћу Спринг РестТемплате и ТестНГ са једноставним примерима:
У овом чланку ћемо видети како да започнемо са РЕСТ АПИ тестирањем са РестТемплате и ТестНГ фрамеворк-ом.
Пре истраживања РЕСТ АПИ тестирања са РестТемплате и ТестНГ фрамеворк-ом, хајде да разумемо неке од основних концепата који су у то укључени.
Почнимо!!
Шта ћете научити:
- Шта је ОДМОР?
- Шта је ЈСОН?
- Шта је РЕСТ АПИ тестирање?
- Шта је ТестНГ?
- Шта је Спринг РЕСТ предложак?
- РЕСТ АПИ кораци за тестирање
- Постављање ТестНГ Тест Фрамеворк-а на Виндовс-у
- Комплетни код датотеке ТестЦРУД
- Закључак
- Препоручено читање
Шта је ОДМОР?
У данашње време РЕСТ је постао прилично популаран избор за израду веб услуга. На пример , Гоогле има више РЕСТ услуга попут Календара, Мап АПИ итд.
ОДМОР тј. Репрезентативни државни пренос је софтверски архитектонски стил. У овом стилу дефинише се скуп ограничења и потребне су изграђене веб услуге да би се задовољила та ограничења. Такве веб услуге које одговарају архитектонском стилу РЕСТ познате су као РЕСТфул Веб Сервицес.
Термин „репрезентативни државни трансфер“ први је изнео Рои Фиелдинг у свом докторату дисертација 2000. Основна идеја РЕСТ-а је третирање објеката на страни сервера као ресурса који се могу креирати или избрисати.
Шта је ЈСОН?
ЈСОН тј. ЈаваСцрипт ознака објекта је врло често коришћена синтакса у РЕСТ услугама за чување и размену података између прегледача и сервера.
Главна предност ЈСОН-а је његова лагана, а друго, и читљив формат. Подаци се чувају у формату пар кључ: вредност. На пример, можете да сачувате податке о запосленима у ЈСОН формату овако: {„име“: „Емп1 ″,„ плата “:„ 3000 ”,„ старост “:„ 23 ”,„ ид “:„ 52686 ″}.
Шта је РЕСТ АПИ тестирање?
Када кажемо РЕСТ АПИ тестирање, то је у основи тестирање АПИ-ја извођењем радњи Цреате, Едит, Реад и Делете на Ресурсу са 4 главне методе, односно ПОСТ, ГЕТ, ПУТ и ДЕЛЕТЕ
Шта је ТестНГ?
ТестНГ је тест оквир који је инспирисан ЈУнит-ом и НУнит-ом. То је за програмски језик Јава. ТестНГ покрива шири спектар категорија испитивања као што су јединица, функционалност, енд-то-енд, интеграција итд.
То је оквир отвореног кода који се налази под лиценцом Апацхе. Пружа богат скуп напомена које убрзавају развој тест скрипте.
Шта је Спринг РЕСТ предложак?
Класа Спринг РестТемплате је део спринг-веба који је представљен у Спринг 3
Класа РестТемплате пружа врло згодан начин за тестирање мирних веб услуга заснованих на ХТТП-у пружајући преоптерећене методе за ХТТП методе као што су ГЕТ, ПОСТ, ПУТ, ДЕЛЕТЕ, итд. Спринг фрамеворк је такође отвореног кода.
РЕСТ АПИ кораци за тестирање
Дајте нам разумевање корака који се обично следе у РЕСТ АПИ тестирању са неким примерима како бисмо стекли јасно разумевање.
У овом чланку сам разматрао један пример услуге за запослене РЕСТ АПИ из овај извор.
У почетку, следимо кораке ручно помоћу алата ПОСТМАН.
# 1) Прво, знајте крајњу тачку АПИ-ја којој желите да приступите.
На пример, хттп://думми.рестапиекампле.цом/апи/в1/цреате да бисте креирали нови ресурс запослених
#два) Подесите заглавља и тело ако је потребно за ХТТП метод.
У нашем примеру, док покушавамо да створимо нови ресурс помоћу ПОСТ-а. За ПОСТ је потребно тело захтева.
Дакле, поставићемо тело на следећи начин:
„Име“: „зозо100 ″,„ плата “:„ 123 ″, „старост“: „23 ″
Прихвати : апплицатион / ЈСОН и Тип садржаја : апплицатион / ЈСОН.
ц ++ иде са компајлером
# 3) Подесите одговарајућу ХТТП методу, тј. ПОСТ у овом случају.
# 4) Пошаљите захтев серверу услуге одмора.
# 5) Примите одговор од сервера.
РЕСТ АПИ позив помоћу алата ПОСТМАН
# 6) Проверите одговор како се очекује помоћу кода за одговор На пример. 200 ОК као успех.
# 7) Проверите тело одговора како се очекује ако је потребно упоређивањем са вашом референтном датотеком.
Сада морамо аутоматизовати исте кораке за наш тест аутомат пакет. Почнимо са подешавањем потребним за аутоматизацију.
Постављање ТестНГ Тест Фрамеворк-а на Виндовс-у
# 1) Инсталација
- Користићемо Јаву за развој тест скрипти. Дакле, Прво преузимање ЈДК инсталациони програм за Виндовс и инсталирајте Јава на свој рачунар.
- ИДЕ (Интегрисано развојно окружење) : Користио сам Ецлипсе као ИДЕ за развој програма Аутоматион Тест Суите. Кликните овде да га преузмете.
- Набавите додатак Ецлипсе за ТестНГ: Имајте на уму да је Јава 1.7+ потребна за покретање ТестНГ-а за додатак Ецлипсе. Ецлипсе 4.2 и новије је потребно. (Референца: ТестНГ ). Следите кораке у наставку у Ецлипсе:
- Изаберите Помоћ / Инсталација новог софтвера.
- Кликните на Адд -> Унесите хттп://беуст.цом/ецлипсе/
- Означите поље за потврду поред УРЛ-а и кликните на дугме Даље.
Инсталација ТестНГ-а
-
- Наставите да кликћете на дугме Даље, док не дођете до следећег екрана.
Завршни екран инсталације ТестНГ-а
На крају, прихватите Апацхе лиценчни уговор и кликните на дугме Заврши да бисте довршили инсталацију.
Поново покрените Ецлипсе да бисте ступили на снагу инсталације додатка.
- Спринг Јарс: Сада још једна последња ствар, користићемо класу РестТемплате из пролећног оквира. Можете преузмите пролећне тегле и сачувајте га у локалној фасцикли, На пример ,Ц: / пројецтЈар
- ЈСОН-једноставне тегле: Морамо извршити ЈСОН рашчлањивање. За то ћемо користити лагани Јсон-једноставан АПИ. Дакле, преузмите Јсон-симпле-1.1.јар на Ц: / пројецтЈар
Сада смо завршили потребне инсталације. Дакле, креирајмо наш пројекат Аутоматизација теста.
# 2) Постављање пројекта
- Направи датотеку -> Ново -> Јава пројекат -> Назовите је као ‘ ЕмплоиееТестСуите ’.
- Сада, креирајте нови јава пакет цом.демо :
- Конфигуришите путању градње:
- Као што сте видели у претходном одељку, инсталирали смо ТестНГ, преузели пролећне и ЈСОН једноставне тегле. Дакле, сада у наш пројекат морамо додати путању изградње како бисмо их конзумирали. За то направите а либ директоријум у ЕмплоиееТестСуите и сада копирајте све тегле из Ц: / пројецтЈар у либ директоријум.
- Десни клик на „ ЕмплоиееТестСуите ’’ -> Буилд Патх -> Конфигуришите Буилд Патх.
- Кликните на либ таб.
- Кликните на Додај библиотеку дугме -> Изаберите ТестНГ. Ово ће додати ТестНГ на путању израде.
- Кликните на Додајте тегле дугме -> Изаберите све тегле из либ. Ово ће додати све пролећне тегле и ЈСОН-једноставан јар у вашу путању израде пројекта.
Јава Буилд Патх
Структура вашег пројекта сада ће бити приказана на следећи начин у програму Ецлипсе Пацкаге Екплорер.
Структура пакета
# 3) Тест класа
Морамо створити тест класу која може да обухвати ЦРУД (Цреате-Реад-Упдате-Делете) операције.
Направите нову класу Датотека -> Нова -> ТестНГ класа и назовите је ТестЦРУД.јава
# 4) Метода испитивања
Створимо одвојене методе испитивања:
- аддЕффициее (): Тест метода за тестирање Цреате АПИ помоћу ХТТП ПОСТ методе.
- гетЕффициее (): Тест метода за тестирање АПИ-ја за читање помоћу ХТТП ГЕТ методе.
- упдатеЕффициее (): Тест метода за тестирање АПИ-ја за ажурирање помоћу ХТТП ПУТ методе.
- делетеЕффициее (): Тест метода за тестирање Делете АПИ помоћу ХТТП ДЕЛЕТЕ методе.
Можете створити метод тестирања као било који јава метод само са @Тест анотацијом ТестНГ-а да бисте га идентификовали као тест методу помоћу оквира ТестНГ
На пример,следећи је тест метода аддЕффициее.
двоструко повезана листа ц ++ код
@Test public void addEmployee () {}
У нашем примеру сам користио а узорак РЕСТ услуга.
Сада ћемо аутоматизирати ПОСТ позив. За то морамо да мапирамо наш код са корацима које смо ручно пратили у одељку „РЕСТ АПИ Тестинг Степс“ (Кораци за тестирање РЕСТ АПИ-ја) један по један.
# 1) Прво, знајте крајњу тачку АПИ-ја којем желите да приступите.
String addURI = 'http://dummy.restapiexample.com/api/v1/create';
#два) Подесите заглавља за ХТТП метод.
HttpHeaders headers = new HttpHeaders();
// Додај заглавља
headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json');
Подесите тело за ХТТП метод.
String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}';
// Стварање објекта ХттпЕнтити постављањем тела и заглавља.
HttpEntity entity = new HttpEntity(jsonBody, headers);
Имаћемо следеће кораке аутоматизоване у једној изјави.
# 3) Подесите одговарајућу ХТТП методу, тј. ПОСТ у овом случају.
# 4) Пошаљите захтев серверу услуге РЕСТфул.
# 5) Примите одговор од сервера.
RestTemplate restTemplate = new RestTemplate(); ResponseEntity response =restTemplate.postForEntity(addURI, entity, String.class);
Ми користимо постФорЕнтити да пошаље методу ПОСТ серверу. Одговор добијамо од сервера РеспонсеЕнтити објекта.
# 6) Проверите одговор како се очекује помоћу кода за одговор.
Assert.assertEquals(response.getStatusCode(), HttpStatus.OK);
Овде користимо класу алата Ассерт за ТестНГ да бисмо верификовали метод статусног кода ассертЕкуалс који упоређује стварну вредност, тј. Респонсе.гетСтатусЦоде (), са очекиваном вредношћу ХттпСтатус.ОК.
Али овде радимо још једну верификацију, тј. Проверу да ли је додати запослени присутан у телу одговора или не.
Assert.assertTrue(responseBody.contains(employeeId));
Како смо добили идентификацију запосленог?
За ово користимо помоћ ЈСОН парсер АПИ-ја, тј. Јсон-симпле.
Користимо ЈСОН парсер, јер се формат ЈСОН користи за чување и размену података између клијента и нашег сервера у РЕСТ услузи запослених. Као што је раније поменуто, ЈСОН подаци се чувају у кључ: вредност формат. Ево, желимо да узмемо „Ид“ вредност.
Добићемо га рашчлањивањем тела одговора на следећи начин:
JSONParser parser = new JSONParser(); // Instantiate JSONParser object JSONObject jsonResponseObject = new (JSONObject) parser.parse(jsonString); //Parse jsonString i.e. Response body string in json format to JSON object String employeeId = jsonResponseObject.get('id').toString(); // Get id attribute
Дакле, овде се ради о тесту Цреате методе.
Ажурирајте, преузмите и избришите методе
- Направите одвојене методе испитивања и подесите заглавља према потреби.
- Провера статусног кода се такође врши слично.
- Главна разлика су методе слања захтева на сервере.
Можете користити следеће методе:
# 1) Ажурирајте запосленог : То је ХТТП ПУТ захтев. РестТемплате ПУТ метода коју можете користити је:
public void put(String url,Object request, Object... urlVariables) throws RestClientException
# 2) Нађите запосленог: То је ХТТП ГЕТ захтев. РестТемплате ГЕТ метода коју можете користити је следећа:
public ResponseEntity getForEntity(String url, Class responseType, Object... urlVariables) throws RestClientException
# 3) Избришите ресурс запослених: То је ХТТП ДЕЛЕТЕ захтев. РестТемплате ДЕЛЕТЕ метода коју можете користити је:
public void delete(String url, Object... urlVariables) throws RestClientException
Поред ових метода, постоје корисне методе размене () и извршавања ().
На пример, ако приметите, метода Делете је ништавна. Али ако желите да верификујете тело одговора, тада ће вам требати одговор из извршења методе. У ту сврху можете користити методу екцханге () која враћа РеспонсеЕнтити. Односи се Пролећни оквир За више детаља.
# 5) Покретање тестова
Сада смо завршили задатак израде скрипте за тестирање, па покренимо тестове. Само кликните десним тастером миша ТестЦРУД.јава и изаберите опцију „Покрени као ТестНГ тест“ .
Ово ће приказати резултате извршавања теста на следећи начин.
Излаз конзоле
Белешка: Можете да дефинишете свој тестни пакет у тестнг.кмл датотека такође. У нашем примеру то је само један тест скрипт. Али у стварном сценарију то је увек колекција више скрипти.
Тако ће ваша датотека тестг.кмл изгледати на следећи начин:
# 6) Извештаји
Резултат смо видели на конзоли. Али ТестНГ пружа резултате тестова у представљивијем хтмл формату који се може поделити са заинтересованим странама. Отвори тест-оутпут -> емаилабле-репорт.хтмл у прегледачу.
Видећете извештај о испитивању на следећи начин. На страници извештаја можете видети назив теста као ТестЦРУД, неколико положених тестова, тј. 4, број прескочених и неуспелих који су 0 у овом случају. Такође показује укупно време потребно за свако извршење методе испитивања.
Резултат теста у ХТМЛ формату
Комплетни код датотеке ТестЦРУД
package com.demo; import java.io.IOException; import java.text.ParseException; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import org.testng.Assert; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import org.testng.log4testng.Logger; /** * This test class has test methods for CRUD actions on REST API * REST Service http://dummy.restapiexample.com/api * * It has test methods for Create , Edit , Get and Delete Employee items * https://docs.spring.io/spring-framework/docs/current/javadoc- api/org/springframework/web/client/RestTemplate.html * https://docs.spring.io/autorepo/docs/spring/3.2.3.RELEASE/javadoc- api/org/springframework/web/client/RestTemplate.html * @author * */ public class TestCRUD { private String responseBody; public String responseBodyPOST; final static Logger logger = Logger.getLogger(TestCRUD.class); //RESTTemplate Object private RestTemplate restTemplate; //Employee ID private String employeeId; // Create Response Entity - Stores HTTPStatus Code, Response Body, etc private ResponseEntity response; @BeforeTest public void beforeTest() throws IOException, ParseException { logger.info('Setting up prerequisite for test execution'); logger.info('Creating RestTemplate object before tests'); this.restTemplate = new RestTemplate(); } /** * Test Method to add employee using HTTP POST request * * Verifies POST action Status Code * * @throws IOException * @throws ParseException */ @Test public void addEmployee() throws IOException, ParseException { String addURI = 'http://dummy.restapiexample.com/api/v1/create'; HttpHeaders headers = new HttpHeaders(); headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json'); logger.info('Add URL :'+addURI); String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}'; System.out.println('
' + jsonBody); HttpEntity entity = new HttpEntity(jsonBody, headers); //POST Method to Add New Employee response = this.restTemplate.postForEntity(addURI, entity, String.class); responseBodyPOST = response.getBody(); // Write response to file responseBody = response.getBody().toString(); System.out.println('responseBody --->' + responseBody); // Get ID from the Response object employeeId = getEmpIdFromResponse(responseBody); System.out.println('empId is :' + employeeId); // Check if the added Employee is present in the response body. Assert.assertTrue(responseBody.contains(employeeId)); // System.out.println(propertyFile.get('EmployeeAddResBody')); // Check if the status code is 201 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); logger.info('Employee is Added successfully employeeId:'+employeeId); } /** * Method to get Employee ID from REsponse body * I have used Json Simple API for Parsing the JSON object * * @param json * @return */ public static String getEmpIdFromResponse(String json) { JSONParser parser = new JSONParser(); JSONObject jsonResponseObject = new JSONObject(); Object obj = new Object(); try { obj = parser.parse(json); } catch (org.json.simple.parser.ParseException e) { e.printStackTrace(); } jsonResponseObject = (JSONObject) obj; String id = jsonResponseObject.get('id').toString(); return id; } /** * Test Method to Update employee using HTTP PUT request * * Verifies PUT action Status Code * Verifies Updated Name exists in Response Body * * @throws IOException * @throws ParseException */ @Test(dependsOnMethods = 'addEmployee', enabled = true) public void updateEmployee() throws IOException, ParseException { String updateURI = 'http://dummy.restapiexample.com/api/v1/update/'+employeeId; logger.info('Update URL :'+updateURI); String jsonBody = responseBodyPOST; jsonBody = jsonBody.replace('zozo100', 'update_zozo100'); HttpHeaders headers = new HttpHeaders(); headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json'); HttpEntity entity = new HttpEntity(jsonBody, headers); //PUT Method to Update the existing Employee //NOTE that I have Not used restTemplate.put as it's void and we need response for verification response = restTemplate.exchange(updateURI, HttpMethod.PUT, entity, String.class); responseBody = response.getBody().toString(); System.out.println('Update Response Body :'+responseBody); // Check if the updated Employee is present in the response body. Assert.assertTrue(responseBody.contains('update_zozo100')); // Check if the status code is 200 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); logger.info('Employee Name is Updated successfully employeeId:'+employeeId); } /** * Test Method to Get employee using HTTP GET request * * Verifies GET action Status Code * Verifies Name exists in Response Body * * @throws IOException * @throws ParseException */ @Test(dependsOnMethods = 'updateEmployee', enabled = true) void getEmployee() throws IOException, ParseException { String getURI = 'http://dummy.restapiexample.com/api/v1/employee/'+this.employeeId; logger.info('Get URL :'+getURI); HttpHeaders headers = new HttpHeaders(); HttpEntity entity = new HttpEntity(headers); //GET Method to Get existing Employee response = restTemplate.getForEntity(getURI,String.class); // Write response to file responseBody = response.getBody().toString(); //Suppressing for log diffs System.out.println('GET Response Body :'+responseBody); // Check if the added Employee ID is present in the response body. Assert.assertTrue(responseBody.contains('update_zozo100')); // Check if the status code is 200 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); logger.info('Employee is retrieved successfully employeeId:'+employeeId); } /** * Test Method to Delete employee using HTTP DELETE request * * Verifies DELETE action Status Code * Verifies Success Message Text in Response Body * * @throws IOException * @throws ParseException */ @Test(dependsOnMethods = 'getEmployee', enabled = true) public void deleteEmployee() throws IOException, ParseException { String delURI = 'http://dummy.restapiexample.com/api/v1/delete/'+this.employeeId; HttpHeaders headers = new HttpHeaders(); HttpEntity entity = new HttpEntity(headers); //DELETE Method to Delete existing Employee response = restTemplate.exchange(delURI, HttpMethod.DELETE, entity, String.class); // Check if the status code is 204 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); responseBody = response.getBody(); Assert.assertEquals(getMessageFromResponse(responseBody), 'successfully! deleted Records'); logger.info('Employee is Deleted successfully employeeId:'+employeeId); } /** * Gets 'text' key value from Response body text for verification * I have used Json Simple API for Parsing the JSON object * * @param json * @return text string */ public static String getMessageFromResponse(String json) { String successMessageText = null; try { JSONParser parser = new JSONParser(); JSONObject jsonResponseObject = new JSONObject(); jsonResponseObject = (JSONObject) (parser.parse(json)); String successMessage = jsonResponseObject.get('success').toString(); jsonResponseObject = (JSONObject) (parser.parse(successMessage)); successMessageText = jsonResponseObject.get('text').toString(); } catch (org.json.simple.parser.ParseException e) { e.printStackTrace(); } return successMessageText; } @AfterTest public void afterTest() { logger.info('Clean up after test execution'); logger.info('Creating RestTemplate object as Null'); this.restTemplate = new RestTemplate(); } }
Закључак
У наставку смо резимирали исход учења овог чланка. Видели смо све кораке од почетка да бисмо поставили РЕСТ АПИ Тест Аутоматион Фрамеворк.
Из овога смо сазнали следеће:
- За аутоматизацију тестова изабрали смо Јаву као програмски језик.
- Одабрали смо ТестНГ као тест оквир за креирање тест скрипте где смо конзумирали ТестНГ напомене попут @Тест.
- За слање стварних ХТТП захтева на сервер користили смо класу Спринг фрамеворк РестТемплате.
- За употребу ових АПИ-ја урадили смо инсталацију ТестНГ-а, преузели Спринг јар-ове и Јсон-симпле јар за парсер АПИ.
- Коначно, извршили смо класу Тест и видели резултат на конзоли, као и у представљивијем и читљивијем ХТМЛ формату.
Укратко, у овом чланку смо научили како започети са аутоматизацијом РЕСТ АПИ Тест са Спринг РестТемплате. Покривали смо постављање нашег оквира за аутоматизацију теста, почев од Инсталације целокупног софтвера, Постављања пројеката, Израде тест скрипти до извршења теста и прегледавања генерисаних извештаја.
Ово је прилично довољно за било које КА за аутоматизацију да започне са вашим оквиром за аутоматизацију теста. Али, видели смо само тражене делове из сваког, на пример, користили смо ТестНГ инсталацију, методу тестирања помоћу @Тест анотације, извештава. Међутим, ТестНГ пружа много више функција попут ДатаПровидер-а за тестирање на основу података итд.
Да ли сте спремни да започнете са аутоматизацијом РЕСТ АПИ Тест са Спринг РестТемплате?
Препоручено читање
- 10 најбољих алата за тестирање АПИ-ја у 2021. години (СОАП и РЕСТ АПИ алати за тестирање)
- Најбољи алати за тестирање софтвера 2021. (Алати за аутоматизацију КА теста)
- Преузимање е-књиге за тестирање буквара
- 20 најважнијих питања и одговора за интервјуисање АПИ испитивања
- Поједностављивање АПИ тестирања помоћу Каталон Студија
- Водич за Парасофт СОАтест: Алат за тестирање АПИ-ја без скрипти
- Испитивање оптерећења помоћу ХП ЛоадРуннер водича
- Разлика између тестирања радне површине, клијентског сервера и веб тестирања