Що таке REST?
REST розшифровується як "Репрезентаційна передача стану", що є новим способом зв'язку між будь-якими двома системами в певний момент часу. Одна з систем називається «REST Client», а інша - «REST Server».
У цьому підручнику REST ви дізнаєтесь:
- Що таке REST?
- Що таке клієнт REST?
- Що таке REST Server?
- Що таке Restito?
- Як протестувати клієнта REST за допомогою Restito?
- Переваги використання Restito Framework для тестування клієнтів REST
- Недоліки використання Restito Framework для тестування клієнтів REST
Перш ніж дізнатися про Restito Framework для тестування клієнтів REST, давайте спершу вивчимо кілька основ.
Що таке клієнт REST?
Клієнт REST - це метод або інструмент для виклику API служби REST, який доступний для зв'язку будь-якою системою чи постачальником послуг. Наприклад: якщо API отримує інформацію про трафік у реальному часі від Google, програмне забезпечення / інструмент, який викликає API трафіку Google, називається REST-клієнтом.
Що таке REST Server?
Це метод або API, який піддається комунікації будь-якою системою або постачальником послуг. Наприклад, Google надає API для отримання інформації про дорожній рух у режимі реального часу за певним маршрутом.
Тут сервер Google повинен бути запущений, щоб слухати будь-які запити до відкритого API від різних клієнтів.
Приклад:
Пора встановити повний наскрізний сценарій із наведених вище визначень.
Давайте розглянемо додатки для замовлення таксі, такі як Uber, оскільки компанія потребує інформації в режимі реального часу про дорожню ситуацію навколо маршрутів, на яких знаходиться даний автомобіль.
Клієнт відпочинку:
Тут клієнтом є мобільний додаток Uber, до якого водій ввійшов. Ця програма надсилає запит до REST API, який відкривається картами Google, щоб отримати дані в режимі реального часу. Наприклад, запит HTTP GET.
Сервер відпочинку:
У цьому прикладі Google є постачальником послуг, і API Google Maps відповідає необхідними деталями на запит програми Uber.
І клієнт, і сервер однаково важливі у спілкуванні REST.
Тут ми застосували приклади для автоматичного тестування лише клієнта REST. Для тестування сервера REST зверніться до https://www.guru99.com/top-6-api-testing-tool.html.
Що таке Restito?
Restito - це фреймворк, розроблений Мкоцуром. Це полегшений додаток, який допоможе вам виконати будь-який HTTP-запит. Ви можете використовувати Restito для тестування своїх REST API та пошуку проблем у вашому додатку чи мережі.
Як протестувати клієнта REST за допомогою Restito?
Давайте розділимо вправу на наступні 4 кроки:
- Створіть HTTP-клієнт і метод для надсилання HTTP-запиту GET до будь-якої кінцевої точки сервера. На даний момент вважаємо кінцевою точкою http: // localhost: 9092 / getevents.
- Запустіть сервер Restito для прослуховування та захоплення запитів, надісланих кінцевій точці «getevents» у localhost http: // localhost: 9092 / getevents.
- Створіть тестовий клас для тестування вищезазначеного клієнта. Викличте метод HTTP-клієнта 'sendGETRequest', щоб ініціювати запит GET до API 'getevents'.
- Перевірте виклик HTTP GET, використовуючи фреймворк Restito.
Давайте глибоко зануримось у кожен із наведених кроків.
Крок 1) Створіть HTTP-клієнт і метод для надсилання HTTP-запиту GET до будь-якої кінцевої точки сервера.
========== Запуск JAVA CODE ===========
пакет com.chamlabs.restfulservices.client;імпортувати java.util.HashMap;імпортувати java.util.Map;імпорт org.apache.http.client.HttpClient;імпорт org.apache.http.client.methods.HttpGet;імпорт org.apache.http.client.methods.HttpPost;імпорт org.apache.http.entity.StringEntity;імпорт org.apache.http.impl.client.HttpClientBuilder;імпорт org.json.JSONObject;/ *** Цей клас створює HTTP-клієнта та має метод надсилання HTTP-запиту GET:* sendGETRequest (…)* /публічний клас RestClient {/ *** Конструктор для класу RestClient* /public RestClient () {System.out.println ("Створення конструктора RestClient");}/ *** Метод надсилання запиту GET на http: // localhost: <> / getevents* @param порт* @return true, якщо запит GET успішно надіслано. Неправда, інакше.* /загальнодоступний статичний булевий sendGETRequest (int порт) {спробуй {Клієнт HttpClient = HttpClientBuilder.create (). Build ();HttpGet getRequest = новий HttpGet ("http: // localhost: + port + "/ getevents");// HttpResponse відповідь = client.execute (запит);client.execute (getRequest);System.out.println ("Запит HTTP успішно відправлений."+ "Повернення істинного");повернути істинно;}catch (виняток e) {e.printStackTrace ();}System.out.println ("Під час створення клієнта HTTP стався виняток."+ "Повернення помилкового");повернути false;}}
========== КОД ЯВА закінчується ===========
Крок 2) Запустіть сервер Restito для прослуховування та захоплення запитів, надісланих кінцевій точці 'getevents' у localhost http: // localhost: 9092 / getevents.
========== Запуск JAVA CODE ===========
пакет com.chamlabs.restfultesting.util;імпортувати статичний com.xebialabs.restito.builder.stub.StubHttp.whenHttp;імпортувати статичний com.xebialabs.restito.semantics.Action.status;імпортувати статичні com.xebialabs.restito.semantics.Condition.get;імпортувати статичні com.xebialabs.restito.semantics.Condition.post;імпортувати java.util.List;імпорт org.glassfish.grizzly.http.util.HttpStatus;імпортувати com.xebialabs.restito.semantics.Call;імпортувати com.xebialabs.restito.server.StubServer;/ *** Цей клас корисності містить декілька методів корисності, таких як:* restartRestitoServerForGETRequests (…)* restartRestitoServerForPOSTRequests (…)* waitAndGetCallList (…)** @author cham6* @email: [email protected]* @fork: https://github.com/cham6/restfultesting.git** /публічний клас TestUtil {/ *** Утилітний метод для запуску сервера restito stub для прийняття запитів GET* @param сервер* @param порт* статус @param* /загальнодоступне статичне відновлення порожнечіRestitoServerForGETRequests (сервер StubServer, порт int, статус HttpStatus){// Убити сервер restitoякщо (сервер! = нуль) {server.stop ();}// Ініціалізуємо та налаштовуємо новіший екземпляр сервера-заглушкисервер = новий StubServer (порт) .run ();whenHttp (сервер) .match (get ("/ getevents")). then (статус (статус));}/ *** Утилітний метод для запуску сервера restito stub для прийняття запитів POST* @param сервер* @param порт* статус @param* /загальнодоступне статичне відновлення порожнечіRestitoServerForPOSTRequests (сервер StubServer, внутрішній порт, статус HttpStatus){// Убити сервер restitoякщо (сервер! = нуль) {server.stop ();}// Ініціалізуємо та налаштовуємо новіший екземпляр сервера-заглушкисервер = новий StubServer (порт) .run ();whenHttp (сервер) .match (post ("/ postevents")). then (статус (статус));}/ *** Для даного сервера-заглушки restito цикл протягом заданої кількості секунд і* перерва і повернення списку дзвінків із сервера.** @param сервер* @param waitTimeInSeconds* @ повернення* @throws InterruptedException* /загальнодоступний статичний списокwaitAndGetCallList (сервер StubServer, int waitTimeInSeconds)кидає InterruptedException{int timeoutCount = 0;Список callList = server.getCalls ();while (callList.isEmpty ()) {Thread.sleep (1000);timeoutCount ++;if (timeoutCount> = waitTimeInSeconds) {перерва;}callList = server.getCalls ();}// Зачекайте 2 секунди, щоб усі дзвінки потрапили в callList, щоб усунути будь-яку хиткість.Thread.sleep (2000);повернути server.getCalls ();}}
========== КОД ЯВА закінчується ===========
Крок 3) Створіть тестовий клас для тестування вищезазначеного клієнта. Викличте метод HTTP-клієнта sendGETRequest, щоб ініціювати запит GET до API 'getevents'.
========== Запуск JAVA CODE ===========
імпорт junit.framework.TestCase;імпортувати com.chamlabs.restfulservices.client.RestClient;імпортувати com.chamlabs.restfultesting.util.TestUtil;імпортувати com.xebialabs.restito.semantics.Call;імпортувати com.xebialabs.restito.server.StubServer;імпортувати статичний org.glassfish.grizzly.http.util.HttpStatus.ACCEPTED_202;імпорт org.json.JSONObject;імпортувати java.util.List;імпортувати java.util.Map;/ *** Цей клас містить кілька контрольних тестів для перевірки операцій RestClient, таких як:* відправляти запит(… )* sendRequestWithCustomHeaders (…)* sendPOSTRequestWithJSONBody (…)** /відкритий клас RestClientTester розширює TestCase {приватний статичний кінцевий Integer PORT = 9098;приватне статичне остаточне ціле число PORT2 = 9099;приватне статичне остаточне ціле число PORT3 = 9097;public RestClientTester () {System.out.println ("Запуск тесту RestClientTester");}/ *** Тест Junit для перевірки запиту GET від RestClient* Кроки:* 1) Створіть сервер-заглушку за допомогою фреймворка Restito і налаштуйте його для прослуховування на даному порту* 2) Викличте метод sendGETRequest (…) RestClient* 3) Restito фіксує відповідні надіслані запити GET, якщо такі є.* 4) Перевірте, чи Restito захопив будь-які запити GET для даної кінцевої точки* Очікувана поведінка:*> Restito повинен був захопити запит GET, і він повинен був захопити лише один запит GET.* Нарешті:*> Зупиніть сервер-заглушку, який почав використовувати restito.* /public void testGETRequestFromClient () {Сервер StubServer = null;спробуй {// Це запустить сервер заглушки на 'PORT' і відповість HTTP 202 'ACCEPTED_202'TestUtil.restartRestitoServerForGETRequests (сервер, PORT, ACCEPTED_202);RestClient.sendGETRequest (PORT);СписокcallList = TestUtil.waitAndGetCallList (сервер, 30);assertTrue ("Запит GET не отримано від RestClient. Тест не вдався.",(callList! = null) && (callList.size () == 1));}catch (виняток e) {e.printStackTrace ();fail ("Тест не вдався через виняток: + e);}нарешті {якщо (сервер! = нуль) {server.stop ();}}}
========== КОД ЯВА закінчується ===========
Крок 4) Як перевірити запит GET за допомогою заголовків та запит POST на тілі, використовуючи фреймворк Restito.
========== Запуск JAVA CODE ===========
/ *** Тест Junit для перевірки запиту GET із заголовками від RestClient* Кроки:* 1) Створіть сервер-заглушку за допомогою фреймворка Restito і налаштуйте його для прослуховування на даному порту* 2) Виклик методу sendGETRequestWithCustomHeaders (…) методу RestClient* 3) Restito фіксує відповідні надіслані запити GET, якщо такі є.* 4) Перевірте, чи Restito захопив будь-які запити GET для даної кінцевої точки* Очікувана поведінка:*> Restito повинен був захопити запит GET, і він повинен був захопити лише один запит GET.*> Отримайте заголовки захопленого запиту GET* і переконайтесь, що заголовки відповідають налаштованим.* Нарешті:*> Зупиніть сервер-заглушку, який почав використовувати restito.* /public void testGETRequestWithHeadersFromClient () {Сервер StubServer = null;спробуй {// Це запустить сервер заглушки на 'PORT' і відповість HTTP 202 'ACCEPTED_202'TestUtil.restartRestitoServerForGETRequests (сервер, PORT2, ACCEPTED_202);RestClient.sendGETRequestWithCustomHeaders (PORT2);СписокcallList = TestUtil.waitAndGetCallList (сервер, 30);assertTrue ("Запит GET не отримано від RestClient. Тест не вдався.",(callList! = null) && (callList.size () == 1));// Перевірка заголовків запиту GET від клієнта RESTMap > headersFromRequest = callList.get (0) .getHeaders ();assertTrue ("Запит GET містить заголовок Accept та його значення",headersFromRequest.get ("Прийняти"). містить ("text / html"));assertTrue ("Запит GET містить авторизацію заголовка та його значення",headersFromRequest.get ("Авторизація"). містить ("Носій 1234567890qwertyuiop"));assertTrue ("Запит GET містить заголовок Cache-Control та його значення",headersFromRequest.get ("Керування кешем"). містить ("no-cache"));assertTrue ("Запит GET містить підключення заголовка та його значення",headersFromRequest.get ("Підключення"). містить ("тримати в живих"));assertTrue ("Запит GET містить заголовок Content-Type та його значення",headersFromRequest.get ("Тип вмісту"). містить ("application / json"));}catch (виняток e) {e.printStackTrace ();fail ("Тест не вдався через виняток: + e);}нарешті {якщо (сервер! = нуль) {server.stop ();}}}
/ *** Тест Junit для перевірки запиту POST із тілом та заголовками від RestClient* Кроки:* 1) Створіть сервер-заглушку за допомогою фреймворка Restito і налаштуйте його для прослуховування на даному порту* 2) Виклик методу sendPOSTRequestWithJSONBody (…) RestClient* 3) Restito фіксує відповідні надіслані запити POST, якщо такі є.* 4) Перевірити, чи Restito захопив будь-які запити POST для даної кінцевої точки* Очікувана поведінка:*> Restito повинен був захопити запит POST, і він повинен був захопити лише один запит POST.*> Отримати тіло захопленого запиту POST і перевірити значення JSON* Нарешті:*> Зупиніть сервер-заглушку, який почав використовувати restito.* /public void testPOSTRequestWithJSONBody () {Сервер StubServer = null;спробуй {// Це запустить сервер заглушки на 'PORT' і відповість HTTP 202 'ACCEPTED_202'TestUtil.restartRestitoServerForPOSTRequests (сервер, PORT3, ACCEPTED_202);RestClient.sendPOSTRequestWithJSONBody (PORT3);СписокcallList = TestUtil.waitAndGetCallList (сервер, 30);assertTrue ("Запит POST не отримано від RestClient. Тест не вдався.",(callList! = null) && (callList.size () == 1));// Перевірка заголовків запиту GET від клієнта RESTРядок requestBody = callList.get (0) .getPostBody ();JSONObject postRequestJSON = новий JSONObject (requestBody);assertTrue ("TimeUpdated у json неправильне",postRequestJSON.get ("timeUpdated"). toString (). equalsIgnoreCase ("1535703838478"));assertTrue ("Маркер_доступу в json неправильний",postRequestJSON.get ("марка_доступу"). toString ().equalsIgnoreCase ("abf8714d-73a3-42ab-9df8-d13fcb92a1d8"));assertTrue ("Оновлення_токена в json неправильне",postRequestJSON.get ("refresh_token"). toString ().equalsIgnoreCase ("d5a5ab08-c200-421d-ad46-2e89c2f566f5"));assertTrue ("Тип маркера в json неправильний",postRequestJSON.get ("тип_токена"). toString (). equalsIgnoreCase ("носій"));assertTrue ("Ексклюзивний_in в json неправильний",postRequestJSON.get ("expires_in"). toString (). equalsIgnoreCase ("1024"));assertTrue ("Сфера в json неправильна",postRequestJSON.get ("сфера дії"). toString (). equalsIgnoreCase (""));}catch (виняток e) {e.printStackTrace ();fail ("Тест не вдався через виняток: + e);}нарешті {якщо (сервер! = нуль) {server.stop ();}}}}
========== КОД ЯВА закінчується ===========
Переваги використання Restito Framework для тестування клієнтів REST
Ось плюси / переваги Restito Framework для тестування клієнтів ReST
- Нам не потрібно розробляти власне сервер REST для тестування клієнта REST.
- Restito надає потужні та різноманітні утиліти та методи для знущання над різною поведінкою сервера. Наприклад: Щоб перевірити, як поводиться клієнт REST, коли Сервер відповідає помилкою HTTP 404 або HTTP 503.
- Сервери Restito можуть бути налаштовані за кілька мілісекунд і можуть бути припинені після завершення тестів.
- Restito підтримує всі типи вмісту методів HTTP, такі як стислий, нестиснутий, уніфікований, додаток / текст, додаток / JSON тощо
Недоліки використання Restito Framework для тестування клієнтів REST
Тут є мінуси / недоліки Restito Framework для тестування клієнтів ReST
- Клієнтське джерело REST слід налаштувати, щоб розглядати 'localhost' як серверну машину.
- Відкриття сервера в будь-якому порту може конфліктувати, якщо ми використовуємо деякі часто використовувані порти, такі як '8080' або '9443' тощо.
- Рекомендується використовувати такі порти, як 9092 або 9099, які зазвичай не використовуються іншими інструментами.
Короткий зміст:
- REST розшифровується як "Репрезентаційна передача стану", що є новим стандартним способом зв'язку між будь-якими двома системами в певний момент часу.
- Клієнт REST - це метод або інструмент для виклику API служби REST, який піддається комунікації будь-якою системою чи постачальником послуг.
- У методі RestServer або API, який доступний для зв'язку будь-якою системою чи постачальником послуг.
- Restito - це легкий додаток, який допоможе вам виконати будь-який HTTP-запит
- Створіть HTTP-клієнт і метод для надсилання HTTP-запиту GET до будь-якої кінцевої точки сервера
- Запустіть сервер Restito для прослуховування та захоплення запитів, надісланих кінцевій точці "getevents".
- Запустіть сервер Restito для прослуховування та захоплення запитів, надісланих кінцевій точці «getevents» у localhost
- Тут ми застосували приклади для автоматичного тестування лише клієнта REST.
- Нам не потрібно розробляти власне сервер REST для тестування клієнта REST.
- Клієнтське джерело REST слід налаштувати, щоб розглядати 'localhost' як серверну машину.
Ця стаття представлена Чандрасехаром Муттінені