rest api testing with spring resttemplate
Този задълбочен урок обяснява как да започнем с REST API тестване с Spring RestTemplate и TestNG с прости примери:
В тази статия ще видим как да започнем с REST API Testing с RestTemplate и TestNG framework.
Преди да проучим REST API Testing с RestTemplate и TestNG framework, нека разберем някои от основните концепции, включени в него.
Да започваме!!
Какво ще научите:
- Какво е ПОЧИВКА?
- Какво е JSON?
- Какво е REST API тестване?
- Какво е TestNG?
- Какво е пролетен шаблон REST?
- Стъпки за тестване на REST API
- Настройка на TestNG Test Framework под Windows
- Попълнете кода на файла TestCRUD
- Заключение
- Препоръчително четене
Какво е ПОЧИВКА?
В днешно време REST се превърна в доста популярен избор за изграждане на уеб услуги. Например , Google има множество REST услуги като Календар, API на картата и т.н.
ПОЧИВКА i.e. Представителен държавен трансфер е софтуерен архитектурен стил. В този стил се дефинира набор от ограничения и се изискват изградени уеб услуги, които да отговарят на тези ограничения. Такива уеб услуги, отговарящи на архитектурния стил REST, са известни като RESTful Web Services.
Терминът „Представителен държавен трансфер“ беше представен за първи път от Рой Филдинг в докторската си степен дисертация през 2000 г. Основната идея на REST е да третира обектите от страна на сървъра като ресурси, които могат да бъдат създадени или изтрити.
Какво е JSON?
JSON i.e. JavaScript обектна нотация е много често използван синтаксис в REST услугите за съхраняване и обмен на данни между браузъра и сървъра.
Основното предимство на JSON е неговият лек и второ, четимият му формат също. Данните се съхраняват във формат двойка ключ: стойност. Например, можете да съхранявате данните за служителите във формат JSON по следния начин: {„име“: „Emp1 ″,„ заплата “:„ 3000 ″, „възраст“: „23 ″,„ id “:„ 52686 ″}.
Какво е REST API тестване?
Когато казваме REST API тестване, това е основно тестване на API чрез извършване на действия за създаване, редактиране, четене и изтриване на ресурс с 4 основни метода, т.е. POST, GET, PUT и DELETE, съответно
Какво е TestNG?
TestNG е тестова рамка, вдъхновена от JUnit и NUnit. Това е за езика за програмиране Java. TestNG обхваща по-широк спектър от тестови категории като единица, функционалност, от край до край, интеграция и др.
Това е рамка с отворен код, която попада под лиценза Apache. Той предоставя богат набор от анотации, които ускоряват развитието на тестовия скрипт.
Какво е пролетен шаблон REST?
Spring RestTemplate клас е част от spring-web, въведена през Spring 3
Класът RestTemplate осигурява много удобен начин за тестване на HTTP базирани успокояващи уеб услуги, като предоставя претоварени методи за HTTP методи като GET, POST, PUT, DELETE и др. Spring framework също е с отворен код.
Стъпки за тестване на REST API
Нека разберем стъпките, които обикновено се следват при REST API Тестване с някои примери, за да получите ясно разбиране.
В тази статия разгледах една примерна услуга за служители на REST API от този източник.
Първоначално нека следваме стъпките ръчно с помощта на инструмента POSTMAN.
# 1) Първо, знайте крайната точка на API, до която искате да осъществите достъп.
Например, http://dummy.restapiexample.com/api/v1/create, за да създадете нов ресурс на служител
# две) Задайте Headers и Body, ако е необходимо за HTTP метода.
В нашия пример, тъй като се опитваме да създадем нов ресурс, използвайки POST. За POST е необходимо тяло на заявка.
Така че ще настроим тялото по следния начин:
„Име“: „zozo100 ″,„ заплата “:„ 123 ″, „възраст“: „23 ″
Приемете : application / JSON и Тип съдържание : application / JSON.
безплатен блокиращ прозорец за хром
# 3) Задайте подходящия HTTP метод, т.е. POST в този случай.
# 4) Изпратете заявка до сървъра за почивка.
# 5) Получете отговор от сървъра.
REST API Call с помощта на инструмента POSTMAN
# 6) Проверете отговора, както се очаква, с помощта на кода за отговор E.g. 200 ОК като успех.
# 7) Проверете тялото за отговор, както се очаква, ако се изисква, като го сравните с вашия бенчмарк файл.
Сега трябва да автоматизираме същите стъпки за нашия тестов пакет за автоматизация. Нека започнем с настройката, необходима за автоматизация.
Настройка на TestNG Test Framework под Windows
# 1) Инсталация
- Ще използваме Java за разработване на тестов скрипт. И така, първо изтегляне Инсталатор на JDK за Windows и инсталирайте Java на вашата машина.
- IDE (интегрирана среда за развитие) : Използвал съм Eclipse като IDE за разработката на Automation Test Suite. Щракнете тук за да го изтеглите.
- Вземете приставката Eclipse за TestNG: Имайте предвид, че Java 1.7+ е необходима за стартиране на TestNG за приставката Eclipse. Необходимо е Eclipse 4.2 и по-горе. (Справка: ТестNG ). Следвайте стъпките по-долу в Eclipse:
- Изберете Помощ / Инсталиране на нов софтуер.
- Щракнете върху Добавяне -> Въведете http://beust.com/eclipse/
- Поставете отметка в квадратчето до URL адреса и кликнете върху бутона Напред.
Инсталиране на TestNG
-
- Продължавайте да щраквате върху бутона Next, докато стигнете до следния екран.
Финален екран за инсталиране на TestNG
И накрая, приемете лицензионното споразумение на Apache и кликнете върху бутона Finish, за да завършите инсталацията.
Рестартирайте Eclipse, за да влезе в сила инсталацията на приставката.
- Пролетни буркани: Сега още едно последно нещо, ще използваме класа RestTemplate от пролетната рамка. Можеш изтеглете пролетни буркани и го запазете в локална папка, Например ,C: / projectJar
- JSON-прости буркани: Трябва да извършим JSON парсинг. За това ще използваме лек API за Json-simple. И така, изтеглете Json-simple-1.1.jar в C: / projectJar
Сега завършихме необходимите инсталации. И така, нека създадем нашия проект за автоматизация на тестовете.
# 2) Настройка на проекта
- Създаване на файл -> Нов -> Проект Java -> Именувайте го като ‘ EmployeeTestSuite ’.
- Сега, Създайте нов java пакет com.demo :
- Конфигуриране на пътя на изграждане:
- Както видяхте в предишния раздел, ние инсталирахме TestNG, изтеглихме пролетни и JSON прости буркани. И така, сега трябва да добавим път за изграждане в нашия проект, за да ги консумираме. За това създайте a lib папка в EmployeeTestSuite и сега копирайте всички буркани от C: / projectJar в lib папка.
- Щракнете с десния бутон върху „ EmployeeTestSuite ’’ -> Път за изграждане -> Конфигуриране на Път за изграждане.
- Щракнете върху lib раздел.
- Щракнете върху Добавяне на библиотека бутон -> Изберете TestNG. Това ще добави TestNG към пътя за изграждане.
- Кликнете върху Добавете буркани бутон -> Изберете всички буркани от lib. Това ще добави всички пролетни буркани и JSON-прост буркан към пътя на вашето изграждане на проекта.
Път за изграждане на Java
Структурата на вашия проект ще бъде показана по следния начин в Eclipse Package Explorer сега.
Структура на пакета
# 3) Тестов клас
Трябва да създадем тестов клас, който да обхваща CRUD (Създаване-четене-актуализиране-изтриване) операции.
Създайте нов клас File -> New -> TestNG class и го кръстете TestCRUD.java
# 4) Метод за изпитване
Нека създадем отделни методи за тестване:
- addEfficiee (): Тестов метод за тестване на Създаване на API с помощта на HTTP POST метод.
- getEfficiee (): Тестов метод за тестване на API за четене с помощта на HTTP GET метод.
- updateEfficiee (): Тестов метод за тестване на API за актуализиране с помощта на метода HTTP PUT.
- deleteEfficiee (): Тестов метод за тестване на API за изтриване с помощта на метода HTTP DELETE.
Можете да създадете метод за тестване като всеки метод на Java само с @Test анотация на TestNG, за да го идентифицирате като метод за тестване от рамката TestNG
Например,по-долу е методът за тест addEfficiee.
@Test public void addEmployee () {}
В нашия пример използвах примерна услуга REST.
Сега нека автоматизираме повикването POST. За това трябва да картографираме нашия код със стъпките, които следвахме ръчно в раздела „REST API Testing Steps“ една по една.
# 1) Първо, знайте крайната точка на API, до който искате да осъществите достъп.
String addURI = 'http://dummy.restapiexample.com/api/v1/create';
# две) Задайте заглавки за HTTP метода.
HttpHeaders headers = new HttpHeaders();
// Добавяне на заглавки
headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json');
Задайте Body за HTTP метода.
String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}';
// Създаване на HttpEntity обект чрез задаване на тяло и заглавки.
HttpEntity entity = new HttpEntity(jsonBody, headers);
Ще имаме следните стъпки автоматизирани в едно изявление.
# 3) Задайте подходящия HTTP метод, т.е. POST в този случай.
# 4) Изпратете заявка до сървъра за услуги RESTful.
# 5) Получете отговор от сървъра.
RestTemplate restTemplate = new RestTemplate(); ResponseEntity response =restTemplate.postForEntity(addURI, entity, String.class);
Ние използваме postForEntity за изпращане на метода POST към сървъра. Получаваме отговора от обекта ResponseEntity на сървъра.
разлика в c и c ++
# 6) Проверете отговора, както се очаква, с помощта на кода за отговор.
Assert.assertEquals(response.getStatusCode(), HttpStatus.OK);
Тук използваме инструменталния клас Assert на TestNG, за да проверим метода код на състоянието assertEquals, който сравнява действителната стойност, т.е. response.getStatusCode (), с очакваната стойност HttpStatus.OK.
Но тук правим още една проверка, т.е. проверка дали добавеният служител присъства в тялото на отговора или не.
Assert.assertTrue(responseBody.contains(employeeId));
Как получихме идентификатора на служителя?
За целта използваме помощта на JSON синтактичен API, т.е. Json-simple.
Използваме синтактичен анализатор JSON, тъй като форматът JSON се използва за съхраняване и обмен на данни между клиента и нашия сървър в услугата REST за служители. Както бе споменато по-рано, JSON данните се съхраняват в ключ: стойност формат. Тук искаме да получим 'документ за самоличност' стойност.
Ще го получим, като анализираме тялото на отговора, както следва:
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
И така, всичко е за теста за създаване на метод.
Методи за актуализиране, получаване и изтриване
- Създайте отделни методи за тестване и задайте Headers, както е приложимо.
- Проверката на кода на състоянието също се извършва по подобен начин.
- Основната разлика е методите за изпращане на заявка до сървърите.
Можете да използвате следните методи:
# 1) Актуализиране на служител : Това е HTTP PUT заявката. Методът RestTemplate PUT, който можете да използвате, е:
public void put(String url,Object request, Object... urlVariables) throws RestClientException
# 2) Вземете служител: Това е HTTP GET заявката. Методът RestTemplate GET, който можете да използвате, е както следва:
public ResponseEntity getForEntity(String url, Class responseType, Object... urlVariables) throws RestClientException
# 3) Изтриване на ресурс за служители: Това е HTTP DELETE заявката. Методът за изтриване на RestTemplate, който можете да използвате, е:
public void delete(String url, Object... urlVariables) throws RestClientException
Освен тези методи съществуват полезни методи exchange () и execute ().
Например, ако забележите, методът Delete е невалиден. Но ако искате да проверите тялото на отговора, тогава ще ви трябва отговор от изпълнението на метода. За тази цел можете да използвате метода exchange (), който връща ResponseEntity. Обърнете се към Пролетна рамка за повече информация.
# 5) Изпълнение на тестовете
Сега завършихме нашата задача за разработка на тестов скрипт, така че нека стартираме нашите тестове. Просто щракнете с десния бутон върху TestCRUD.java и изберете опцията ‘Run as TestNG Test’ .
Това ще покаже резултатите от тестовото изпълнение, както следва.
Конзолен изход
Забележка: Можете да дефинирате своя тестов пакет в testng.xml файл също. В нашия пример това е само един тестов скрипт. Но в реалния сценарий това винаги е колекция от множество скриптове.
Така вашият файл testg.xml ще изглежда по следния начин:
# 6) Доклади
Видяхме резултата на конзолата. Но TestNG предоставя резултатите от теста в по-представителен html формат, който може да бъде споделен с вашите заинтересовани страни. Отворете тест-изход -> emailable-report.html в браузъра.
Ще видите протокола от теста, както следва. На страницата с отчета можете да видите името на теста като TestCRUD, няколко преминати теста, т.е.4, брой пропуснати и неуспешни, които са 0 в този случай. Той също така показва общото време, необходимо за изпълнение на всеки метод на тестване.
Резултат от теста във формат Html
Попълнете кода на файла TestCRUD
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(); } }
Заключение
Обобщихме резултатите от обучението по тази статия по-долу. Видяхме всички стъпки от самото начало за създаване на REST API Test Automation Framework.
В това научихме следното:
- За автоматизация на тестовете избрахме Java като език за програмиране.
- Избрахме TestNG като тестова рамка за създаване на тестов скрипт, където използвахме анотации на TestNG като @Test.
- За изпращане на действителни HTTP заявки към сървъра използвахме клас Spring Spring RestTemplate.
- За да консумираме тези API, направихме инсталирането на TestNG, изтеглихме Spring jars и Json-simple jar за API на парсер.
- Накрая изпълнихме тестовия клас и видяхме резултата на конзолата, както и в по-представителен и по-четим HTML формат.
С две думи, в тази статия научихме как да започнем с REST API автоматизация на теста с Spring RestTemplate. Обхванахме настройката на нашата рамка за автоматизация на тестове, започвайки от Инсталиране на целия основен софтуер, Инсталиране на проекти, Разработка на скрипт за тест до изпълнение на теста и преглед на генерираните отчети.
Това е достатъчно за всяко QA за автоматизация, за да започне с вашата рамка за автоматизация на теста. Но ние видяхме само необходимите части от всяка, например, използвахме TestNG инсталация, метод за тестване, използвайки @Test анотация, съобщава. Въпреки това TestNG предоставя много повече функции като DataProvider за тестване, управлявано от данни, и т.н.
Готови ли сте да започнете с тестовата автоматизация на REST API с Spring RestTemplate?
Препоръчително четене
- 10 най-добри инструмента за тестване на API през 2021 г. (SOAP и REST API инструменти за тестване)
- Най-добри инструменти за тестване на софтуер 2021 г. (Инструменти за автоматизация на QA теста)
- Изтегляне на eBook за тестване на Primer
- Топ 20 на най-важните въпроси и отговори за интервю за API тестване
- Улесняване на тестването на API с Katalon Studio
- Урок за Parasoft SOAtest: Инструмент за тестване на API без скриптове
- Тестване на натоварване с уроци за HP LoadRunner
- Разлика между тестване на настолни компютри, клиентски сървър и уеб тестване