web services testing using apache http client
Цей підручник стосується виконання різних CRUD-операцій на веб-службах та тестування веб-служб за допомогою клієнта Apache HTTP:
У цьому Повна серія підручників з тестування API , ми дізналися, що веб-служби виступають як засіб комунікації між клієнтською та серверною машинами, яка взаємодіє через мережу. Ми пояснили все про Тестування API за допомогою POSTMAN у нашому попередньому уроці.
У цій статті ми наголосимо на тестуванні веб-служб за допомогою HTTP-клієнта Apache та виконанні різних CRUD-операцій на веб-службах. Будуть також обговорені різні типи клієнтів REST, доступні для тестування.
як витягти .7z файли на
Що ви дізнаєтесь:
Що таке веб-служба?
Веб-служби - це засіб комунікації між клієнтською та серверною машинами, яке взаємодіє через мережу за допомогою протоколів HTTP. Веб-служби, як правило, API, які не встановлюються та не зберігаються локально, але доступні у хмарах або на деяких віддалених серверах.
Зверніться до прикладу нижче, щоб зрозуміти, як працюють веб-служби.
MakeMyTrip та Goibibo.com - це деякі з відомих веб-сайтів для бронювання авіаквитків та готелів, і доступні різні постачальники польотів, такі як Indigo, Air India та Etihad тощо.
Якщо клієнт хоче забронювати рейс з Нью-Йорка до Лондона, він може переглядати веб-сторінки безпосередньо на порталі авіакомпаній, або може здійснити бронювання через сторонніх постачальників. Якщо вони здійснюють бронювання через сторонні постачальники, такі як MakeMyTrip та інші сайти бронювання, протягом декількох секунд вони порівняють і покажуть результати, надаючи деталі рейсу, такі як найнижча ціна, час польоту та багато іншого.
Тут виникає питання, як саме, за лічені секунди вони надають нам інформацію? Що саме вони роблять?
З інтерфейсу користувача вони беруть всю необхідну інформацію і зберігають її у файлі JSON або XML і викликають API постачальників із маркером автентифікації, коли вони виставляють свої API, і у відповідь сайт постачальника авіарейсів надсилає відповідь JSON / XML на MakeMyTrip і вони перетворюють отриману відповідь і відображають деталі в інтерфейсі користувача.
Типи веб-служб
Існує два типи веб-служб, а саме
- SOAP API
- REST API
Давайте побачимо відмінності між цими двома веб-службами, як зазначено на зображенні нижче.
Файли JSON / XML у веб-службі
Нехай система S1 повертається мовою J2EE, а система S2 повертається в .NET або Python, і ми знаємо, що обидві технології абсолютно відрізняються одна від одної з огляду на безпеку. Тоді як система S2 буде ділитися кодом з іншою системою?
Отже, система S2 виставляє свої API системі S1 без викриття ділової логіки, а система S2 спільно використовує ім’я API, URL-адресу API, формат API та ключ автентифікації / ключ маркера для доступу до своєї системи. Зв'язок відбувається між двома системами за допомогою файлів JSON або XML.
Чому лише файл JSON / XML?
Використовуються файли JSON / XML, оскільки це колектори даних. Будь-яка конкретна інформація зберігається у форматах JSON або XML, оскільки вона легка і є стандартною мовою для спілкування між двома різними інтерфейсами / платформами або системами.
Отже, API завжди використовується, коли дві незалежні системи взаємодіють між собою, або локально, всередині системи, або через мережу.
Що таке клієнт REST?
REST Client - це інструмент, який викликає API. Він використовується в серверному тестуванні, коли немає інтерфейсу для виклику API. Деякі популярні клієнти REST - це клієнт Apache HTTP, POSTMAN, SOAP UI, Swagger та багато інших.
Тут, у цій статті, ми обговоримо лише HTTP-клієнт Apache, а в інших майбутніх статтях ми розглянемо інші різні клієнти HTTP.
Налаштування HTTP-клієнта в Eclipse
# 1) Відкрийте Eclipse і створіть новий проект Maven.
# два) Видаліть фіктивні пакети, надані MAVEN, тобто “Src / main / java” і “Src / test / java”
# 3) Перейдіть до файлу pom.xml і видаліть залежність JUnit, оскільки вона нам не потрібна.
# 4) Потім нам потрібна бібліотека клієнта HTTP, основна бібліотека HTTP, бібліотека аналізатора JSON, бібліотека TestNG, бібліотека прив’язки даних Джексона
# 5) Додайте наведені вище залежності (бібліотеку) у файл pom.xml.
Клієнтська бібліотека HTTP:
Основна бібліотека HTTP:
Бібліотека аналізатора JSON:
Бібліотека TestNG:
# 6) Завантажте останню та стабільну версії. Ми не будемо додавати банку Селен у наш проект, оскільки ми проводимо повне тестування. Остаточний файл pom.xml виглядає так, як показано на малюнку нижче:
# 7) Далі створіть фреймворк для тестування API
до) Створіть пакет “com.qa.config” -> Створіть файл “config.properties” і збережіть усі URL-адреси.
б) Створіть інший пакет “qa.com.base” -> Створіть клас “testBase.java”, який буде батьківським класом для всіх класів. Він містить загальні функції, які використовуються всіма методами.
в) Створіть інший пакет “com.qa.client” і клас “restClient.java”. Він містить код для отримання викликів GET, POST, DELETE, PUT.
г) Створіть інший пакет “com.qa.data” та клас “user.java”, який визначає різні властивості користувача.
є) Нарешті, створіть пакет “com.qa.Test” під “src / test / java” та оголосіть основний метод та функції для перевірки всіх методів GET, PUT, POST та Delete.
f) Остаточна структура фреймворку буде виглядати так, як показано нижче:
g) Використовуйте фіктивний API, наданий цим веб-сайтом REQ RES .
Методи HTTP або CRUD-операції
Давайте побачимо різні методи HTTP або CRUD-операції, які ми автоматизуємо.
Нижче перелічені операції називаються CRUD-операціями:
- C. : Створити (означає виклик POST)
- Р. : Отримати (означає ОТРИМАТИ дзвінок)
- U : Оновлення (означає виклик PUT)
- D : Видалити (означає Видалити дзвінок)
Параметри веб-служб REST
Перевірте або підкресліть наведені нижче параметри в REST Web Services:
(i) URI: URI - це комбінація параметра URL + Path та параметра запиту.
Приклад: http://api.com/service/account/1
Ось, api.com - це URL-адреса сервера S2, обслуговування є власником. У цій службі власник переходить до рахунок class, і з цього класу акаунта він викликає метод account = 1. Під час кожного дзвінка ми передаємо URI.
(ii) Корисне навантаження: Дані JSON / XML, які ми подаємо до системи.
(iii) Код статусу: Для кожної відповіді ми отримуємо коди стану.
Нижче наведено кілька кодів:
- 200: Добре, все працює нормально.
- 201: Створено успішно, коли ви здійснюєте виклик POST або створюєте нову сутність.
- 400: Корисне навантаження неправильне, кінцева URL-адреса неправильна, відображає поганий запит.
- 404: Оновіть або видаліть сутність, і ця сутність недоступна, тоді ми отримуємо результат як не знайдений запит.
- 500: Припустимо, що сервер S2 не працює, ми отримуємо внутрішню помилку сервера.
- 401: Помилка аутентифікації
Клацніть тут щоб отримати всі коди стану.
(iv) заголовки: Як маркер автентифікації, ідентифікатор користувача / пароль, тип вмісту тощо.
безкоштовні завантажувачі відео для Windows 10 -
CRUD-операції з використанням клієнта Apache HTTP
# 1) ОТРИМАТИ дзвінок
Як поводиться операція GET Call?
Get Call надсилає запит і отримує відповідь. Тут ми не передаємо жодного JSON або корисного навантаження, ми передаємо один URI, в якому URL (параметр шляху до кінцевої точки, параметр запиту) разом із заголовком, якщо такий є.
широта першого пошуку c ++ дерево
Перш ніж писати код виклику GET, майте на увазі нижче:
- Потрібен метод GET
- Тоді потрібна URL-адреса
- Після натискання кнопки відправки ви отримаєте відповідь. Потім збережіть відповідь.
- Потрібен код стану, заголовки.
Зверніться до знімка екрана клієнта POSTMAN, який відображає відповідь на виклик GET:
У класі restClient.java,
(i) Створіть метод GET, який викличе URL-адресу та отримає відповідь у вигляді об’єкта JSON без заголовка.
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; } }
(ii) Створіть основний клас “getAPITest.java” у “src / test / java”
Вихідні дані
# 2) POST дзвінок
POST Call створює обліковий запис або створює нову сутність.
Приклад - Передайте ці деталі, як-от ім’я, роботу та заголовок, в корисне навантаження JSON. Сервер S2 буде пов'язаний з якоюсь базою даних, скажімо Oracle, і має назву таблиці, яка називається Account table. Метод POST створить запис у базі даних, а сервер S2 передає інформацію клієнту S1. Пам'ятайте, що операція виклику POST завжди використовується для створення нової сутності.
У методі POST ми повинні передавати URL-адресу та корисне навантаження.
Завантажте цю залежність, оскільки нам потрібно перетворити клас Java на об'єкт Java, ніж на об'єкт JSON.
У класі restClient.java,
(i) Створіть метод POST, який викликає URL-адресу та розміщує відповідь.
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; } }
(ii) Створіть основний клас “postAPI_Test.java” у “src / test / java”.
//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) PUT дзвінок
Використовуючи операцію виклику PUT, ви можете створити нову сутність та оновити існуючу.
У класі restClient.java,
(i) Створіть метод PUT, який викличе URL-адресу та оновить відповідь.
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; } }
(ii) Створіть основний клас “putAPI_Test.java” у “src / test / java”
//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 та передати інформацію у файлі JSON.
У класі restClient.java,
(i) Створіть метод видалення, який викликає URL-адресу та видаляє запис.
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; }
(ii) Створіть основний клас “deleteAPI_Test.java” під “src / test / java”.
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'); }
Вихідні дані
Перш ніж перевіряти будь-яку відповідь, отримайте правильну URL-адресу від розробника, а потім перевірте, чи отримуєте ви очікувану відповідь від сервера, підготуйте тестові кейси для кожного сценарію та розташуйте тестові кейси в послідовності з функціональністю w.r.t.
Висновок
У цій статті ми детально описали, як використовувати клієнт Apache HTTP для автоматизації викликів POST, PUT, GET та Delete, із прикладами коду. Ми також обговорили типи веб-служб та важливість файлів JSON / XML та те, чому вони використовуються.
НАЗАД Підручник | ПЕРШИЙ підручник
Рекомендована література
- Підручник з веб-служб: Компоненти, архітектура, типи та приклади
- 15+ підручників SoapUI: найкращий інструмент тестування API веб-служб
- Запитання та відповіді на інтерв’ю веб-служб Amazon (AWS)
- Топ-20 запитань та відповідей на інтерв’ю RESTful Web Services
- Найкращі 25 запитань та відповідей на інтерв’ю веб-служб Java
- Найпопулярніші 45 запитань та відповідей щодо інтерв’ю веб-служб (RESTful, SOAP, питання безпеки)
- Тестування продуктивності веб-служб за допомогою сценаріїв LoadRunner VuGen
- Підручник з тестування API: повний посібник для початківців