rest api testing with spring resttemplate
Aquest tutorial detallat explica com començar a fer proves RAP API amb Spring RestTemplate i TestNG amb exemples senzills:
En aquest article, veurem com començar a provar REST API amb RestTemplate i el marc TestNG.
Abans d’explorar les proves d’API REST amb RestTemplate i el marc TestNG, entenem alguns dels conceptes bàsics que hi intervenen.
Comencem!!
Què aprendreu:
- Què és REST?
- Què és JSON?
- Què és la prova d'API REST?
- Què és TestNG?
- Què és la plantilla REST de primavera?
- Passos de prova de l'API REST
- Configuració de TestNG Test Framework al Windows
- Codi complet del fitxer TestCRUD
- Conclusió
- Lectura recomanada
Què és REST?
Actualment, REST s’ha convertit en una opció força popular per construir serveis web. Per exemple , Google té diversos serveis REST com Calendar, API del mapa , Etc.
DESCANS és a dir, Transferència d’estats representatius és un estil arquitectònic de programari. En aquest estil, es defineix un conjunt de restriccions i es necessiten serveis web creats per satisfer aquestes restriccions. Aquests serveis web que conformen l'estil arquitectònic REST es coneixen com a serveis web RESTful.
El terme 'transferència de l'estat representatiu' va ser presentat per primera vegada per Roy Fielding en el seu doctorat dissertació l'any 2000. La idea bàsica de REST és tractar els objectes del servidor com a recursos que es poden crear o eliminar.
Què és JSON?
JSON és a dir, Notació d'objectes JavaScript és una sintaxi molt utilitzada als serveis REST per emmagatzemar i intercanviar dades entre el navegador i el servidor.
El principal avantatge de JSON és el seu pes lleuger i, en segon lloc, també el seu format llegible. Les dades s’emmagatzemen en el format de parell clau: valor. Per exemple, podeu tenir les dades dels empleats emmagatzemades en format JSON com aquest: {'nom': 'Emp1', 'salari': '3000', 'edat': '23', 'id': '52686'.
Què és la prova d'API REST?
Quan diem proves de REST API, bàsicament es tracta de provar API realitzant accions de creació, edició, lectura i supressió de recursos amb 4 mètodes principals, és a dir, POST, GET, PUT i DELETE, respectivament.
Què és TestNG?
TestNG és un marc de proves que s’inspira en JUnit i NUnit. És per al llenguatge de programació Java. TestNG cobreix una gamma més àmplia de categories de proves, com ara unitat, funcional, extrem a extrem, integració, etc.
És un marc de codi obert que es troba sota la llicència Apache. Proporciona un conjunt ric d'anotacions que acceleren el desenvolupament de scripts de prova.
Què és la plantilla REST de primavera?
La classe Spring RestTemplate és una part del spring-web que es va introduir a la primavera 3
La classe RestTemplate proporciona una manera molt còmoda de provar els serveis web reposats basats en HTTP proporcionant mètodes sobrecarregats per a mètodes HTTP com GET, POST, PUT, DELETE, etc. El framework Spring també és de codi obert.
Passos de prova de l'API REST
Comprenem els passos que se solen seguir a la prova de l'API REST amb alguns exemples per obtenir una comprensió clara.
En aquest article, he considerat un exemple del servei per a empleats de l'API REST aquesta font.
Inicialment, seguim els passos manualment mitjançant l’eina POSTMAN.
# 1) En primer lloc, coneixeu el punt final de l'API a la qual voleu accedir.
Per exemple, http://dummy.restapiexample.com/api/v1/create per crear un recurs per a empleats nou
# 2) Definiu les capçaleres i el cos si és necessari per al mètode HTTP.
En el nostre exemple, ja que intentem crear un recurs nou mitjançant POST. Per a POST, cal un cos de sol·licitud.
Per tant, configurarem el cos de la següent manera:
'Nom': 'zozo100', 'salari': '123', 'edat': '23'
Accepta : aplicació / JSON i Tipus de contingut : aplicació / JSON.
com declarar la llista a Java
# 3) Estableix el mètode HTTP adequat, és a dir, POST en aquest cas.
# 4) Envieu una sol·licitud al servidor del servei Rest.
# 5) Rebeu una resposta del servidor.
Truca a l'API REST mitjançant l'eina POSTMAN
# 6) Verifiqueu la resposta tal com s’esperava amb l’ajut del codi de resposta Per exemple. 200 OK com a èxit.
# 7) Si és necessari, verifiqueu el cos de resposta tal com s’espera comparant-lo amb el fitxer de referència.
Ara hem d’automatitzar els mateixos passos per a la nostra suite d’automatització de proves. Comencem per la configuració necessària per a l'automatització.
Configuració de TestNG Test Framework al Windows
# 1) Instal·lació
- Utilitzarem Java per al desenvolupament de scripts de prova. Per tant, primer descarregar Instal·lador de JDK per a Windows i instal·leu Java a la vostra màquina.
- IDE (entorn de desenvolupament integrat) : He utilitzat Eclipse com a IDE per al meu desenvolupament de Automation Test Suite. Feu clic a aquí per descarregar-lo.
- Obteniu el connector Eclipse per a TestNG: Tingueu en compte que Java 1.7+ és necessari per executar TestNG per al complement Eclipse. Es requereix Eclipse 4.2 i versions posteriors. (Referència: TestNG ). Seguiu els passos següents a Eclipse:
- Seleccioneu Ajuda / Instal·lació de programari nou.
- Feu clic a Afegeix -> Introduïu http://beust.com/eclipse/
- Marqueu la casella de selecció situada al costat de l'URL i feu clic al botó Següent.
Instal·lació de TestNG
-
- Seguiu fent clic al botó Següent fins que arribeu a la pantalla següent.
Pantalla final d'instal·lació TestNG
Finalment, accepteu el contracte de llicència d’Apache i feu clic al botó Finalitza per completar la instal·lació.
Reinicieu Eclipse per fer efectiva la instal·lació del connector.
- Pots de primavera: Ara, una última cosa més, farem servir la classe RestTemplate del framework de primavera. Tu pots descarregar pots de primavera i deseu-lo en una carpeta local, Per exemple ,C: / projectJar
- JSON-pots simples: Hem de realitzar anàlisis JSON. Per a això, utilitzarem una API senzilla de Json lleugera. Per tant, descarregueu Json-simple-1.1.jar a C: / projectJar
Ara hem completat les instal·lacions necessàries. Per tant, creem el nostre projecte d’automatització de proves.
# 2) Configuració del projecte
- Crea fitxer -> Nou -> Projecte Java -> Posa-li el nom com a ' EmployeeTestSuite ’.
- Ara, creeu un nou paquet Java com.demo :
- Configureu el camí de construcció:
- Com heu vist a la secció anterior, hem instal·lat TestNG, els pots de primavera descarregats i JSON-simple. Per tant, ara hem d’afegir un camí de construcció al nostre projecte per consumir-los. Per a això, creeu un fitxer lib carpeta a el EmployeeTestSuite i ara copieu tots els pots del C: / projectJar al fitxer lib carpeta.
- Feu clic amb el botó dret a EmployeeTestSuite '' -> Construeix camí -> Configura el camí de construcció.
- Feu clic al botó lib fitxa.
- Feu clic al botó Afegeix biblioteca botó -> Seleccioneu TestNG. Això afegirà TestNG al camí de construcció.
- Fer clic a Afegiu pots botó -> Selecciona tots els pots de lib. Això afegirà tots els pots de primavera i el pot simple JSON al camí de construcció del projecte.
Camí de construcció de Java
Ara, l'estructura del vostre projecte es mostrarà de la següent manera a l'Explorador de paquets Eclipse.
Estructura del paquet
# 3) Prova de classe
Hem de crear una classe de prova que pugui cobrir les operacions CRUD (Crear-Llegir-Actualitzar-Eliminar).
Creeu una nova classe Fitxer -> Nou -> Classe TestNG i anomeneu-la TestCRUD.java
# 4) Mètode de prova
Creem mètodes de prova separats:
- addEmployee (): Mètode de prova per provar Crea API mitjançant el mètode HTTP POST.
- getEmployee (): Mètode de prova per provar Read API mitjançant el mètode HTTP GET.
- updateEmployee (): Mètode de prova per provar l'API d'actualització mitjançant el mètode HTTP PUT.
- deleteEmployee (): Mètode de prova per provar Delete API mitjançant el mètode HTTP DELETE.
Podeu crear un mètode de prova com qualsevol mètode Java només amb l’anotació @Test de TestNG per obtenir-lo identificat com a mètode de prova pel marc TestNG
Per exemple,el següent és el mètode de prova addEmployee.
@Test public void addEmployee () {}
En el nostre exemple, he utilitzat a mostra el servei REST.
Ara automatitzem la trucada POST. Per a això, hem de mapar el nostre codi amb els passos que hem seguit manualment a la secció 'Passos de prova de l'API REST' un per un.
# 1) Primer, coneixeu el punt final de l'API a la qual voleu accedir.
String addURI = 'http://dummy.restapiexample.com/api/v1/create';
# 2) Definiu capçaleres per al mètode HTTP.
HttpHeaders headers = new HttpHeaders();
// Afegiu capçaleres
headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json');
Definiu Cos per al mètode HTTP.
String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}';
// Creeu un objecte HttpEntity configurant el cos i les capçaleres.
HttpEntity entity = new HttpEntity(jsonBody, headers);
Tindrem els passos següents automatitzats en una declaració.
# 3) Estableix el mètode HTTP adequat, és a dir, POST en aquest cas.
# 4) Envieu una sol·licitud al servidor de serveis RESTful.
# 5) Rebeu una resposta del servidor.
RestTemplate restTemplate = new RestTemplate(); ResponseEntity response =restTemplate.postForEntity(addURI, entity, String.class);
Estem utilitzant postForEntity per enviar el mètode POST al servidor. Rebem la resposta de l'objecte ResponseEntity del servidor.
# 6) Verifiqueu la resposta tal com s’esperava amb l’ajut del codi de resposta.
Assert.assertEquals(response.getStatusCode(), HttpStatus.OK);
Aquí, utilitzem la classe d’eines Assert de TestNG per verificar el mètode assertEquals del codi d’estat que compara el valor real, és a dir, response.getStatusCode (), amb el valor esperat HttpStatus.OK.
cicle de vida d'errors en proves de programari
Però aquí estem fent una verificació més, és a dir, verificant si l’empleat afegit està present o no al cos de resposta.
Assert.assertTrue(responseBody.contains(employeeId));
Com hem aconseguit l’Id de l’empleat?
Per a això, estem prenent l'ajut de l'API d'analitzador JSON, és a dir, Json-simple.
Estem utilitzant l’analitzador JSON, ja que el format JSON s’utilitza per emmagatzemar i intercanviar dades entre el client i el nostre servidor al servei REST dels nostres empleats. Com s'ha esmentat anteriorment, les dades JSON s'emmagatzemen a clau: valor format. Aquí volem obtenir el 'Identificador' valor.
Ho aconseguirem analitzant el cos de resposta de la següent manera:
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
Per tant, es tracta de la prova del mètode Create.
Actualització, obtenció i eliminació de mètodes
- Creeu mètodes de prova separats i configureu les capçaleres segons correspongui.
- La verificació del codi d'estat també es fa de manera similar.
- La principal diferència són els mètodes per enviar una sol·licitud als servidors.
Podeu utilitzar els mètodes següents:
# 1) Actualització dels empleats : És la sol·licitud HTTP PUT. El mètode PUT RestTemplate que podeu utilitzar és:
public void put(String url,Object request, Object... urlVariables) throws RestClientException
# 2) Obteniu empleat: És la sol·licitud HTTP GET. El mètode GET RestTemplate que podeu utilitzar és el següent:
public ResponseEntity getForEntity(String url, Class responseType, Object... urlVariables) throws RestClientException
# 3) Suprimeix el recurs per a empleats: És la sol·licitud HTTP DELETE. El mètode RestTemplate DELETE que podeu utilitzar és:
public void delete(String url, Object... urlVariables) throws RestClientException
A part d'aquests mètodes, hi ha mètodes útils d'intercanvi () i execució ().
Per exemple, si es nota, el mètode Delete és nul. Però si voleu verificar el cos de la resposta, necessitareu una resposta de l'execució del mètode. Amb aquest propòsit, podeu utilitzar el mètode exchange () que retorna ResponseEntity. Consulteu el document Marc de primavera per a més detalls.
# 5) Execució de les proves
Ara hem completat la nostra tasca de desenvolupament de seqüències de proves, així que executem les nostres proves. Simplement feu clic amb el botó dret a sobre TestCRUD.java i seleccioneu l'opció 'Executa com a prova TestNG' .
Es mostraran els resultats de l'execució de les proves de la següent manera.
Sortida de la consola
Nota: Podeu definir el vostre conjunt de proves a testng.xml arxiu també. En el nostre exemple, només és One Script Script. Però, en l’escenari real, sempre es tracta d’una col·lecció de múltiples scripts.
Per tant, el fitxer testg.xml tindrà el següent aspecte:
# 6) Informes
Hem vist el resultat a la consola. Però TestNG proporciona els resultats de les proves en un format html més presentable que es pot compartir amb els vostres grups d'interès. Obert sortida-prova -> emailable-report.html al navegador.
Veureu l'informe de prova de la següent manera. A la pàgina de l’informe, podeu veure el nom de la prova com a TestCRUD, diverses proves superades, és a dir, 4, nombre d’ometuts i fallats, que són 0 en aquest cas. També mostra el temps total necessari per a l'execució de cada mètode de prova.
Resultat de la prova en format HTML
Codi complet del fitxer 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(); } }
Conclusió
A continuació, hem resumit els resultats d'aprenentatge d'aquest article. Vam veure tots els passos des del principi per configurar un REST API Test Automation Framework.
En això vam aprendre el següent:
- Per a l'automatització de proves, hem seleccionat Java com a llenguatge de programació.
- Vam triar TestNG com a marc de prova per crear un script de prova on vam consumir anotacions TestNG com @Test.
- Per enviar sol·licituds HTTP reals al servidor, hem consumit la classe RestTemplate del framework Spring.
- Per consumir aquestes API, hem fet la instal·lació de TestNG, hem descarregat els pots Spring i el Json-simple jar per a l'API de l'analitzador.
- Finalment, vam executar la classe Test i vam veure el resultat a la consola, així com en un format HTML més presentable i més llegible.
En poques paraules, en aquest article vam aprendre a començar amb l’automatització de la prova API REST amb Spring RestTemplate. Vam cobrir la configuració del nostre marc d'automatització de proves a partir de la instal·lació de tot el programari essencial, la configuració del projecte, el desenvolupament de scripts de prova fins a l'execució de la prova i la visualització dels informes generats.
Això és bastant suficient perquè qualsevol control d'autorització de control d'automatització comenci amb el vostre marc d'automatització de proves. Però, només hem vist les parts necessàries de cadascuna. Per exemple, hem utilitzat la instal·lació TestNG, mètode de prova amb anotació @Test, informes. Tot i això, TestNG proporciona moltes més funcions com DataProvider per a proves basades en dades, etc.
Esteu a punt per començar amb l’automatització de la prova REST API amb Spring RestTemplate?
Lectura recomanada
- 10 millors eines de proves d'API el 2021 (eines de proves d'API SOAP i REST)
- Les millors eines de prova de programari 2021 (Eines d'automatització de proves de control de qualitat)
- Prova de descàrrega de llibres electrònics
- Top 20 de les preguntes i respostes de les entrevistes de proves API més importants
- Feu que les proves API siguin senzilles amb Katalon Studio
- Parasoft SOAtest Tutorial: Eina de prova d'API sense script
- Prova de càrrega amb tutorials HP LoadRunner
- Diferència entre la prova d'escriptori, el servidor de clients i la prova web