rest api testing with spring resttemplate
Ta poglobljena vadnica pojasnjuje, kako začeti s preskušanjem API-ja REST z vzmetno počivalnico in TestNG s preprostimi primeri:
V tem članku bomo videli, kako začeti s testiranjem API-ja REST z ogrodjem RestTemplate in TestNG.
Preden preučimo testiranje API-ja REST z ogrodjem RestTemplate in TestNG, nam dovolite, da razumemo nekatere osnovne koncepte, ki so v njem vključeni.
Začnimo!!
Kaj se boste naučili:
- Kaj je REST?
- Kaj je JSON?
- Kaj je testiranje API-ja REST?
- Kaj je TestNG?
- Kaj je Spring REST Predloga?
- Koraki za preskušanje API-ja REST
- Nastavitev TestNG Test Framework v sistemu Windows
- Izpolnite kodo datoteke TestCRUD
- Zaključek
- Priporočeno branje
Kaj je REST?
Dandanes je REST postal zelo priljubljena izbira gradnje spletnih storitev. Na primer , Google ima več storitev REST, kot so Koledar, Map API itd.
POČITEK tj. Reprezentativni državni prenos je programski arhitekturni slog. V tem slogu je določen nabor omejitev in za izpolnitev teh omejitev so potrebne zgrajene spletne storitve. Takšne spletne storitve, ki ustrezajo arhitekturnemu slogu REST, so znane kot RESTful Web Services.
Izraz 'reprezentativni državni prenos' je prvi predstavil Roy Fielding v doktoratu znanosti disertacija leta 2000. Osnovna ideja REST-a je obravnavati predmete na strani strežnika kot vire, ki jih je mogoče ustvariti ali izbrisati.
Kaj je JSON?
JSON tj. Oznaka predmeta JavaScript je zelo pogosto uporabljena sintaksa v storitvah REST za shranjevanje in izmenjavo podatkov med brskalnikom in strežnikom.
Glavna prednost JSON-a je lahka in drugič tudi berljiva oblika. Podatki so shranjeni v obliki par ključ: vrednost. Na primer, podatke o zaposlenih lahko shranite v obliki JSON, kot sledi: {“ime”: ”Emp1 ″,” plača ”:” 3000 ″, ”starost”: ”23 ″,” id ”:” 52686 ″}.
Kaj je testiranje API-ja REST?
Ko rečemo preskušanje API-ja REST, gre v bistvu za testiranje API-ja z izvajanjem dejanj Ustvari, Uredi, Preberi in Izbriši v viru s štirimi glavnimi metodami, tj. POST, GET, PUT in DELETE.
Kaj je TestNG?
TestNG je preskusni okvir, ki ga navdihujejo JUnit in NUnit. Je za programski jezik Java. TestNG zajema širši nabor preskusnih kategorij, kot so enota, funkcionalnost, celoviti, integracijski itd.
Gre za odprtokodni okvir, ki spada pod licenco Apache. Ponuja bogat nabor pripisov, ki pospešujejo razvoj testne skripte.
Kaj je Spring REST Predloga?
Razred Spring RestTemplate je del vzmetne mreže, ki je bil predstavljen spomladi 3
Razred RestTemplate ponuja zelo priročen način za preizkušanje prijetnih spletnih storitev, ki temeljijo na HTTP, z zagotavljanjem preobremenjenih metod za metode HTTP, kot so GET, POST, PUT, DELETE itd. Spring framework je tudi odprtokoden.
Koraki za preskušanje API-ja REST
Dovolite nam, da razumemo korake, ki jih običajno uporabljamo pri testiranju API-ja REST, z nekaj primeri, da dobimo jasno razumevanje.
V tem članku sem obravnaval en vzorec storitve za zaposlene REST API iz ta vir.
Najprej sledimo korakom ročno z orodjem POSTMAN.
# 1) Najprej poznajte končno točko API-ja, do katerega želite dostopati.
Na primer, http://dummy.restapiexample.com/api/v1/create, da ustvarite nov vir zaposlenih
#two) Če je za metodo HTTP potrebno, nastavite glave in telo.
V našem primeru, ko poskušamo ustvariti nov vir s pomočjo POST. Za POST je potrebno telo zahteve.
Torej bomo telo nastavili na naslednji način:
“Ime”: ”zozo100 ″,” plača ”:” 123 ″, ”starost”: ”23 ″
Sprejmi : application / JSON in Vrsta vsebine : application / JSON.
spremenite char v int c ++
# 3) Nastavite ustrezno metodo HTTP, v tem primeru POST.
# 4) Pošljite zahtevo strežniku Rest service.
# 5) Prejmite odgovor s strežnika.
Klic REST API z orodjem POSTMAN
# 6) S pomočjo kode za odziv preverite odziv, kot je bilo pričakovano Npr. 200 OK kot uspeh.
# 7) Če je potrebno, preverite odgovorno telo, če ga želite primerjati s primerjalno datoteko.
Zdaj moramo avtomatizirati enake korake za naš testni avtomatizacijski paket. Začnimo z namestitvijo, potrebno za avtomatizacijo.
Nastavitev TestNG Test Framework v sistemu Windows
# 1) Namestitev
- Javo bomo uporabili za razvoj testnega skripta. Torej, prvi prenos JDK namestitveni program za Windows in namestite Javo v računalnik.
- IDE (integrirano razvojno okolje) : Eclipse sem uporabil kot IDE za razvoj programa Automation Test Suite. Kliknite tukaj da ga prenesete.
- Pridobite vtičnik Eclipse za TestNG: Upoštevajte, da je Java 1.7+ potrebna za zagon TestNG za vtičnik Eclipse. Zahtevan je Eclipse 4.2 in novejši. (Sklic: TestNG ). Sledite spodnjim korakom v Eclipse:
- Izberite Pomoč / Namesti novo programsko opremo.
- Kliknite Dodaj -> Vnesite http://beust.com/eclipse/
- Potrdite polje poleg URL-ja in kliknite gumb Naprej.
Namestitev TestNG
-
- Nadaljujte s klikom na gumb Naprej, dokler ne pridete do naslednjega zaslona.
Končni zaslon namestitve TestNG
Na koncu sprejmite licenčno pogodbo Apache in kliknite gumb Dokončaj, da dokončate namestitev.
Znova zaženite Eclipse, da začne veljavna namestitev vtičnika.
- Pomladne kozarce: Zdaj pa še zadnja stvar, uporabili bomo razred RestTemplate iz pomladnega ogrodja. Ti lahko prenesite spomladanske kozarce in ga shranite v lokalno mapo, Na primer ,C: / projektJar
- JSON-preproste kozarce: Izvesti moramo razčlenitev JSON. Za to bomo uporabili lahek Json-preprost API. Torej, prenesite Json-simple-1.1.jar na C: / projectJar
Zdaj smo zaključili potrebne namestitve. Torej, ustvariva naš projekt Test Automation.
# 2) Nastavitev projekta
- Ustvari datoteko -> Novo -> Projekt Java -> Poimenuj jo kot ‘ EmployeeTestSuite “.
- Zdaj ustvarite nov paket Java com.demo :
- Konfiguriranje poti gradnje:
- Kot ste videli v prejšnjem poglavju, smo namestili TestNG, prenesli pomladne in JSON preproste kozarce. Torej, zdaj moramo v naš projekt dodati pot gradnje, da jih porabimo. Za to ustvarite lib mapa v EmployeeTestSuite in zdaj kopirajte vse kozarce iz C: / projectJar v lib mapo.
- Z desno miškino tipko kliknite EmployeeTestSuite '' -> Gradnja poti -> Konfiguriranje poti gradnje.
- Kliknite na lib zavihek.
- Kliknite na Dodaj knjižnico gumb -> Izberite TestNG. To bo dodalo TestNG na pot gradnje.
- Kliknite na Dodajte kozarce gumb -> Izberite vse kozarce iz lib. To bo dodalo vse pomladne kozarce in JSON-preprost kozarec na pot gradnje vašega projekta.
Java Build Path
Struktura vašega projekta bo zdaj prikazana v Raziskovalcu paketov Eclipse, kot sledi.
Struktura paketa
# 3) Testni razred
Ustvariti moramo testni razred, ki lahko zajema operacije CRUD (Create-Read-Update-Delete).
primer testnih primerov za spletno aplikacijo
Ustvarite novo datoteko razreda -> Novo -> TestNG razred in jo poimenujte TestCRUD.java
# 4) Preskusna metoda
Ustvarimo ločene preskusne metode:
- addEfficiee (): Preskusna metoda za preizkus Ustvari API z uporabo metode HTTP POST.
- getEfficiee (): Testna metoda za testiranje API-ja za branje z uporabo metode HTTP GET.
- updateE Employee (): Preskusna metoda za preskušanje API-ja za posodobitev z uporabo metode HTTP PUT.
- deleteE Employee (): Preskusna metoda za preizkušanje API-ja za brisanje z uporabo metode HTTP DELETE.
Preskusno metodo lahko ustvarite kot katero koli metodo java samo s pripisom @Test TestNG, da jo okvir TestNG prepozna kot testno metodo.
Na primer,spodaj je testna metoda addEfficiee.
@Test public void addEmployee () {}
V našem primeru sem uporabil a vzorec REST Service.
Zdaj pa avtomatizirajte klic POST. Za to moramo svojo kodo preslikati s koraki, ki smo jih sledili ročno v razdelku »REST API Preizkusni koraki«, enega za drugim.
# 1) Najprej poznajte končno točko API-ja, do katerega želite dostopati.
String addURI = 'http://dummy.restapiexample.com/api/v1/create';
#two) Nastavite glave za metodo HTTP.
HttpHeaders headers = new HttpHeaders();
// Dodaj glave
headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json');
Nastavite Body za metodo HTTP.
String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}';
// Ustvarimo objekt HttpEntity z nastavitvijo telesa in glav.
HttpEntity entity = new HttpEntity(jsonBody, headers);
V enem stavku bomo avtomatizirali naslednje korake.
# 3) Nastavite ustrezno metodo HTTP, v tem primeru POST.
# 4) Pošljite zahtevo na strežnik storitev RESTful.
# 5) Prejmite odgovor s strežnika.
RestTemplate restTemplate = new RestTemplate(); ResponseEntity response =restTemplate.postForEntity(addURI, entity, String.class);
Uporabljamo postForEntity za pošiljanje metode POST strežniku. Odgovor dobimo od strežniškega objekta ResponseEntity.
# 6) S pomočjo kode za odziv preverite odziv, kot je bilo pričakovano.
Assert.assertEquals(response.getStatusCode(), HttpStatus.OK);
Tu uporabljamo razred orodja za uveljavljanje TestNG za preverjanje metode statusne kode assertEquals, ki primerja dejansko vrednost, tj. Response.getStatusCode (), s pričakovano vrednostjo HttpStatus.OK.
Tu pa izvajamo še eno preverjanje, tj. Preverjanje, ali je dodani zaposleni prisoten v odzivnem telesu ali ne.
Assert.assertTrue(responseBody.contains(employeeId));
Kako smo dobili ID zaposlenega?
Za to si pomagamo z API-jem razčlenjevalnika JSON, tj. Json-simple.
Uporabljamo razčlenjevalnik JSON, saj se format JSON uporablja za shranjevanje in izmenjavo podatkov med odjemalcem in našim strežnikom v storitvi REST za zaposlene. Kot smo že omenili, so podatki JSON shranjeni v ključ: vrednost format. Tukaj želimo dobiti “Id” vrednost.
Dobili ga bomo z razčlenjevanjem odzivnega telesa na naslednji način:
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
Torej, to je vse o preizkusu metode Create.
Posodobitev, pridobivanje in brisanje metod
- Ustvarite ločene preskusne metode in nastavite glave, kot je primerno.
- Podobno se izvaja tudi preverjanje statusne kode.
- Glavna razlika so načini za pošiljanje zahteve strežnikom.
Uporabite lahko naslednje metode:
# 1) Posodobi zaposlenega : To je zahteva HTTP PUT. Metoda RestTemplate PUT, ki jo lahko uporabite, je:
public void put(String url,Object request, Object... urlVariables) throws RestClientException
# 2) Pridobite zaposlenega: To je zahteva HTTP GET. Metoda GET RestTemplate, ki jo lahko uporabite, je naslednja:
public ResponseEntity getForEntity(String url, Class responseType, Object... urlVariables) throws RestClientException
# 3) Izbriši vir zaposlenih: To je zahteva HTTP DELETE. Metoda DELETE RestTemplate, ki jo lahko uporabite, je:
public void delete(String url, Object... urlVariables) throws RestClientException
Poleg teh metod obstajajo uporabni metodi exchange () in execute ().
Na primer, če opazite, je metoda Delete nična. Če pa želite preveriti odzivno telo, potem boste potrebovali odgovor nazaj iz izvedbe metode. V ta namen lahko uporabite metodo exchange (), ki vrne ResponseEntity. Glejte Pomladni okvir za več podrobnosti.
# 5) Izvajanje testov
Zdaj smo zaključili nalogo za razvoj testnega skripta, zato zaženimo naše teste. Samo z desno miškino tipko kliknite TestCRUD.java in izberite možnost ‘Zaženi kot testNG Test’ .
To bo prikazalo rezultate izvedbe testa, kot sledi.
Izhod konzole
Opomba: Svoj testni paket lahko določite v testng.xml tudi datoteko. V našem primeru je to samo en testni skript. Toda v resničnem scenariju gre vedno za zbirko več skriptov.
Torej bo vaša datoteka testg.xml videti tako:
# 6) Poročila
Rezultat smo videli na konzoli. Toda TestNG zagotavlja rezultate testov v bolj predstavljivem formatu html, ki ga lahko delite z vašimi zainteresiranimi stranmi. Odprto test-output -> emailable-report.html v brskalniku.
Poročilo o preskusu boste videli na naslednji način. Na strani s poročilom lahko vidite ime testa kot TestCRUD, več opravljenih testov, tj.4, število preskočenih in neuspelih, ki so v tem primeru 0. Prikazuje tudi skupni čas, potreben za vsako izvedbo preskusne metode.
Rezultat testa v obliki zapisa HTML
Izpolnite kodo datoteke 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(); } }
Zaključek
V nadaljevanju smo povzeli učne rezultate tega članka. Že od začetka smo videli vse korake za vzpostavitev okvira za avtomatizacijo preskusov API REST.
V tem smo izvedeli naslednje:
- Za avtomatizacijo preizkusov smo za programski jezik izbrali Javo.
- Za testno ogrodje za ustvarjanje testnega skripta smo izbrali TestNG, kjer smo porabili pripombe TestNG, kot je @Test.
- Za pošiljanje dejanskih zahtev HTTP strežniku smo uporabili razred Spring Frame RestTemplate.
- Za porabo teh API-jev smo namestili TestNG, prenesli Spring jar in Json-simple jar za razčlenjevalnik API.
- Na koncu smo izvedli preizkusni razred in videli rezultat na konzoli ter v bolj predstavljivem in bolj berljivem formatu HTML.
Na kratko, v tem članku smo se naučili, kako začeti z avtomatizacijo preskusov API REST z Spring RestTemplate. Pokrivali smo nastavitev našega okvira za avtomatizacijo preizkusov, začenši z namestitvijo vse bistvene programske opreme, namestitvijo projekta, razvojem testnega skripta do izvedbe testa in ogledom ustvarjenih poročil.
To je povsem dovolj za kakršno koli preverjanje kakovosti za avtomatizacijo, da lahko začne uporabljati vaš testni sistem za avtomatizacijo. Vendar smo od vsakega videli le zahtevane dele, na primer uporabili smo namestitev TestNG, preskusno metodo s pripisom @Test, poroča. Vendar TestNG ponuja veliko več funkcij, kot je DataProvider za testiranje na podlagi podatkov itd.
Ste pripravljeni začeti uporabljati testno avtomatizacijo API-ja REST z Spring RestTemplate?
Priporočeno branje
- 10 najboljših orodij za testiranje API-jev v letu 2021 (orodja za testiranje API-jev SOAP in REST)
- Najboljša orodja za testiranje programske opreme 2021 (QA Test Automation Tools)
- Prenos eBook knjige za preizkušanje
- 20 najpomembnejših vprašanj in odgovorov za preskušanje API-jev
- Poenostavitev testiranja API-jev s Katalon Studio
- Vadnica za parasoft SOAtest: orodje za preizkušanje API-jev brez skript
- Testiranje obremenitve z vadnicami HP LoadRunner
- Razlika med testiranjem namizja, odjemalskega strežnika in spletnim preskušanjem