rest api testing with spring resttemplate
Ce didacticiel détaillé explique comment démarrer avec les tests d'API REST avec Spring RestTemplate et TestNG avec des exemples simples:
Dans cet article, nous verrons comment démarrer avec les tests d'API REST avec RestTemplate et le framework TestNG.
Avant d'explorer les tests d'API REST avec RestTemplate et le framework TestNG, laissez-nous comprendre certains des concepts de base impliqués.
Commençons!!
Ce que vous apprendrez:
- Qu'est-ce que REST?
- Qu'est-ce que JSON?
- Qu'est-ce que le test de l'API REST?
- Qu'est-ce que TestNG?
- Qu'est-ce que le modèle Spring REST?
- Étapes de test de l'API REST
- Configuration du framework de test TestNG sous Windows
- Code de fichier TestCRUD complet
- Conclusion
- lecture recommandée
Qu'est-ce que REST?
De nos jours, REST est devenu un choix très populaire de création de services Web. Par exemple , Google propose plusieurs services REST tels que Google Agenda, API de carte , etc.
DU REPOS c'est à dire. Transfert d'état de représentation est un style architectural logiciel. Dans ce style, un ensemble de contraintes est défini et des services Web créés sont nécessaires pour satisfaire ces contraintes. Ces services Web conformes au style architectural REST sont appelés services Web RESTful.
Le terme «transfert d’état représentatif» a été proposé pour la première fois par Roy Fielding dans son doctorat. mémoire en l'an 2000. L'idée de base de REST est de traiter les objets côté serveur comme des ressources qui peuvent être créées ou supprimées.
Qu'est-ce que JSON?
JSON c'est à dire. Notation d'objets JavaScript est une syntaxe très couramment utilisée dans les services REST pour stocker et échanger des données entre le navigateur et le serveur.
Le principal avantage de JSON est sa légèreté et, d'autre part, son format lisible également. Les données sont stockées au format de paire clé: valeur. Par exemple, vous pouvez avoir les données des employés stockées au format JSON comme ceci: {'name': 'Emp1', 'salaire': '3000', 'age': '23', 'id': '52686'}.
Qu'est-ce que le test de l'API REST?
Lorsque nous parlons de test d'API REST, il s'agit essentiellement de tester l'API en effectuant des actions Créer, Modifier, Lire et Supprimer sur la ressource avec 4 méthodes principales, à savoir POST, GET, PUT et DELETE respectivement
Qu'est-ce que TestNG?
TestNG est un framework de test inspiré de JUnit et NUnit. C’est pour le langage de programmation Java. TestNG couvre une gamme plus large de catégories de tests telles que l'unité, fonctionnelle, de bout en bout, l'intégration, etc.
C’est un framework open-source qui relève de la licence Apache. Il fournit un ensemble complet d'annotations qui accélèrent le développement du script de test.
Qu'est-ce que le modèle Spring REST?
La classe Spring RestTemplate fait partie du spring-web qui a été introduit au printemps 3
La classe RestTemplate fournit un moyen très pratique de tester les services Web reposants basés sur HTTP en fournissant des méthodes surchargées pour les méthodes HTTP telles que GET, POST, PUT, DELETE, etc. Spring Framework est également open-source.
Étapes de test de l'API REST
Comprenons les étapes généralement suivies dans les tests d'API REST avec quelques exemples pour bien comprendre.
Dans cet article, j'ai examiné un exemple de service d'employé de l'API REST de cette source.
Dans un premier temps, suivons les étapes manuellement à l'aide de l'outil POSTMAN.
#1) Tout d'abord, connaissez le point de terminaison de l'API auquel vous souhaitez accéder.
Par exemple, http://dummy.restapiexample.com/api/v1/create pour créer une nouvelle ressource d'employé
#deux) Définissez les en-têtes et le corps si nécessaire pour la méthode HTTP.
Dans notre exemple, comme nous essayons de créer une nouvelle ressource en utilisant POST. Pour POST, un corps de requête est requis.
Nous allons donc définir le corps comme suit:
'Nom': 'zozo100', 'salaire': '123', 'âge': '23'
J'accepte : application / JSON et Type de contenu : application / JSON.
quel est le meilleur téléchargeur youtube gratuit?
# 3) Définissez la méthode HTTP appropriée, c'est-à-dire POST dans ce cas.
# 4) Envoyez une demande au serveur de service Rest.
# 5) Recevez une réponse du serveur.
Appel d'API REST à l'aide de l'outil POSTMAN
# 6) Vérifiez la réponse comme prévu à l'aide du code de réponse Par exemple. 200 OK comme un succès.
# 7) Vérifiez le corps de la réponse comme prévu si nécessaire en le comparant avec votre fichier de référence.
Maintenant, nous devons automatiser les mêmes étapes pour notre suite d'automatisation des tests. Commençons par la configuration requise pour l'automatisation.
Configuration du framework de test TestNG sous Windows
# 1) Installation
- Nous allons utiliser Java pour le développement de scripts de test. Alors, premier téléchargement Programme d'installation JDK pour Windows et installez Java sur votre machine.
- IDE (environnement de développement intégré) : J'ai utilisé Eclipse comme IDE pour le développement de mon Automation Test Suite. Cliquez sur ici pour le télécharger.
- Obtenez le plug-in Eclipse pour TestNG: Notez que Java 1.7+ est requis pour exécuter TestNG pour le plug-in Eclipse. Eclipse 4.2 et supérieur est requis. [Référence: TestNG ]. Suivez les étapes ci-dessous dans Eclipse:
- Sélectionnez Aide / Installer un nouveau logiciel.
- Cliquez sur Ajouter -> Entrez http://beust.com/eclipse/
- Cochez la case à côté de l'URL et cliquez sur le bouton Suivant.
Installation de TestNG
-
- Continuez à cliquer sur le bouton Suivant, jusqu'à ce que vous atteigniez l'écran suivant.
Écran final d'installation de TestNG
Enfin, acceptez le contrat de licence Apache et cliquez sur le bouton Terminer pour terminer l'installation.
Redémarrez Eclipse pour que l'installation du plug-in soit effective.
- Pots de printemps: Encore une dernière chose, nous allons utiliser la classe RestTemplate du framework Spring. Tu peux télécharger des pots de printemps et enregistrez-le dans un dossier local, Par exemple ,C: / projectJar
- Jars simples JSON: Nous devons effectuer une analyse JSON. Pour cela, nous utiliserons une API Json-simple légère. Alors, téléchargez Json-simple-1.1.jar vers C: / projectJar
Nous avons maintenant terminé les installations nécessaires. Alors, créons notre projet d'automatisation des tests.
# 2) Configuration du projet
- Créer un fichier -> Nouveau -> Projet Java -> Nommez-le comme ‘ EmployeeTestSuite ».
- Maintenant, créez un nouveau package java com.demo :
- Configurer le chemin de construction:
- Comme vous l'avez vu dans la section précédente, nous avons installé TestNG, téléchargé des jars spring et JSON-simples. Nous devons maintenant ajouter un chemin de construction dans notre projet pour les consommer. Pour cela, créez un lib dossier dans la EmployeeTestSuite et maintenant copiez tous les jars du C: / projectJar vers le lib dossier.
- Faites un clic droit sur ' EmployeeTestSuite » -> Chemin de construction -> Configurer le chemin de construction.
- Clique sur le lib languette.
- Clique sur le Ajouter une bibliothèque bouton -> Sélectionnez TestNG. Cela ajoutera TestNG au chemin de construction.
- Cliquer sur Ajouter des pots bouton -> Sélectionnez tous les jars de la lib. Cela ajoutera tous les pots Spring et JSON-simple jar au chemin de construction de votre projet.
Chemin de construction Java
La structure de votre projet sera maintenant affichée comme suit dans l'explorateur de packages Eclipse.
Structure du package
# 3) Classe d'essai
Nous devons créer une classe Test qui peut couvrir les opérations CRUD (Create-Read-Update-Delete).
Créez une nouvelle classe File -> New -> TestNG class et nommez-la TestCRUD.java
# 4) Méthode d'essai
Créons des méthodes de test distinctes:
- addEmployee (): Méthode de test pour tester Créer une API à l'aide de la méthode HTTP POST.
- getEmployee (): Méthode de test pour tester l'API de lecture à l'aide de la méthode HTTP GET.
- updateEmployee (): Méthode de test pour tester l'API de mise à jour à l'aide de la méthode HTTP PUT.
- deleteEmployee (): Méthode de test pour tester l'API Delete à l'aide de la méthode HTTP DELETE.
Vous pouvez créer une méthode de test comme n'importe quelle méthode java uniquement avec l'annotation @Test de TestNG pour qu'elle soit identifiée comme méthode de test par le framework TestNG
Par exemple,Voici la méthode de test addEmployee.
@Test public void addEmployee () {}
Dans notre exemple, j'ai utilisé un exemple de service REST.
Maintenant, automatisons l'appel POST. Pour cela, nous devons mapper notre code avec les étapes que nous avons suivies manuellement dans la section 'Étapes de test de l'API REST' une par une.
#1) Tout d'abord, connaissez le point de terminaison de l'API auquel vous souhaitez accéder.
String addURI = 'http://dummy.restapiexample.com/api/v1/create';
#deux) Définissez les en-têtes pour la méthode HTTP.
HttpHeaders headers = new HttpHeaders();
// Ajouter des en-têtes
headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json');
Définissez Body pour la méthode HTTP.
String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}';
// Créer un objet HttpEntity en définissant le corps et les en-têtes.
HttpEntity entity = new HttpEntity(jsonBody, headers);
Nous aurons les étapes suivantes automatisées dans une seule déclaration.
# 3) Définissez la méthode HTTP appropriée, c'est-à-dire POST dans ce cas.
# 4) Envoyez une demande au serveur de service RESTful.
# 5) Recevez une réponse du serveur.
RestTemplate restTemplate = new RestTemplate(); ResponseEntity response =restTemplate.postForEntity(addURI, entity, String.class);
Nous utilisons postForEntity pour envoyer la méthode POST au serveur. Nous recevons la réponse de l'objet serveur ResponseEntity.
# 6) Vérifiez la réponse comme prévu à l'aide du code de réponse.
Assert.assertEquals(response.getStatusCode(), HttpStatus.OK);
Ici, nous utilisons la classe d'outils Assert de TestNG pour vérifier la méthode assertEquals du code d'état qui compare la valeur réelle, c'est-à-dire response.getStatusCode (), avec la valeur attendue HttpStatus.OK.
Mais ici, nous faisons une autre vérification, c'est-à-dire vérifier si l'employé ajouté est présent ou non dans le corps de la réponse.
Assert.assertTrue(responseBody.contains(employeeId));
Comment avons-nous obtenu le employeeId?
Pour cela, nous prenons l'aide de l'API d'analyseur JSON, c'est-à-dire Json-simple.
Nous utilisons un analyseur JSON, car le format JSON est utilisé pour stocker et échanger les données entre le client et notre serveur dans notre service REST pour les employés. Comme mentionné précédemment, les données JSON sont stockées dans valeur clé format. Ici, nous voulons obtenir le 'identifiant' évaluer.
Nous l'obtiendrons en analysant le corps de la réponse comme suit:
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
Il s'agit donc du test de la méthode Create.
Mettre à jour, obtenir et supprimer des méthodes
- Créez des méthodes de test distinctes et définissez les en-têtes le cas échéant.
- La vérification du code de statut est également effectuée de la même manière.
- La principale différence réside dans les méthodes d'envoi d'une requête aux serveurs.
Vous pouvez utiliser les méthodes suivantes:
# 1) Mettre à jour l'employé : C'est la requête HTTP PUT. La méthode RestTemplate PUT que vous pouvez utiliser est:
public void put(String url,Object request, Object... urlVariables) throws RestClientException
# 2) Obtenez un employé: C'est la requête HTTP GET. La méthode RestTemplate GET que vous pouvez utiliser est la suivante:
public ResponseEntity getForEntity(String url, Class responseType, Object... urlVariables) throws RestClientException
# 3) Supprimer la ressource d'employé: Il s'agit de la requête HTTP DELETE. La méthode RestTemplate DELETE que vous pouvez utiliser est:
public void delete(String url, Object... urlVariables) throws RestClientException
En dehors de ces méthodes, il existe des méthodes utiles exchange () et execute ().
Par exemple, si vous remarquez, la méthode Delete est nulle. Mais si vous souhaitez vérifier le corps de la réponse, vous aurez besoin d'une réponse de l'exécution de la méthode. Pour cela, vous pouvez utiliser la méthode exchange () qui renvoie ResponseEntity. Se référer au Cadre de printemps pour plus de détails.
# 5) Exécution des tests
Maintenant, nous avons terminé notre tâche de développement de script de test, alors exécutons nos tests. Faites un clic droit sur TestCRUD.java et sélectionnez l'option «Exécuter en tant que test TestNG» .
tester les outils de gestion des données open source
Cela affichera les résultats de l'exécution des tests comme suit.
Sortie de la console
Remarque: Vous pouvez définir votre suite de tests dans testng.xml fichier ainsi. Dans notre exemple, il s’agit d’un seul script de test. Mais dans le scénario réel, il s’agit toujours d’une collection de plusieurs scripts.
Ainsi, votre fichier testg.xml ressemblera à ceci:
# 6) Rapports
Nous avons vu le résultat sur la console. Mais TestNG fournit les résultats des tests dans un format html plus présentable qui peut être partagé avec vos parties prenantes. Ouvert test-sortie -> emailable-report.html dans le navigateur.
Vous verrez le rapport de test comme suit. Dans la page de rapport, vous pouvez voir le nom du test en tant que TestCRUD, plusieurs tests réussis, c'est-à-dire 4, le nombre de sauts et d'échecs qui sont 0 dans ce cas. Il montre également le temps total requis pour chaque exécution de méthode de test.
Résultat du test au format Html
Code de fichier TestCRUD complet
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(); } }
Conclusion
Nous avons résumé les résultats d'apprentissage de cet article ci-dessous. Nous avons vu toutes les étapes depuis le début pour mettre en place un Framework d'automatisation de test API REST.
En cela, nous avons appris ce qui suit:
- Pour l'automatisation des tests, nous avons sélectionné Java comme langage de programmation.
- Nous avons choisi TestNG comme framework de test pour créer un script de test où nous avons utilisé des annotations TestNG comme @Test.
- Pour envoyer des requêtes HTTP réelles au serveur, nous avons utilisé la classe RestTemplate du framework Spring.
- Pour consommer ces API, nous avons effectué l'installation de TestNG, téléchargé les jars Spring et Json-simple jar pour l'API parser.
- Enfin, nous avons exécuté la classe Test et vu le résultat sur la console ainsi que dans un format HTML plus présentable et plus lisible.
En un mot, dans cet article, nous avons appris comment démarrer avec l'automatisation des tests d'API REST avec Spring RestTemplate. Nous avons couvert la configuration de notre cadre d'automatisation des tests à partir de l'installation de tous les logiciels essentiels, de la configuration du projet, du développement de scripts de test jusqu'à l'exécution des tests et de la visualisation des rapports générés.
C'est assez suffisant pour que tout contrôle qualité d'automatisation démarre avec votre cadre d'automatisation de test. Mais, nous n'avons vu que les pièces requises de chacun, par exemple, nous avons utilisé l'installation de TestNG, la méthode de test utilisant l'annotation @Test, les rapports. Cependant, TestNG fournit de nombreuses autres fonctionnalités telles que DataProvider pour les tests basés sur les données, etc.
Êtes-vous prêt à démarrer avec l'automatisation des tests d'API REST avec Spring RestTemplate?
lecture recommandée
- 10 meilleurs outils de test d'API en 2021 (outils de test d'API SOAP et REST)
- Meilleurs outils de test de logiciels 2021 [Outils d'automatisation des tests QA]
- Téléchargement de l'e-book 'Testing Primer'
- Top 20 des questions et réponses d'entretien les plus importantes pour les tests d'API
- Simplifier les tests d'API avec Katalon Studio
- Tutoriel Parasoft SOAtest: outil de test d'API sans script
- Test de charge avec les didacticiels HP LoadRunner
- Différence entre les tests de bureau, client-serveur et Web