rest api testing with spring resttemplate
Ovaj produbljeni vodič objašnjava kako započeti s REST API testiranjem s Spring RestTemplate i TestNG sa jednostavnim primjerima:
U ovom ćemo članku vidjeti kako započeti s REST API testiranjem s RestTemplate i TestNG okvirom.
Prije istraživanja REST API testiranja s RestTemplate i TestNG framework-om, shvatimo neke od osnovnih pojmova koji su u to uključeni.
Počnimo!!
Što ćete naučiti:
- Što je OSTALO?
- Što je JSON?
- Što je REST API testiranje?
- Što je TestNG?
- Što je predložak Spring REST?
- REST API koraci za testiranje
- Postavljanje okvira za testiranje TestNG na sustavu Windows
- Potpuni kod datoteke TestCRUD
- Zaključak
- Preporučena literatura
Što je OSTALO?
Danas je REST postao prilično popularan izbor za izradu web usluga. Na primjer , Google ima više REST usluga poput Kalendara, Map API itd.
ODMOR tj. Reprezentativni državni prijenos je softverski arhitektonski stil. U ovom je stilu definiran skup ograničenja i potrebne su izgrađene web usluge da bi se zadovoljila ta ograničenja. Takve web usluge koje odgovaraju arhitektonskom stilu REST poznate su kao RESTful Web Services.
Pojam 'reprezentativni državni prijenos' prvi je iznio Roy Fielding u doktoratu disertacija 2000. Osnovna ideja REST-a je tretirati objekte na strani poslužitelja kao resurse koji se mogu stvoriti ili izbrisati.
Što je JSON?
JSON tj. Oznaka objekta JavaScript je vrlo često korištena sintaksa u REST uslugama za pohranu i razmjenu podataka između preglednika i poslužitelja.
Glavna prednost JSON-a je lagan, a drugo, i čitljiv format. Podaci se pohranjuju u formatu par ključ: vrijednost. Na primjer, možete imati podatke o zaposlenicima pohranjene u JSON formatu ovako: {'ime': 'Emp1 ″,' plaća ':' 3000 ″, 'dob': '23 ″,' id ':' 52686 ″}.
Što je REST API testiranje?
Kad kažemo REST API testiranje, to je u osnovi testiranje API-ja izvođenjem radnji Create, Edit, Read i Delete na Resursu s 4 glavne metode, tj. POST, GET, PUT i DELETE
Što je TestNG?
TestNG je testni okvir koji je nadahnut JUnit-om i NUnit-om. To je za programski jezik Java. TestNG pokriva širi raspon kategorija ispitivanja kao što su jedinica, funkcionalnost, end-to-end, integracija itd.
Riječ je o okviru otvorenog koda koji se nalazi pod licencom Apache. Pruža bogat skup napomena koje ubrzavaju razvoj testne skripte.
Što je predložak Spring REST?
Predmet Spring RestTemplate dio je spring-weba koji je predstavljen u proljeće 3
Klasa RestTemplate pruža vrlo prikladan način za testiranje mirnih web usluga utemeljenih na HTTP-u pružajući preopterećene metode za HTTP metode poput GET, POST, PUT, DELETE, itd. Spring framework je također otvoreni izvor.
REST API koraci za testiranje
Razumijemo korake koji se obično slijede u REST API testiranju s nekoliko primjera kako bismo dobili jasno razumijevanje.
U ovom sam članku razmotrio jedan uzorak usluge za zaposlenike REST API iz ovaj izvor.
U početku, slijedimo korake ručno pomoću alata POSTMAN.
# 1) Prvo, znajte krajnju točku API-ja kojoj želite pristupiti.
Na primjer, http://dummy.restapiexample.com/api/v1/create za stvaranje novog resursa zaposlenika
#dva) Postavite zaglavlja i tijelo ako je potrebno za HTTP metodu.
U našem primjeru, dok pokušavamo stvoriti novi resurs pomoću POST-a. Za POST potrebno je tijelo zahtjeva.
Stoga ćemo postaviti tijelo na sljedeći način:
„Ime“: „zozo100 ″,„ plaća “:„ 123 ″, „dob“: „23 ″
Prihvatiti : application / JSON i Vrsta sadržaja : aplikacija / JSON.
kako inicijalizirati popis u javi -
# 3) Postavite odgovarajuću HTTP metodu, tj. POST u ovom slučaju.
# 4) Pošaljite zahtjev poslužitelju usluge odmora.
# 5) Primite odgovor od poslužitelja.
REST API poziv pomoću alata POSTMAN
# 6) Provjerite odgovor prema očekivanjima uz pomoć koda za odgovor Npr. 200 OK kao uspjeh.
# 7) Provjerite odgovorno tijelo kako je očekivano ako je potrebno usporedbom s vašom referentnom datotekom.
Sada moramo automatizirati iste korake za naš paket za automatizaciju ispitivanja. Krenimo od postavljanja potrebnog za automatizaciju.
Postavljanje okvira za testiranje TestNG na sustavu Windows
# 1) Instalacija
- Koristit ćemo Javu za razvoj testnih skripti. Dakle, Prvo preuzimanje JDK instalacijski program za Windows i instalirajte Javu na svoj stroj.
- IDE (Integrirano razvojno okruženje) : Eclipse sam koristio kao IDE za razvoj programa Automation Test Suite. Klik ovdje da ga preuzmete.
- Nabavite dodatak Eclipse za TestNG: Imajte na umu da je Java 1.7+ potrebna za pokretanje TestNG-a za dodatak Eclipse. Potrebna je pomrčina 4.2 i novije. (Referenca: TestNG ). Slijedite korake u nastavku u Eclipseu:
- Odaberite Pomoć / Instalacija novog softvera.
- Kliknite Dodaj -> Unesite http://beust.com/eclipse/
- Označite potvrdni okvir pored URL-a i kliknite gumb Dalje.
Instalacija TestNG-a
-
- Nastavite pritiskati gumb Sljedeće, dok ne dođete do sljedećeg zaslona.
Završni zaslon instalacije TestNG-a
Na kraju, prihvatite Apache licenčni ugovor i kliknite gumb Završi da biste dovršili instalaciju.
Ponovo pokrenite Eclipse da biste stupili na snagu instalacije dodatka.
- Proljetne tegle: Sada još jedna zadnja stvar, koristit ćemo klasu RestTemplate iz proljetnog okvira. Možeš preuzmi proljetne staklenke i spremite ga u lokalnu mapu, Na primjer ,C: / projektJar
- JSON-jednostavni teglice: Moramo izvršiti JSON raščlanjivanje. Za to ćemo upotrijebiti lagani Json-jednostavan API. Dakle, preuzmite Json-simple-1.1.jar na C: / projectJar
Sada smo dovršili potrebne instalacije. Dakle, kreirajmo naš projekt Automatizacija ispitivanja.
# 2) Postavljanje projekta
- Stvori datoteku -> Novo -> Java projekt -> Nazovite je kao ‘ EmployeeTestSuite ’.
- Sada stvorite novi java paket com.demo :
- Konfiguriranje puta gradnje:
- Kao što ste vidjeli u prethodnom odjeljku, instalirali smo TestNG, preuzeli proljetne i JSON jednostavne staklenke. Dakle, sada u naš projekt moramo dodati put izgradnje kako bismo ih konzumirali. Za to stvorite a lib mapa u EmployeeTestSuite i sada kopirajte sve staklenke iz C: / projectJar u lib mapu.
- Desnom tipkom miša kliknite ' EmployeeTestSuite ’’ -> Gradnja puta -> Konfiguriranje puta gradnje.
- Klikni na lib tab.
- Klikni na Dodaj biblioteku gumb -> Odaberite TestNG. To će dodati TestNG na stazu izrade.
- Kliknite na Dodajte staklenke gumb -> Odaberite sve staklenke iz lib. To će dodati sve proljetne staklenke i JSON-jednostavnu staklenku u put izgradnje vašeg projekta.
Javni put izgradnje
Struktura vašeg projekta sada će biti prikazana na sljedeći način u programu Eclipse Package Explorer.
Struktura paketa
# 3) Test klasa
Moramo stvoriti test klasu koja može obuhvaćati CRUD (Stvaranje-čitanje-ažuriranje-brisanje) operacije.
Napravite novu datoteku klase -> Nova -> TestNG klasa i nazovite je TestCRUD.java
# 4) Metoda ispitivanja
Stvorimo zasebne metode ispitivanja:
- addEfficiee (): Test metoda za testiranje Stvaranje API-ja pomoću HTTP POST metode.
- getEfficiee (): Test metoda za testiranje API-ja za čitanje pomoću HTTP GET metode.
- updateEfficiee (): Test metoda za testiranje API-ja za ažuriranje pomoću HTTP PUT metode.
- deleteEfficiee (): Ispitna metoda za testiranje brisanja API-ja pomoću HTTP DELETE metode.
Možete stvoriti test metodu kao bilo koju java metodu samo s @Test anotacijom TestNG da biste je identificirali kao test metodu pomoću okvira TestNG
Na primjer,slijedi metoda ispitivanja addEfficiee.
@Test public void addEmployee () {}
U našem primjeru upotrijebio sam a uzorak REST usluga.
Sada ćemo automatizirati POST poziv. Da bismo to učinili, moramo mapirati naš kôd s koracima koje smo ručno slijedili u odjeljku ‘REST API Testing Steps’ (Pojedinačni koraci za testiranje API-ja).
# 1) Prvo, znajte krajnju točku API-ja kojem želite pristupiti.
String addURI = 'http://dummy.restapiexample.com/api/v1/create';
#dva) Postavite zaglavlja za HTTP metodu.
HttpHeaders headers = new HttpHeaders();
// Dodaj zaglavlja
headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json');
Postavi tijelo za HTTP metodu.
String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}';
// Stvaranje objekta HttpEntity postavljanjem tijela i zaglavlja.
HttpEntity entity = new HttpEntity(jsonBody, headers);
Imat ćemo sljedeće korake automatizirane u jednoj izjavi.
# 3) Postavite odgovarajuću HTTP metodu, tj. POST u ovom slučaju.
# 4) Pošaljite zahtjev poslužitelju usluge RESTful.
# 5) Primite odgovor od poslužitelja.
RestTemplate restTemplate = new RestTemplate(); ResponseEntity response =restTemplate.postForEntity(addURI, entity, String.class);
Koristimo postForEntity za slanje POST metode na poslužitelj. Odgovor primamo od poslužitelja ResponseEntity objekta.
# 6) Provjerite odgovor prema očekivanjima uz pomoć koda za odgovor.
Assert.assertEquals(response.getStatusCode(), HttpStatus.OK);
Ovdje koristimo klasu alata Assert za TestNG za provjeru metode statusnog koda assertEquals koja uspoređuje stvarnu vrijednost, tj. Response.getStatusCode (), s očekivanom vrijednošću HttpStatus.OK.
Ali ovdje radimo još jednu provjeru, tj. Provjeru je li dodani zaposlenik prisutan u tijelu odgovora ili ne.
Assert.assertTrue(responseBody.contains(employeeId));
Kako smo dobili id zaposlenika?
Za to koristimo pomoć JSON parser API-ja, tj. Json-simple.
Koristimo JSON parser, jer se format JSON koristi za pohranu i razmjenu podataka između klijenta i našeg poslužitelja u našoj usluzi REST za zaposlenike. Kao što je ranije spomenuto, JSON podaci se pohranjuju u ključ: vrijednost format. Evo, želimo dobiti 'iskaznica' vrijednost.
Dobit ćemo ga raščlanjivanjem tijela odgovora na sljedeći 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
Dakle, ovo je sve o testu Stvori metodu.
pitanja za intervju na angularjs za iskusne
Ažuriranje, dobivanje i brisanje metoda
- Izradite zasebne metode ispitivanja i postavite zaglavlja prema potrebi.
- Provjera statusnog koda također se vrši slično.
- Glavna razlika su metode slanja zahtjeva poslužiteljima.
Možete koristiti sljedeće metode:
# 1) Ažurirajte zaposlenika : To je HTTP PUT zahtjev. RestTemplate PUT metoda koju možete koristiti je:
public void put(String url,Object request, Object... urlVariables) throws RestClientException
# 2) Nađite zaposlenika: To je HTTP GET zahtjev. RestTemplate GET metoda koju možete koristiti je sljedeća:
public ResponseEntity getForEntity(String url, Class responseType, Object... urlVariables) throws RestClientException
# 3) Brisanje resursa zaposlenika: To je HTTP DELETE zahtjev. RestTemplate DELETE metoda koju možete koristiti je:
public void delete(String url, Object... urlVariables) throws RestClientException
Osim ovih metoda, postoje korisne metode razmjene () i izvršavanja ().
Na primjer, ako primijetite, metoda Delete je ništavna. Ali ako želite provjeriti tijelo odgovora, tada će vam trebati odgovor natrag iz izvršenja metode. U tu svrhu možete koristiti metodu exchange () koja vraća ResponseEntity. Pogledajte Proljetni okvir za više detalja.
# 5) Pokretanje testova
Sad smo dovršili zadatak izrade skripte za testiranje, pa pokrenimo testove. Samo kliknite desnom tipkom miša TestCRUD.java i odaberite opciju ‘Pokreni kao testNG test’ .
Ovo će prikazati rezultate izvršavanja testa na sljedeći način.
Izlaz konzole
Bilješka: Možete definirati svoj testni paket u testng.xml datoteka također. U našem primjeru to je samo jedan testni skript. Ali u stvarnom scenariju to je uvijek zbirka više skripti.
Tako će vaša datoteka testg.xml izgledati kako slijedi:
# 6) Izvješća
Rezultat smo vidjeli na konzoli. Ali TestNG pruža rezultate ispitivanja u predstavljivijem html formatu koji se može podijeliti s vašim dionicima. Otvoren test-izlaz -> emailable-report.html u pregledniku.
Izvještaj o ispitivanju vidjet ćete na sljedeći način. Na stranici izvješća možete vidjeti naziv testa kao TestCRUD, nekoliko položenih testova, tj. 4, broj preskočenih i neuspjelih koji su 0 u ovom slučaju. Također pokazuje ukupno vrijeme potrebno za svako izvršavanje metode ispitivanja.
Rezultat testa u HTML formatu
Potpuni kod 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čak
U nastavku smo saželi ishod učenja ovog članka. Vidjeli smo sve korake od početka postavljanja REST API okvira za automatizaciju ispitivanja.
Iz ovoga smo saznali sljedeće:
- Za automatizaciju testa odabrali smo Javu kao programski jezik.
- Odabrali smo TestNG kao testni okvir za stvaranje testne skripte gdje smo konzumirali TestNG napomene poput @Test.
- Za slanje stvarnih HTTP zahtjeva na poslužitelj koristili smo klasu Spring Frame RestTemplate.
- Za upotrebu ovih API-ja izvršili smo instalaciju TestNG-a, preuzeli Spring jar i Json-simple jar za parser API.
- Konačno, izvršili smo klasu Test i vidjeli rezultat na konzoli, kao i u predstavljivijem i čitljivijem HTML formatu.
Ukratko, u ovom smo članku naučili kako započeti s automatizacijom REST API Test s Spring RestTemplate. Pokrili smo postavljanje našeg okvira za automatizaciju ispitivanja počevši od instalacije cijelog bitnog softvera, postavljanja projekata, razvoja test skripte pa sve do izvođenja testa i pregledavanja generiranih izvješća.
To je prilično dovoljno za bilo kakvo osiguranje kvalitete za automatizaciju da započne s vašim testnim okvirom za automatizaciju. Ali, iz svakog smo vidjeli samo potrebne dijelove, na primjer, koristili smo instalaciju TestNG, metodu testiranja pomoću @Test bilješke, izvještava. Međutim, TestNG pruža mnogo više značajki poput DataProvider-a za testiranje na temelju podataka itd.
Jeste li spremni za početak rada s automatizacijom REST API Test s Spring RestTemplate?
Preporučena literatura
- 10 najboljih alata za testiranje API-ja u 2021. godini (SOAP i REST API alati za testiranje)
- Najbolji alati za testiranje softvera 2021. (Alati za automatizaciju ispitivanja kvalitete)
- Preuzimanje e-knjige za testiranje primera
- 20 najvažnijih pitanja i odgovora za ispitivanje API ispitivanja
- Pojednostavljivanje API testiranja pomoću Katalon Studija
- Vodič za Parasoft SOAtest: Alat za testiranje API-ja bez skripti
- Ispitivanje opterećenja pomoću HP LoadRunner vodiča
- Razlika između testiranja radne površine, klijentskog poslužitelja i web testiranja