rest api testing with spring resttemplate
Цей поглиблений посібник пояснює, як розпочати тестування API REST із Spring RestTemplate та TestNG на простих прикладах:
У цій статті ми побачимо, як розпочати тестування REST API за допомогою RestTemplate та TestNG.
Перш ніж досліджувати тестування REST API за допомогою RestTemplate та TestNG, давайте розберемося з деякими основними поняттями, задіяними в ньому.
Давайте розпочнемо!!
Що ви дізнаєтесь:
- Що таке REST?
- Що таке JSON?
- Що таке тестування REST API?
- Що таке TestNG?
- Що таке шаблон REST для весни?
- Етапи тестування REST API
- Налаштування TestNG Test Framework у Windows
- Повний код файлу TestCRUD
- Висновок
- Рекомендована література
Що таке REST?
На сьогоднішній день REST став досить популярним вибором для створення веб-служб. Наприклад , Google має кілька служб REST, таких як Календар, Map API тощо
Відпочинок тобто Представницький державний трансфер це програмний архітектурний стиль. У цьому стилі визначається набір обмежень, а для задоволення цих обмежень потрібні побудовані веб-служби. Такі веб-служби, що відповідають архітектурному стилю REST, відомі як RESTful Web Services.
Термін «представницький державний трансфер» вперше був висунутий Рой Філдінг в докторі наук дисертація у 2000 році. Основна ідея REST полягає в тому, щоб розглядати об’єкти на стороні сервера як ресурси, які можна створити або видалити.
Що таке JSON?
JSON тобто Позначення об’єкта JavaScript - це дуже часто використовуваний синтаксис у службах REST для зберігання та обміну даними між браузером та сервером.
Головною перевагою JSON є його легкий і, по-друге, його читабельний формат. Дані зберігаються у форматі пари ключ-значення. Наприклад, Ви можете зберегти дані про співробітників у форматі JSON, наприклад: {“name”: ”Emp1 ″,“ pay ”:“ 3000 ″, “age”: “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, яка була представлена навесні 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, щоб створити новий ресурс працівника
# два) Встановіть заголовки та тіло, якщо це потрібно для методу HTTP.
У нашому прикладі ми намагаємось створити новий ресурс за допомогою POST. Для POST потрібне тіло запиту.
Отже, ми встановимо тіло наступним чином:
“Name”: “zozo100 ″,” зарплата ”:” 123 ″, “вік”: ”23 ″
Прийміть : application / JSON та Тип вмісту : application / JSON.
питання співбесіди на angularjs для досвідчених
# 3) Встановіть відповідний метод HTTP, тобто POST у цьому випадку.
# 4) Надішліть запит на сервер служби відпочинку.
# 5) Отримайте відповідь від сервера.
Виклик REST API за допомогою інструменту POSTMAN
# 6) Перевірте відповідь, як очікувалося, за допомогою коду відповіді Наприклад 200 ОК як успіх.
# 7) Перевірте тіло відповіді, як очікувалося, якщо потрібно, порівнявши його з вашим тестовим файлом.
Тепер ми повинні автоматизувати ті самі кроки для нашого набору автоматизованих тестів. Почнемо з налаштування, необхідного для автоматизації.
Налаштування TestNG Test Framework у Windows
# 1) Встановлення
- Ми збираємось використовувати Java для розробки тестового сценарію. Отже, спочатку завантажте Інсталятор JDK для Windows та встановіть Java на свою машину.
- IDE (інтегроване середовище розробки) : Я використовував Eclipse як IDE для розробки програми автоматизації тестів. Клацніть тут щоб завантажити його.
- Отримати плагін Eclipse для TestNG: Зверніть увагу, що Java 1.7+ потрібна для запуску TestNG для плагіна Eclipse. Потрібне Eclipse 4.2 і вище. [Довідка: ТестNG ]. Виконайте наступні кроки в Eclipse:
- Виберіть Довідка / Встановити нове програмне забезпечення.
- Натисніть Додати -> Введіть http://beust.com/eclipse/
- Поставте прапорець біля URL-адреси та натисніть кнопку Далі.
Встановлення TestNG
-
- Продовжуйте натискати кнопку «Далі», поки не дійдете до наступного екрана.
Заключний екран встановлення TestNG
Нарешті, прийміть ліцензійну угоду Apache і натисніть кнопку Готово, щоб завершити встановлення.
Перезапустіть Eclipse, щоб почати діяти встановлення плагіна.
- Весняні банки: Тепер ще одне, що ми збираємося використовувати клас RestTemplate із фреймворку. Ти можеш завантажити весняні банки - - і збережіть його в локальній папці, Наприклад ,C: / projectJar
- JSON-прості банки: Нам потрібно виконати синтаксичний аналіз JSON. Для цього ми будемо використовувати легкий Json-простий API. Отже, завантажте Json-simple-1.1.jar до C: / projectJar
Зараз ми завершили необхідні установки. Отже, давайте створимо наш проект автоматизації випробувань.
# 2) Налаштування проекту
- Створити файл -> Новий -> Проект Java -> Назвіть його як « EmployeeTestSuite ’.
- Тепер створіть новий пакет Java com.demo :
- Налаштування шляху побудови:
- Як ви бачили в попередньому розділі, ми встановили TestNG, завантажили банки spring та JSON-прості. Отже, тепер ми повинні додати шлях побудови в наш проект, щоб споживати їх. Для цього створіть lib папку в EmployeeTestSuite і тепер скопіюйте всі банки з C: / projectJar в lib папку.
- Клацніть правою кнопкою миші на EmployeeTestSuite '' -> Шлях побудови -> Налаштуйте Шлях побудови.
- Клацніть на lib вкладку.
- Клацніть на Додати бібліотеку кнопка -> Виберіть TestNG. Це додасть TestNG до шляху збірки.
- Натисніть на Додайте банки кнопка -> Виберіть усі банки з lib. Це додасть всі пружинні банки та JSON-просту банку до шляху створення вашого проекту.
Шлях побудови Java
Структура вашого проекту зараз відображатиметься в Провіднику пакетів Eclipse наступним чином.
Структура упаковки
# 3) Тестовий клас
Нам потрібно створити тестовий клас, який може охоплювати операції CRUD (Create-Read-Update-Delete).
Створіть новий файл File -> New -> TestNG class і назвіть його TestCRUD.java
# 4) Метод випробування
Створимо окремі методи тестування:
- addEfficiee (): Тестовий метод для тестування Створення API за допомогою методу HTTP POST.
- getEfficiee (): Тестовий метод для тестування API Read за допомогою методу HTTP GET.
- updateE Employee (): Тестовий метод для тестування API оновлення за допомогою методу HTTP PUT.
- deleteE Employee (): Тестовий метод для тестування API видалення за допомогою методу HTTP DELETE.
Ви можете створити метод тесту як будь-який метод Java лише з анотацією @Test TestNG, щоб визначити його як метод тесту за допомогою рамки TestNG
Наприклад,далі наведено метод тестування addEfficiee.
@Test public void addEmployee () {}
У нашому прикладі я використав a зразок REST Service.
Тепер давайте автоматизуємо виклик POST. Для цього нам потрібно зіставити наш код із кроками, які ми виконували вручну в розділі «Кроки тестування REST API» по одному.
# 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 сервера.
# 6) Перевірте відповідь, як очікувалося, за допомогою коду відповіді.
Assert.assertEquals(response.getStatusCode(), HttpStatus.OK);
Тут ми використовуємо клас інструментів Assert TestNG для перевірки методу коду стану assertEquals, який порівнює фактичне значення, тобто response.getStatusCode (), із очікуваним значенням HttpStatus.OK.
Але тут ми робимо ще одну перевірку, тобто перевірку, чи доданий Співробітник присутній у тілі відповіді чи ні.
Assert.assertTrue(responseBody.contains(employeeId));
Як ми отримали ідентифікатор працівника?
Для цього ми використовуємо допомогу API-аналізатора JSON, тобто Json-simple.
Ми використовуємо парсер JSON, оскільки формат JSON використовується для зберігання та обміну даними між клієнтом та нашим сервером у нашій службі REST для співробітників. Як згадувалося раніше, дані JSON зберігаються в ключ: значення формат. Тут ми хочемо отримати “Id” значення.
Ми отримаємо його, проаналізувавши тіло відповіді наступним чином:
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
Отже, це все про тест методу Create.
Методи оновлення, отримання та видалення
- Створіть окремі методи тестування та встановіть заголовки відповідно.
- Перевірка коду стану також проводиться аналогічним чином.
- Основна відмінність - це Методи надсилання запиту на сервери.
Ви можете використовувати такі методи:
# 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. Ви можете використовувати метод DELETE RestTemplate:
public void delete(String url, Object... urlVariables) throws RestClientException
Окрім цих методів існують корисні методи обміну () та виконання ().
Наприклад, якщо ви помітили, метод Delete є недійсним. Але якщо ви хочете перевірити тіло відповіді, тоді вам знадобиться відповідь від виконання методу. З цією метою ви можете використовувати метод exchange (), який повертає ResponseEntity. Зверніться до Весняний каркас для більш детальної інформації.
# 5) Запуск тестів
Тепер ми виконали завдання розробки сценарію тесту, тож давайте запустимо тести. Просто клацніть правою кнопкою миші TestCRUD.java і виберіть опцію «Запустити як тест TestNG» .
Це відобразить результати виконання тесту наступним чином.
Вихід консолі
Примітка: Ви можете визначити свій набір тестів у 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.
Запитання щодо інтерв’ю щодо селену за 4 роки досвіду
З цього ми дізналися наступне:
- Для автоматизації тестів ми вибрали Java як мову програмування.
- Ми вибрали TestNG в якості тестової основи для створення тестового сценарію, де ми використовували анотації TestNG, такі як @Test.
- Для надсилання фактичних запитів HTTP на сервер ми використовували клас Spring framework RestTemplate.
- Для споживання цих API ми встановили TestNG, завантажили банки Spring та Json-простий jar для API-аналізатора.
- Нарешті, ми виконали клас Test і побачили результат на консолі, а також у більш презентабельному та читабельному форматі HTML.
У двох словах, у цій статті ми дізналися, як розпочати роботу з автоматизацією тесту REST API за допомогою Spring RestTemplate. Ми розглянули налаштування нашої системи автоматизації тестів, починаючи від встановлення всього необхідного програмного забезпечення, налаштування проекту, розробки тестового сценарію до виконання тесту та перегляду сформованих звітів.
Цього цілком достатньо для будь-якого контролю якості автоматизації, щоб розпочати роботу з системою автоматизації тестування. Але ми бачили лише необхідні частини з кожного, Наприклад, ми використовували встановлення TestNG, метод тестування з використанням анотації @Test, повідомляє. Однак TestNG надає набагато більше функцій, таких як DataProvider для тестування на основі даних тощо.
Ви готові розпочати роботу з автоматизацією тесту REST API за допомогою Spring RestTemplate?
Рекомендована література
- 10 найкращих засобів тестування API у 2021 році (SOAP та REST API)
- Найкращі засоби тестування програмного забезпечення 2021 р. [Засоби автоматизації тестування якості]
- Тестування Праймера Завантажити електронну книгу
- 20 найважливіших запитань та відповідей на тестування API
- Спрощення тестування API за допомогою Katalon Studio
- Підручник з Parasoft SOAtest: інструмент тестування API без скриптів
- Тестування навантаження за допомогою підручників HP LoadRunner
- Різниця між робочим столом, тестуванням клієнтського сервера та веб-тестуванням