rest api testing with spring resttemplate
Denne dybdegående vejledning forklarer, hvordan du kommer i gang med REST API-test med Spring RestTemplate og TestNG med enkle eksempler:
I denne artikel vil vi se, hvordan du kommer i gang med REST API Testing med RestTemplate og TestNG framework.
Før vi udforsker REST API-test med RestTemplate og TestNG framework, lad os forstå nogle af de grundlæggende koncepter, der er involveret i det.
Lad os begynde!!
Hvad du lærer:
- Hvad er REST?
- Hvad er JSON?
- Hvad er REST API-test?
- Hvad er TestNG?
- Hvad er Spring REST-skabelon?
- REST API-teststrin
- Opsætning af TestNG Test Framework på Windows
- Komplet TestCRUD-filkode
- Konklusion
- Anbefalet læsning
Hvad er REST?
I dag er REST blevet et meget populært valg af bygning af webservices. For eksempel , Google har flere REST-tjenester som Kalender, Kort-API , etc.
HVILE dvs. Representativ statsoverførsel er en software-arkitektonisk stil. I denne stil defineres et sæt begrænsninger, og der bygges webtjenester, der er nødvendige for at opfylde disse begrænsninger. Sådanne webtjenester, der overholder REST-arkitektoniske stil, er kendt som RESTful Web Services.
Udtrykket 'repræsentativ statsoverførsel' blev først fremsat af Roy Fielding i sin ph.d. afhandling i år 2000. Grundideen med REST er at behandle objekter på serversiden som ressourcer, der kan oprettes eller slettes.
Hvad er JSON?
JSON dvs. JavaScript-objektnotation er en meget almindeligt anvendt syntaks i REST-tjenester til lagring og udveksling af data mellem browseren og serveren.
Den største fordel ved JSON er dens lette og for det andet dens læsbare format også. Data gemmes i nøglen: værdi-parformat. For eksempel, du kan have medarbejderdataene gemt i JSON-format på denne måde: {“navn”: ”Emp1 ″,” løn ”:” 3000 ″, ”alder”: ”23 ″,” id ”:” 52686 ″}.
Hvad er REST API-test?
Når vi siger REST API-test, testes det grundlæggende API ved at udføre Opret, Rediger, Læs og Slet handlinger på Ressource med henholdsvis 4 hovedmetoder, dvs. henholdsvis POST, GET, PUT og SLET
Hvad er TestNG?
TestNG er en testramme, der er inspireret af JUnit og NUnit. Det er til Java-programmeringssproget. TestNG dækker en bredere vifte af testkategorier som enhed, funktionel, end-to-end, integration osv.
Det er en open source-ramme, der kommer under Apache-licensen. Det giver et rigt sæt kommentarer, der fremskynder udviklingen af testscript.
Hvad er Spring REST-skabelon?
Spring RestTemplate-klasse er en del af foråret-nettet, der blev introduceret i foråret 3
RestTemplate-klassen giver en meget bekvem måde at teste de HTTP-baserede afslappende webservices ved at levere overbelastede metoder til HTTP-metoder som GET, POST, PUT, SLET osv. Spring-rammer er også open source.
REST API-teststrin
Lad os forstå de trin, der normalt følges i REST API Testing med nogle eksempler for at få en klar forståelse.
I denne artikel har jeg overvejet en prøve REST API medarbejder service fra denne kilde.
Lad os indledningsvis følge trinene manuelt ved hjælp af POSTMAN-værktøjet.
# 1) Først skal du kende slutpunktet for den API, som du vil have adgang til.
For eksempel, http://dummy.restapiexample.com/api/v1/create for at oprette en ny medarbejderressource
#to) Indstil overskrifter og hovedtekst, hvis det kræves til HTTP-metoden.
I vores eksempel, når vi prøver at oprette en ny ressource ved hjælp af POST. For POST kræves et anmodningsorgan.
Så vi indstiller kroppen som følger:
“Navn”: ”zozo100 ″,” løn ”:” 123 ″, ”alder”: ”23 ″
Acceptere : applikation / JSON og Indholdstype : applikation / JSON.
hurtig sortering pseudokode c ++
# 3) Indstil den passende HTTP-metode, dvs. POST i dette tilfælde.
# 4) Send en anmodning til restserviceserveren.
# 5) Modtag et svar fra serveren.
REST API-opkald ved hjælp af POSTMAN-værktøjet
# 6) Bekræft svaret som forventet ved hjælp af svarskoden For eksempel. 200 OK som en succes.
# 7) Bekræft svarorganet som forventet, hvis det kræves ved at sammenligne det med din benchmarkfil.
Nu er vi nødt til at automatisere de samme trin til vores Test Automation-pakke. Lad os starte med den nødvendige opsætning til automatisering.
Opsætning af TestNG Test Framework på Windows
# 1) Installation
- Vi skal bruge Java til test script udvikling. Så første download JDK-installationsprogram til Windows og installer Java på din maskine.
- IDE (integreret udviklingsmiljø) : Jeg har brugt Eclipse som IDE til min udvikling af Automation Test Suite. Klik på her for at downloade det.
- Få Eclipse-plugin til TestNG: Bemærk, at Java 1.7+ er påkrævet for at køre TestNG til Eclipse-pluginnet. Formørkelse 4.2 og derover er påkrævet. (Reference: TestNG ). Følg nedenstående trin i formørkelse:
- Vælg Hjælp / Installer ny software.
- Klik på Tilføj -> Indtast http://beust.com/eclipse/
- Marker afkrydsningsfeltet ud for URL'en, og klik på knappen Næste.
TestNG Installation
-
- Fortsæt med at klikke på Næste knap, indtil du kommer til følgende skærmbillede.
Sidste skærmbillede til testNG-installation
Til sidst skal du acceptere Apache-licensaftalen og klikke på knappen Udfør for at fuldføre installationen.
Genstart Eclipse for at aktivere plugin-installationen.
- Spring krukker: Nu en sidste ting, vi skal bruge klassen RestTemplate fra forårets ramme. Du kan download forårskrukker og gem den i en lokal mappe, For eksempel ,C: / projektJar
- JSON-enkle krukker: Vi er nødt til at udføre JSON-parsing. Til det vil vi bruge en let Json-simpel API. Så download Json-simple-1.1.jar til C: / projectJar
Nu har vi afsluttet de nødvendige installationer. Så lad os oprette vores Test Automation-projekt.
# 2) Opsætning af projekt
- Opret fil -> Ny -> Java-projekt -> Navngiv den som ‘ EmployeeTestSuite ’.
- Opret nu en java-pakke com.demo :
- Konfigurer Build Path:
- Som du har set i det tidligere afsnit, har vi installeret TestNG, downloadede fjeder og JSON-enkle krukker. Så nu er vi nødt til at tilføje build-sti i vores projekt for at forbruge dem. Til det skal du oprette en lib mappe i EmployeeTestSuite mappen og kopier nu alle krukker fra C: / projectJar til lib folder.
- Højreklik på ‘ EmployeeTestSuite '' -> Byg sti -> Konfigurer Byg sti.
- Klik på lib fanen.
- Klik på Tilføj bibliotek knap -> Vælg TestNG. Dette tilføjer TestNG til build-stien.
- Klik på Tilsæt krukker knap -> Vælg alle krukker fra lib. Dette tilføjer alle forårskrukker og JSON-simpel krukke til din projektbygningssti.
Java Build-sti
Din projektstruktur vises som følger i Eclipse Package Explorer nu.
Pakkestruktur
# 3) Testklasse
Vi er nødt til at oprette en testklasse, der kan dække CRUD (Create-Read-Update-Delete) -handlinger.
Opret ny klasse File -> New -> TestNG class, og navngiv den TestCRUD.java
# 4) Testmetode
Lad os oprette separate testmetoder:
- tilføj medarbejder (): Testmetode til test af Opret API ved hjælp af HTTP POST-metoden.
- getEmployee (): Testmetode til test af Læs API ved hjælp af HTTP GET-metoden.
- updateEmployee (): Testmetode til test af opdaterings-API ved hjælp af HTTP PUT-metoden.
- deleteEmployee (): Testmetode til test af Slet API ved hjælp af HTTP DELETE-metoden.
Du kan oprette en testmetode som enhver Java-metode kun med @Test-kommentar af TestNG for at få den identificeret som testmetoden ved TestNG-rammen.
For eksempel,det følgende er testemetoden addEmployee.
@Test public void addEmployee () {}
I vores eksempel har jeg brugt en prøve REST Service.
Lad os nu automatisere POST-opkaldet. Til det er vi nødt til at kortlægge vores kode med de trin, vi fulgte manuelt i afsnittet 'REST API Testing Steps' en efter en.
# 1) Kend først slutpunktet for API'en, som du vil have adgang til.
String addURI = 'http://dummy.restapiexample.com/api/v1/create';
#to) Indstil overskrifter til HTTP-metoden.
HttpHeaders headers = new HttpHeaders();
// Tilføj overskrifter
headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json');
Indstil Body til HTTP-metoden.
String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}';
// Opret et HttpEntity-objekt ved at indstille body og headers.
HttpEntity entity = new HttpEntity(jsonBody, headers);
Vi får følgende trin automatiseret i en erklæring.
# 3) Indstil den passende HTTP-metode, dvs. POST i dette tilfælde.
# 4) Send en anmodning til RESTful-serviceserveren.
# 5) Modtag et svar fra serveren.
RestTemplate restTemplate = new RestTemplate(); ResponseEntity response =restTemplate.postForEntity(addURI, entity, String.class);
Vi bruger postForEntity for at sende POST-metoden til serveren. Vi modtager svaret fra serveren ResponseEntity-objekt.
# 6) Bekræft svaret som forventet ved hjælp af svarskoden.
Assert.assertEquals(response.getStatusCode(), HttpStatus.OK);
Her bruger vi Assert-værktøjsklassen i TestNG til at kontrollere statuskoden assertEquals-metode, der sammenligner den aktuelle værdi, dvs. respons.getStatusCode (), med den forventede værdi HttpStatus.OK.
Men her foretager vi endnu en verifikation, dvs. kontrollerer, om den tilføjede medarbejder er til stede i svarorganet eller ej.
Assert.assertTrue(responseBody.contains(employeeId));
Hvordan fik vi medarbejder-id'et?
Til dette tager vi hjælp af JSON parser API dvs. Json-simple.
Vi bruger JSON parser, da JSON-format bruges til at gemme og udveksle data mellem klienten og vores server i vores medarbejder REST-service. Som tidligere nævnt lagres JSON-data i nøgle: værdi format. Her vil vi hente “Id” værdi.
Vi får det ved at analysere responsorganet som følger:
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
Så dette handler alt om Opret metoden test.
Opdater, hent og slet metoder
- Opret separate testmetoder og indstil overskrifter efter behov.
- Verifikation af statuskode udføres også på samme måde.
- Den største forskel er metoderne til at sende en anmodning til serverne.
Du kan bruge følgende metoder:
# 1) Opdater medarbejder : Det er HTTP PUT-anmodningen. RestTemplate PUT-metoden, som du kan bruge, er:
public void put(String url,Object request, Object... urlVariables) throws RestClientException
# 2) Få medarbejder: Det er HTTP GET-anmodningen. RestTemplate GET-metoden, som du kan bruge, er som følger:
public ResponseEntity getForEntity(String url, Class responseType, Object... urlVariables) throws RestClientException
# 3) Slet medarbejderressource: Det er HTTP DELETE-anmodningen. RestTemplate DELETE-metoden, som du kan bruge, er:
public void delete(String url, Object... urlVariables) throws RestClientException
Bortset fra disse metoder er der udveksling () og udfør () nyttige metoder.
For eksempel, Hvis du bemærker, er Slet-metoden ugyldig. Men hvis du vil bekræfte svarorganet, skal du have et svar tilbage fra metodeudførelsen. Til dette formål kan du bruge exchange () -metoden, der returnerer ResponseEntity. Henvis til Forårsramme for flere detaljer.
# 5) Kørsel af testene
Nu har vi gennemført vores testscript-udviklingsopgave, så lad os køre vores tests. Højreklik bare på TestCRUD.java og vælg indstillingen 'Kør som TestNG Test' .
Dette viser testudførelsesresultater som følger.
Konsol output
html5 interview spørgsmål og svar pdf
Bemærk: Du kan definere din testpakke i testng.xml fil også. I vores eksempel er det kun et test script. Men i det virkelige scenarie er det altid en samling af flere scripts.
Så din testg.xml-fil vil se ud som følger:
# 6) Rapporter
Vi har set resultatet på konsollen. Men TestNG giver testresultater i et mere præsentabelt html-format, som kan deles med dine interessenter. Åben test-output -> emailable-report.html i browseren.
Du får vist testrapporten som følger. På rapportsiden kan du se testnavnet som TestCRUD, flere beståede test, dvs. 4, antal springede og mislykkede, der er 0 i dette tilfælde. Det viser også den samlede tid, der kræves til hver udførelse af testmetode.
Testresultat i HTML-format
Komplet TestCRUD-filkode
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(); } }
Konklusion
Vi har opsummeret læringsudbyttet af denne artikel nedenfor. Vi så alle trin fra starten for at oprette en REST API Test Automation Framework.
I dette lærte vi følgende:
- Til testautomatisering valgte vi Java som programmeringssprog.
- Vi valgte TestNG som testramme til oprettelse af et test script, hvor vi forbrugte TestNG-kommentarer som @Test.
- For at sende faktiske HTTP-anmodninger til serveren forbrugte vi Spring Framework RestTemplate-klassen.
- For at forbruge disse API'er installerede vi TestNG, downloadede Spring-krukker og Json-simpel krukke til parser-API'en.
- Endelig udførte vi testklassen og så resultatet på konsollen såvel som i et mere præsentabelt og mere læsbart HTML-format.
I en nøddeskal lærte vi i denne artikel, hvordan man kommer i gang med REST API-testautomatisering med Spring RestTemplate. Vi dækkede opsætningen af vores testautomatiseringsramme startende fra installation af al væsentlig software, projektopsætning, testscriptudvikling til testudførelse og visning af genererede rapporter.
Dette er ret tilstrækkeligt for enhver automatisering QA til at komme i gang med din testautomatiseringsramme. Men vi har kun set de krævede dele fra hver. For eksempel har vi brugt TestNG-installation, testmetode ved hjælp af @Test-kommentar, rapporter. TestNG leverer dog mange flere funktioner som DataProvider til datadrevet test osv.
Er du klar til at komme i gang med REST API-testautomatisering med Spring RestTemplate?
Anbefalet læsning
- 10 bedste API-testværktøjer i 2021 (SOAP og REST API-testværktøjer)
- Bedste softwaretestværktøjer 2021 (QA Test Automation Tools)
- Test af Primer eBook Download
- Top 20 mest vigtige API-test Interviewspørgsmål og svar
- Gør API-test enkel med Katalon Studio
- Parasoft SOAtest Tutorial: Scriptless API Test Tool
- Load Testing med HP LoadRunner-vejledninger
- Forskel mellem Desktop, Client Server Testing og Web Testing