rest api testing with spring resttemplate
Tento podrobný výukový program vysvetľuje, ako začať s testovaním rozhrania REST API s Spring RestTemplate a TestNG s jednoduchými príkladmi:
V tomto článku si ukážeme, ako začať s testovaním REST API v prostredí RestTemplate a TestNG.
Predtým, ako preskúmame REST API Testovanie pomocou RestTemplate a TestNG framework, pochopíme niektoré základné pojmy, ktoré sú v ňom obsiahnuté.
Začnime!!
Čo sa dozviete:
- Čo je to REST?
- Čo je JSON?
- Čo je testovanie rozhrania REST API?
- Čo je TestNG?
- Čo je šablóna Spring REST?
- Kroky testovania rozhrania REST API
- Nastavenie testovacieho rámca TestNG v systéme Windows
- Kompletný kód súboru TestCRUD
- Záver
- Odporúčané čítanie
Čo je to REST?
V dnešnej dobe sa REST stal veľmi populárnou voľbou vytvárania webových služieb. Napríklad , Google má niekoľko služieb REST, ako je Kalendár, Map API , atď.
ODDYCH t.j. Transfer reprezentačného štátu je softvérový architektonický štýl. V tomto štýle je definovaná sada obmedzení a na splnenie týchto obmedzení sa vyžaduje vytvorenie webových služieb. Takéto webové služby vyhovujúce architektonickému štýlu REST sú známe ako RESTful Web Services.
Pojem „prevod reprezentatívneho štátu“ po prvýkrát predložil Roy Fielding v jeho Ph.D. dizertačná práca v roku 2000. Základnou myšlienkou RESTu je zaobchádzať s objektmi na strane servera ako so zdrojmi, ktoré je možné vytvoriť alebo vymazať.
Čo je JSON?
JSON t.j. Označenie objektu JavaScript je veľmi často používaná syntax v službách REST na ukladanie a výmenu údajov medzi prehliadačom a serverom.
Hlavnou výhodou JSONu je jeho ľahkosť a po druhé aj jeho čitateľný formát. Údaje sa ukladajú vo formáte páru kľúč: hodnota. Napríklad, môžete mať údaje o zamestnancoch uložené vo formáte JSON takto: {„name“: „Emp1“, „plat“: „3000“, „vek“: „23“, „id“: „52686“ “.
Čo je testovanie rozhrania REST API?
Keď povieme testovanie REST API, v podstate ide o testovanie API vykonaním akcií Vytvoriť, Upraviť, Čítať a Odstrániť na zdroji so 4 hlavnými metódami, t. J. POST, GET, PUT a DELETE.
Čo je TestNG?
TestNG je testovací rámec, ktorý je inšpirovaný JUnit a NUnit. Je to pre programovací jazyk Java. TestNG pokrýva širšiu škálu testovacích kategórií ako jednotka, funkčnosť, end-to-end, integrácia atď.
Je to rámec otvoreného zdroja, ktorý spadá pod licenciu Apache. Poskytuje bohatú sadu anotácií, ktoré urýchľujú vývoj testovacieho skriptu.
Čo je šablóna Spring REST?
Trieda Spring RestTemplate je súčasťou jarného webu, ktorý bol predstavený na jar 3
Trieda RestTemplate poskytuje veľmi pohodlný spôsob testovania oddychových webových služieb založených na protokole HTTP poskytovaním preťažených metód pre metódy HTTP, ako sú GET, POST, PUT, DELETE atď. Jarný rámec je tiež otvorený.
Kroky testovania rozhrania REST API
Pochopme, aké kroky sa zvyčajne používajú pri testovaní rozhrania REST API, na niekoľkých príkladoch, aby sme získali jasné pochopenie.
V tomto článku som zvážil jednu ukážku zamestnaneckej služby REST API od tento zdroj.
Spočiatku postupujme manuálne pomocou nástroja POSTMAN.
# 1) Najskôr poznajte koncový bod rozhrania API, ku ktorému chcete získať prístup.
Napríklad, http://dummy.restapiexample.com/api/v1/vytvorte a vytvorte nový zdroj pre zamestnancov
#dva) Ak to vyžaduje metóda HTTP, nastavte hlavičky a text.
V našom príklade, keď sa pokúšame vytvoriť nový zdroj pomocou POST. Pre POST je potrebný text žiadosti.
Nastavíme teda telo nasledovne:
„Name“: „zozo100“, „plat“: „123“, „vek“: „23“
súhlasiť : aplikácia / JSON a Typ obsahu : aplikácia / JSON.
vytvoriť kópiu poľa java
# 3) V tomto prípade nastavte príslušnú metódu HTTP, t. J. POST.
# 4) Odošlite požiadavku na server služby odpočinku.
# 5) Dostať odpoveď od servera.
Volanie REST API pomocou nástroja POSTMAN
# 6) Pomocou kódu odpovede overte odpoveď podľa očakávania Napr. 200 OK ako úspech.
# 7) Ak je to potrebné, podľa potreby overte orgán odpovedí porovnaním s referenčným súborom.
Teraz musíme automatizovať rovnaké kroky aj pre našu sadu Test Automation. Začnime s nastavením potrebným na automatizáciu.
Nastavenie testovacieho rámca TestNG v systéme Windows
# 1) Inštalácia
- Na vývoj testovacieho skriptu použijeme Javu. Takže prvé stiahnutie Inštalátor JDK pre Windows a nainštalujte Java na svoje zariadenie.
- IDE (integrované vývojové prostredie) : Použil som Eclipse ako IDE pre svoj vývoj Automation Test Suite. Kliknite tu stiahnuť.
- Získajte doplnok Eclipse pre TestNG: Upozorňujeme, že na spustenie TestNG pre doplnok Eclipse je potrebná Java 1.7+. Vyžaduje sa Eclipse 4.2 a novší. (Odkaz: TestNG ). Postupujte podľa nasledujúcich krokov v Eclipse:
- Vyberte možnosť Pomocník / Inštalovať nový softvér.
- Kliknite na Pridať -> Zadajte adresu http://beust.com/eclipse/
- Začiarknite políčko vedľa adresy URL a kliknite na tlačidlo Ďalej.
Inštalácia TestNG
-
- Stále kliknite na tlačidlo Ďalej, až kým sa nedostanete na nasledujúcu obrazovku.
Záverečná obrazovka inštalácie TestNG
Nakoniec prijmite licenčnú zmluvu Apache a dokončite inštaláciu kliknutím na tlačidlo Dokončiť.
Reštartujte Eclipse, aby sa vykonala inštalácia doplnku.
- Jarné poháre: A ešte jedna posledná vec, použijeme triedu RestTemplate z jarného frameworku. Môžeš sťahujte jarné poháre a uložte ho do lokálneho priečinka, Napríklad ,C: / projectJar
- Jednoduché nádoby JSON: Musíme vykonať analýzu JSON. Na to použijeme ľahké Json-simple API. Stiahnite si teda Json-simple-1.1.jar do C: / projectJar
Teraz sme dokončili potrebné inštalácie. Poďme teda vytvoriť náš projekt Test Automation.
# 2) Nastavenie projektu
- Create File -> New -> Java Project -> Name it as ‘ EmployeeTestSuite “.
- Teraz vytvorte nový balík Java com.demo :
- Konfigurovať cestu zostavy:
- Ako ste videli v predchádzajúcej časti, nainštalovali sme TestNG, stiahli sme jar a džbány jednoduché vo formáte JSON. Takže teraz musíme do nášho projektu pridať cestu zostavenia, aby sme ich spotrebovali. Za týmto účelom vytvorte a lib priečinok v EmployeeTestSuite priečinok a teraz skopírujte všetky poháre z priečinka C: / projectJar do priečinka lib priečinok.
- Kliknite pravým tlačidlom myši na „ EmployeeTestSuite ““ -> Cesta zostavy -> Konfigurovať cestu zostavy.
- Klikni na lib tab.
- Klikni na Pridať knižnicu tlačidlo -> Vyberte položku TestNG. Týmto sa do cesty zostavenia pridá TestNG.
- Kliknite na Pridajte nádoby tlačidlo -> Vyberte všetky tégliky z lib. Týmto sa do cesty zostavenia vášho projektu pridajú všetky jarné poháre a jednoduchý pohár JSON.
Cesta zostavenia Java
Štruktúra vášho projektu sa teraz v Prieskumníkovi balíkov Eclipse zobrazí nasledovne.
Štruktúra balenia
# 3) Testovacia trieda
Musíme vytvoriť testovaciu triedu, ktorá dokáže pokryť operácie CRUD (Create-Read-Update-Delete).
Vytvorte novú triedu File -> New -> TestNG class a pomenujte ju TestCRUD.java
# 4) Skúšobná metóda
Vytvorme samostatné testovacie metódy:
- addEmployee (): Testovacia metóda na testovanie vytvorenia API pomocou metódy HTTP POST.
- getEmployee (): Testovacia metóda na testovanie rozhrania Read API pomocou metódy HTTP GET.
- updateEmployee (): Testovacia metóda na testovanie Update API pomocou metódy HTTP PUT.
- deleteEmployee (): Testovacia metóda na otestovanie API mazania pomocou metódy HTTP DELETE.
Môžete vytvoriť testovaciu metódu ako ľubovoľnú metódu Java iba s anotáciou TestNG @Test, aby ste ju identifikovali ako testovaciu metódu v rámci TestNG.
Napríklad,nasleduje testovacia metóda addEmployee.
@Test public void addEmployee () {}
V našom príklade som použil a vzorka služby REST.
Teraz automatizujme volanie POST. Za týmto účelom musíme náš kód mapovať krok za krokom, ktorý sme vykonali manuálne v sekcii Kroky testovania REST API.
# 1) Najskôr poznajte koncový bod API, ku ktorému chcete získať prístup.
String addURI = 'http://dummy.restapiexample.com/api/v1/create';
#dva) Nastaviť hlavičky pre metódu HTTP.
HttpHeaders headers = new HttpHeaders();
// Pridajte hlavičky
headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json');
Nastaviť telo pre metódu HTTP.
String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}';
// Vytvorte objekt HttpEntity nastavením tela a hlavičiek.
HttpEntity entity = new HttpEntity(jsonBody, headers);
Nasledujúce kroky budeme mať automatizované v jednom vyhlásení.
# 3) V tomto prípade nastavte príslušnú metódu HTTP, t. J. POST.
# 4) Pošlite požiadavku na server služieb RESTful.
# 5) Dostať odpoveď od servera.
RestTemplate restTemplate = new RestTemplate(); ResponseEntity response =restTemplate.postForEntity(addURI, entity, String.class);
Používame postForEntity na odoslanie metódy POST na server. Odpoveď dostávame od objektu ResponseEntity servera.
# 6) Pomocou kódu odpovede overte odpoveď podľa očakávania.
Assert.assertEquals(response.getStatusCode(), HttpStatus.OK);
Tu používame triedu nástroja Assert TestNG na overenie metódy stavového kódu assertEquals, ktorá porovnáva skutočnú hodnotu, tj response.getStatusCode (), s očakávanou hodnotou HttpStatus.OK.
Ale tu robíme ešte jedno overenie, t. J. Overenie, či je pridaný zamestnanec prítomný v tele odpovede alebo nie.
Assert.assertTrue(responseBody.contains(employeeId));
Ako sme sa dostali k identifikácii zamestnanca?
Za týmto účelom využívame pomoc JSON analyzátora API, t.j. Json-simple.
Používame syntaktický analyzátor JSON, pretože formát JSON sa používa na ukladanie a výmenu údajov medzi klientom a našim serverom v našej službe REST pre zamestnancov. Ako už bolo spomenuté, údaje JSON sú uložené v kľúč: hodnota formát. Tu chceme získať „Id“ hodnotu.
Získame ho analýzou tela odpovede takto:
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
Toto je teda všetko o teste metódy Vytvoriť.
Aktualizujte, získajte a odstráňte metódy
- Vytvorte samostatné testovacie metódy a nastavte hlavičky podľa potreby.
- Podobne sa vykonáva aj overenie stavového kódu.
- Hlavným rozdielom sú spôsoby odosielania požiadaviek na servery.
Môžete použiť nasledujúce metódy:
# 1) Aktualizácia zamestnanca : Je to požiadavka HTTP PUT. Môžete použiť metódu RestTemplate PUT:
public void put(String url,Object request, Object... urlVariables) throws RestClientException
# 2) Získajte zamestnanca: Je to požiadavka HTTP GET. Metóda RestTemplate GET, ktorú môžete použiť, je nasledovná:
public ResponseEntity getForEntity(String url, Class responseType, Object... urlVariables) throws RestClientException
# 3) Odstrániť zdroj zamestnancov: Je to požiadavka HTTP DELETE. Metóda RestTemplate DELETE, ktorú môžete použiť, je:
public void delete(String url, Object... urlVariables) throws RestClientException
Okrem týchto metód existujú užitočné metódy exchange () a execute ().
Napríklad, ak si všimnete, metóda Odstrániť je neplatná. Ak ale chcete overiť telo odpovede, budete potrebovať odpoveď späť od vykonania metódy. Na tento účel môžete použiť metódu exchange (), ktorá vráti ResponseEntity. Pozrite si Jarný rámec pre viac detailov.
# 5) Spustenie testov
Teraz sme dokončili úlohu vývoja testovacieho skriptu, tak poďme spustiť naše testy. Stačí kliknúť pravým tlačidlom myši na TestCRUD.java a vyberte možnosť „Spustiť ako test Test NG“ .
Toto zobrazí výsledky vykonania testu nasledovne.
Výstup konzoly
ako odstrániť položku z poľa
Poznámka: Svoju testovaciu sadu môžete definovať v testng.xml spis tiež. V našom príklade je to iba Jeden testovací skript. V skutočnom scenári však vždy ide o zbierku viacerých skriptov.
Váš súbor testg.xml bude teda vyzerať takto:
# 6) Správy
Výsledok sme videli na konzole. Ale TestNG poskytuje výsledky testov v prezentovateľnejšom formáte html, ktorý je možné zdieľať s vašimi zainteresovanými stranami. Otvorené test-výstup -> emailable-report.html v prehliadači.
Správa o teste sa zobrazí nasledovne. Na stránke správy môžete vidieť názov testu ako TestCRUD, niekoľko úspešne vykonaných testov, tj. 4, počet vynechaných a neúspešných, ktoré sú v tomto prípade nulové. Zobrazuje tiež celkový čas potrebný na vykonanie každej testovacej metódy.
Výsledok testu vo formáte HTML
Kompletný kód súboru 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(); } }
Záver
Ďalej sme zhrnuli výsledky vzdelávania tohto článku. Všetky kroky na nastavenie REST API Test Automation Framework sme videli od začiatku.
V tomto sme sa dozvedeli toto:
- Pre automatizáciu testov sme vybrali programovací jazyk Java.
- Zvolili sme TestNG ako testovací rámec pre vytvorenie testovacieho skriptu, kde sme spotrebovali anotácie TestNG ako @Test.
- Na odosielanie skutočných požiadaviek HTTP na server sme spotrebovali triedu Spring Framework RestTemplate.
- Na konzumáciu týchto rozhraní API sme vykonali inštaláciu TestNG, stiahli sme si jarné poháre a jar Json-simple pre analyzátorové API.
- Nakoniec sme vykonali triedu Test a výsledok sme videli na konzole aj v prezentovateľnejšom a čitateľnejšom formáte HTML.
Stručne povedané, v tomto článku sme sa naučili, ako začať s automatizáciou testu REST API pomocou Spring RestTemplate. Pokryli sme nastavenie nášho rámca automatizácie testov počnúc inštaláciou všetkého základného softvéru, nastavením projektu, vývojom testovacieho skriptu až po vykonanie testu a zobrazením vygenerovaných správ.
To je dostatočné na to, aby každá QA automatizácie mohla začať s vašim rámcom automatizácie testov. Z každej sme však videli iba požadované časti. Napríklad sme použili inštaláciu TestNG, testovaciu metódu s použitím anotácie @Test, správy. TestNG však poskytuje oveľa viac funkcií, ako je DataProvider na testovanie na základe údajov atď.
Ste pripravení začať s automatizáciou testu REST API pomocou Spring RestTemplate?
Odporúčané čítanie
- 10 najlepších nástrojov na testovanie API v roku 2021 (nástroje na testovanie SOAP a REST API)
- Najlepšie nástroje na testovanie softvéru 2021 (QA Test Automation Tools)
- Stiahnutie e-knihy Testing Primer
- Top 20 najdôležitejších API testovacích otázok a odpovedí na pohovory
- Zjednodušenie testovania API s Katalon Studio
- Výukový program Parasoft SOAtest: Bezskriptový testovací nástroj API
- Testovanie záťaže s výukovými programami HP LoadRunner
- Rozdiel medzi počítačom, klientskym serverom a webom