web services testing using apache http client
Ce didacticiel concerne l'exécution de diverses opérations CRUD sur les services Web et le test des services Web à l'aide du client HTTP Apache:
Dans ce Série complète de didacticiels de test d'API , nous avons appris que les services Web agissent comme un moyen de communication entre les machines client et serveur qui interagissent sur un réseau. Nous avons tout expliqué sur Test d'API avec POSTMAN dans notre tutoriel précédent.
Dans cet article, nous mettrons l'accent sur la façon de tester les services Web à l'aide du client HTTP Apache et d'effectuer différentes opérations CRUD sur les services Web. Les différents types de clients REST disponibles pour les tests backend seront également abordés.
Questions et réponses pour l'entretien d'automatisation de l'AQ
Ce que vous apprendrez:
- Qu'est-ce qu'un service Web?
- Qu'est-ce que le client REST?
- Opérations CRUD à l'aide du client HTTP Apache
- Conclusion
Qu'est-ce qu'un service Web?
Les services Web sont un moyen de communication entre les machines client et serveur qui interagit sur un réseau à l'aide de protocoles HTTP. Les services Web sont généralement des API qui ne sont ni installées ni stockées localement, mais disponibles dans des clouds ou sur certains serveurs distants.
Reportez-vous à l'exemple ci-dessous pour comprendre le fonctionnement des services Web.
MakeMyTrip et Goibibo.com sont quelques-uns des célèbres sites de réservation de vols et d'hôtels et il existe différents fournisseurs de vols disponibles comme Indigo, Air India et Etihad, etc.
Si un client souhaite réserver un vol de New York à Londres, il peut soit naviguer directement sur le portail des fournisseurs de vols, soit réserver auprès de fournisseurs tiers. S'ils réservent via des fournisseurs tiers tels que MakeMyTrip et d'autres sites de réservation, en quelques secondes, ils compareront et afficheront les résultats en fournissant des détails de vol tels que le prix le plus bas, le temps de vol et bien d'autres informations.
La question qui se pose ici est de savoir comment exactement, en quelques secondes, ils nous fournissent les informations? Que font-ils exactement?
À partir de l'interface utilisateur, ils prennent toutes les informations nécessaires et les stockent dans un fichier JSON ou XML et appellent les API de leurs fournisseurs avec un jeton d'authentification lorsqu'ils exposent leurs API, et en réponse, le site du fournisseur de vols renvoie une réponse JSON / XML à MakeMyTrip, et ils convertissent la réponse reçue et affichent les détails dans l'interface utilisateur.
Types de services Web
Il existe deux types de services Web, à savoir
- API SOAP
- API REST
Voyons les différences entre ces deux services Web comme indiqué dans l'image ci-dessous.
Fichiers JSON / XML dans le service Web
Soit le système S1 est retourné en langage J2EE et le système S2 est retourné en .NET ou Python et nous savons que les deux technologies sont complètement différentes l'une de l'autre avec des problèmes de sécurité également. Alors, comment le système S2 partagera-t-il le code avec un autre système?
Ainsi, le système S2 expose ses API au système S1 sans exposer la logique métier, et le système S2 partage le nom d'API, l'URL d'API, le format d'API et la clé d'authentification / clé de jeton pour accéder à son système. La communication se produit entre les deux systèmes à l'aide de fichiers JSON ou XML.
Pourquoi un fichier JSON / XML uniquement?
Les fichiers JSON / XML sont utilisés car ce sont des collecteurs de données. Toute information particulière est stockée aux formats JSON ou XML, car ils sont légers et constituent un langage standard pour communiquer entre deux interfaces / plates-formes ou systèmes différents.
Ainsi, l'API est toujours utilisée lorsque deux systèmes indépendants interagissent l'un avec l'autre, soit localement, dans le système, soit sur le réseau.
Qu'est-ce que le client REST?
REST Client est un outil qui appelle les API. Il est utilisé dans les tests backend lorsqu'il n'y a pas d'interface utilisateur pour appeler les API. Certains clients REST populaires sont le client HTTP Apache, POSTMAN, SOAP UI, Swagger et bien d'autres.
Ici, dans cet article, nous ne discuterons que du client HTTP Apache et nous couvrirons d'autres clients HTTP différents dans nos prochains articles.
Configuration du client HTTP dans Eclipse
#1) Ouvrez Eclipse et créez un nouveau projet Maven.
#deux) Supprimer les paquets factices fournis par MAVEN i.e. «Src / main / java» et 'Src / test / java'
# 3) Accédez au fichier pom.xml et supprimez la dépendance JUnit car nous n'en avons pas besoin.
# 4) Ensuite, nous avons besoin de la bibliothèque client HTTP, de la bibliothèque HTTP Core, de la bibliothèque JSON Parser, de la bibliothèque TestNG, de la bibliothèque Jackson-data bind
# 5) Ajoutez les dépendances ci-dessus (bibliothèque) dans le fichier pom.xml.
Bibliothèque cliente HTTP:
Bibliothèque HTTP Core:
Bibliothèque JSON Parser:
Bibliothèque TestNG:
# 6) Téléchargez les dernières versions stables. Nous n'ajouterons pas de jar Selenium dans notre projet, car nous effectuons des tests backend complets. Le fichier final pom.xml ressemble à celui illustré ci-dessous:
# 7) Ensuite, créez un cadre pour votre test d'API
à) Créez un package «com.qa.config» -> Créez un fichier «config.properties» et stockez toutes les URL.
b) Créer un autre package 'qa.com.base' -> Créez une classe «testBase.java» qui sera une classe parente pour toutes les classes. Il contient des fonctions communes à utiliser par toutes les méthodes.
c) Créez un autre package «com.qa.client» et la classe «restClient.java». Il contient du code pour récupérer les appels GET, POST, DELETE, PUT.
ré) Créez un autre package «com.qa.data» et une classe «user.java» qui définissent différentes propriétés utilisateur.
est) Enfin, créez un package «com.qa.Test» sous «src / test / java» et déclarez une méthode principale et des fonctions pour tester toutes les méthodes GET, PUT, POST et Delete.
f) La structure finale du cadre ressemblera à celle illustrée ci-dessous:
g) Utilisez l'API factice fournie par ce site REQ RES .
Méthodes HTTP ou opérations CRUD
Voyons différentes méthodes HTTP ou opérations CRUD que nous automatisons.
Les opérations répertoriées ci-dessous sont appelées opérations CRUD:
- C : Créer (signifie appel POST)
- R : Récupérer (signifie GET appel)
- U : Mise à jour (signifie appel PUT)
- ré : Supprimer (signifie Supprimer l'appel)
Paramètres dans les services Web REST
Validez ou accentuez les paramètres ci-dessous dans les services Web REST:
(i) URI: L'URI est la combinaison du paramètre URL + Path et du paramètre de requête.
Exemple: http://api.com/service/account/1
Ici, api.com est l'URL du serveur S2, un service est le titulaire. Dans ce service, le titulaire se rend au Compte class, et à partir de cette classe de compte, il appelle la méthode account = 1. Dans chaque appel, nous transmettons l'URI.
(ii) Charge utile: Données JSON / XML que nous transmettons au système.
(iii) Code de statut: Pour chaque réponse, nous obtenons les codes de statut.
Ici, quelques codes sont listés ci-dessous:
- 200: Ok, tout fonctionne bien.
- 201: Créé avec succès, chaque fois que vous effectuez un appel POST ou que vous créez une nouvelle entité.
- 400: La charge utile est incorrecte, l'URL de fin est incorrecte, affiche une mauvaise demande.
- 404: Mettre à jour ou supprimer une entité et que cette entité n'est pas disponible, nous obtenons alors le résultat comme une demande introuvable.
- 500: Supposons que le serveur S2 soit en panne, nous obtenons une erreur de serveur interne.
- 401: Erreur d'authentification
Cliquez sur ici pour obtenir tous les codes d'état.
(iv) En-têtes: Comme le jeton d'authentification, l'ID utilisateur / mot de passe, le type de contenu, etc.
meilleur logiciel de conversion vidéo pour windows
Opérations CRUD à l'aide du client HTTP Apache
# 1) OBTENIR UN APPEL
Comment se comporte l'opération GET Call?
Get Call envoie la demande et reçoit la réponse. Nous ne transmettons aucun JSON ou la charge utile ici, nous transmettons un URI, dans lequel URL (paramètre de chemin de point de terminaison, paramètre de requête) avec l'en-tête, si disponible.
déclarer un tableau d'objets en java
Avant d'écrire le code d'appel GET, gardez à l'esprit les éléments ci-dessous:
- Besoin d'une méthode GET
- Alors besoin d'une URL
- Une fois que vous appuyez sur le bouton d'envoi, vous obtiendrez la réponse. Enregistrez ensuite la réponse.
- Besoin d'un code d'état, d'en-têtes.
Reportez-vous à la capture d'écran ci-dessous du client POSTMAN qui affiche la réponse à l'appel GET:
Dans la classe restClient.java,
(je) Créez la méthode GET qui appellera l'URL et obtiendra la réponse sous la forme d'un objet JSON sans en-tête.
package com.qa.Client; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; import org.apache.http.Header; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.json.JSONException; import org.json.JSONObject; public class restClient { // create GET Method, which will call the URL and get the response in the form of JSON object without Header public CloseableHttpResponse getMethod(String Url) throws ClientProtocolException, IOException, JSONException{ /*Call HTTPClients class from HTTPClient library added in POM.xml. Call createDefault() method present in HTTPClients class, which will create a client connection. And this createDefault() method returns 'CloseableHttpClient' object which is an abstract class. And we are creating a reference to that abstract class */ CloseableHttpClient httpClient=HttpClients.createDefault(); /*create an object for HttpGet class, which is used for HTTP GET Request. And pass the URL which is to be loaded*/ HttpGet htttpGet = new HttpGet(Url); /*execute the HTTP GET Request, means it will hit the GET API call as we click SEND button from POSTMAN client. httpClient.execute() method returns the response 'CloseableHttpResponse' interface and store it in reference variable So the complete response is stored in CloseableHttpResponse And fetch all the details, in our test case/test method */ CloseableHttpResponse closeableHttpResponse = httpClient.execute(htttpGet); return closeableHttpResponse; } }
(ii) Créez la classe principale «getAPITest.java» sous «src / test / java»
Production
# 2) POST APPEL
POST Call crée un compte ou crée une nouvelle entité.
Exemple - Transmettez ces détails comme le nom, la tâche et l'en-tête à la charge utile JSON. Le serveur S2 sera lié à une base de données, par exemple Oracle, et a un nom de table appelé Account table. La méthode POST crée une entrée dans la base de données et le serveur S2 transmet les informations au client S1. N'oubliez pas que l'opération d'appel POST est toujours utilisée pour créer une nouvelle entité.
Dans la méthode POST, nous devons transmettre l'URL et la charge utile.
Téléchargez cette dépendance car nous devons convertir la classe Java en objet Java plutôt qu'en objet JSON.
Dans la classe restClient.java,
(je) Créez la méthode POST, qui appellera l'URL et publiera la réponse.
public class restClient { public CloseableHttpResponse POST(String url,String entityString,HashMap headermap) throwsClientProtocolException, IOException{ /*Call HTTPClients class from HTTPClient library added in POM.xml and createDefault() method present in HTTPClients class, which will create a client connection and this createDefault() method returns 'CloseableHttpClient' object which is an abstract class and we are creating reference to that abstract class */ CloseableHttpClient httpClient=HttpClients.createDefault(); /*create an object for HttpPost class, which is used for HTTP POST Request and pass the URL which is to be loaded */ HttpPost htttpPost = new HttpPost(url); /*define pay load, use setEnity method present in HTTPPOST class and pass the payload entity */ htttpPost.setEntity(new StringEntity(entityString)); //Create a for loop and iterate the hashmap, and store the header for(Map.Entry entry : headermap.entrySet()){ htttpPost.addHeader(entry.getKey(),entry.getValue()); } //Execute the POST request CloseableHttpResponse closeableHttpResponse = httpClient.execute(htttpPost); return closeableHttpResponse; } }
(ii) Créez la classe principale «postAPI_Test.java» sous «src / test / java».
//Inherit testBase class public class postAPI_Test extends testBase { //Create global methods testBase testbase; String serviceURL; String apiURL; String URL; restClient restClient; HttpResponse closeableHttpResponse; // In before method call the properties file @BeforeMethod public void setUp() throws ClientProtocolException, IOException, JSONException{ //call the constructor of base class and execute the properties file testbase = new testBase(); serviceURL = prop.getProperty('URL'); apiURL = prop.getProperty('serviceURL'); URL = serviceURL+apiURL; } //Main method which calls the GET method @Test public void POSTAPITest() throws ClientProtocolException, IOException, JSONException{ restClient = new restClient(); //Pass the Request Header HashMap headrMap = new HashMap(); headrMap.put('Content-Type', 'application/json'); /*Use Jackson API for doing marshaling, means converting java to java object to JSON Object and vice versa Use ObjectMapper class */ ObjectMapper mapper = new ObjectMapper(); //Create object of Users class, expected users users user = new users('John','Manager'); //Convert java object 'user' to JSON Object using writeValue(), pass the path where to store the JSON file and the object to be converted */ mapper.writeValue(new File('.\data\users.json'), user ); //convert java object to json in string String userJsonString = mapper.writeValueAsString(user); System.out.println(userJsonString); //Call the POST Method closeableHttpResponse = restClient.POST(URL, userJsonString, headrMap); //Fetches status, header, and JSON response from CloseableHttpResponse //1.Fetch Status Code int statusCode = closeableHttpResponse.getStatusLine().getStatusCode();//Get the Status code System.out.println('Status Code --->' +statusCode); //Validate the status code using Assert class Assert.assertEquals(statusCode, response_Status_Code_201,'Status is not 200'); /*2.Fetch the JSON String use EntityUtils class and call to String method, where we have to pass entity and format entity is available in closeableHttpResponse and pass UTF-8 format because we want pure string so complete JSON will be stored in a String, so we need to convert an entire string into a JSON object */ String responseString = EntityUtils.toString(closeableHttpResponse.getEntity(), 'UTF-8'); /*as we added one JSON library, from that library call JSON class and pass the response string. So this JSON object converts the string into JSON */ JSONObject responseJson = new JSONObject(responseString); System.out.println('Response JSONfrom API --->'+responseJson); /*Convert JSON to java actual User Object we are getting */ users userResObj = mapper.readValue(responseString, users.class); Assert.assertTrue(user.getName().equals(userResObj.getName())); Assert.assertTrue(user.getJob().equals(userResObj.getJob()));} }
Production:
# 3) Appel PUT
À l'aide de l'opération d'appel PUT, vous pouvez créer une nouvelle entité et mettre à jour une entité existante.
Dans la classe restClient.java,
(je) Créez la méthode PUT, qui appellera l'URL et mettra à jour la réponse.
public class restClient { public CloseableHttpResponse PUT(String url,String entityString,HashMap headermap) throwsClientProtocolException, IOException{ /*Call HTTPClients class from HTTPClient library added in POM.xml. Call createDefault() method present in HTTPClients class, which will create a client connection and this createDefault() method returns 'CloseableHttpClient' object which is an abstract class and we are creating reference to that abstract class*/ CloseableHttpClient httpClient=HttpClients.createDefault(); /*create an object for HttpPut class, which is used for HTTP PUT Request and pass the URL which is to be loaded */ HttpPut htttpPut = new HttpPut(url); /*define pay load, use setEnity method present in HTTPPUT class and pass the payload entity */ htttpPut.setEntity(new StringEntity(entityString)); /*create a for loop, iterate and store the header */ for(Map.Entry entry : headermap.entrySet()){ htttpPut.addHeader(entry.getKey(),entry.getValue()); } //Execute the PUT request CloseableHttpResponse closeableHttpResponse = httpClient.execute(htttpPut); return closeableHttpResponse; } }
(ii) Créez la classe principale «putAPI_Test.java» sous «src / test / java»
//Inherit testBase class public class putAPI_Test extends testBase { //Create global methods testBase testbase; String serviceURL; String apiURL; String URL; restClient restClient; HttpResponse closeableHttpResponse; // in before method call the properties file @BeforeMethod public void setUp() throws ClientProtocolException, IOException, JSONException{ //Call the constructor of the base class and execute the properties file testbase = new testBase(); serviceURL = prop.getProperty('URL'); apiURL = prop.getProperty('serviceURL'); URL = serviceURL+apiURL; } //Main method which calls PUT method @Test public void PUTAPITest() throws ClientProtocolException, IOException, JSONException{ restClient = new restClient(); //Pass the Request Header HashMap headrMap = new HashMap(); headrMap.put('Content-Type', 'application/json'); /*use Jackson API, for doing marshaling means converting java to java object to JSON Object and vice versa, use ObjectMapper class */ ObjectMapper mapper = new ObjectMapper(); //Create object of Users class, new users users user = new users('JohnMarry Dicosta','HRManager'); /*Convert java object 'user' to JASON Object using writeValue() and pass the path where to store the JSON file and the object to be converted */ mapper.writeValue(new File('.\data\users.json'), user ); //convert java object - > JSON - >String String userJsonString = mapper.writeValueAsString(user); System.out.println(userJsonString); //Call the PUT Method closeableHttpResponse = restClient.PUT(URL, userJsonString, headrMap); /*fetch status, header, JSON response from CloseableHttpResponse Fetch Status Code */ int statusCode = closeableHttpResponse.getStatusLine().getStatusCode(); System.out.println('Status Code --->' +statusCode); //Validate the status code using Assert class Assert.assertEquals(statusCode, response_Status_Code_200,'Status is 200'); /*2.Fetch the JSON String, use EntityUtils class and call to String method where we have to pass entity and format entity is available in closeableHttpResponse and pass UTF-8 format because we want a pure string. So complete JSON will be stored in a String, so we need to convert an entire string into a JSON object */ String responseString = EntityUtils.toString(closeableHttpResponse.getEntity(), 'UTF-8'); /* From JSON library, call JSON class and pass the response string. This JSON object converts the string to JSON */ JSONObject responseJson = new JSONObject(responseString); System.out.println('Response JSONfrom API --->'+responseJson);}
Production
# 4) Supprimer l'appel
L'opération de suppression d'appel est simple, c'est-à-dire supprimez l'identifiant de compte 100 et transmettez les informations dans un fichier JSON.
Dans la classe restClient.java,
(je) Créer une méthode de suppression, qui appellera l'URL et supprimera l'enregistrement.
public CloseableHttpResponse Delete(String url) throws ClientProtocolException, IOException{ /*Call HTTPClients class from HTTPClient library added in POM.xml and createDefault() method present in HTTPClients class, which will create a client connection and this createDefault() method returns 'CloseableHttpClient' object which is an abstract class and we are creating reference to that abstract class */ CloseableHttpClient httpClient=HttpClients.createDefault(); /*create an object for HttpDelete class, which is used for HTTP Delete Request, and pass the URL to be loaded*/ HttpDelete htttpDelete = new HttpDelete(url); //execute Delete request CloseableHttpResponse closeableHttpResponse =httpClient.execute(htttpDelete); return closeableHttpResponse; }
(ii) Créez la classe principale «deleteAPI_Test.java» sous «src / test / java».
public class deleteAPI_Test extends testBase { //Create global methods testBase testbase; String serviceURL; String deleteuserUrl; String URL; restClient restClient; HttpResponse closeableHttpResponse; // In before method call the properties file @BeforeMethod public void setUp() throws ClientProtocolException, IOException, JSONException{ //call the constructor of the base class and execute the properties file testbase = new testBase(); serviceURL = prop.getProperty('URL'); deleteuserUrl = prop.getProperty('deleteuser'); URL = serviceURL+deleteuserUrl; } //The Main method which calls the Delete method @Test public void deleteAPI() throws ClientProtocolException, IOException, JSONException{ restClient = new restClient(); //Method returns closeableHttpResponse type closeableHttpResponse = restClient.Delete(URL); /*fetch status code, header, JSON response from CloseableHttpResponse -Fetch Status Code */ int statusCode = closeableHttpResponse.getStatusLine().getStatusCode(); System.out.println('Status Code --->' +statusCode); //Validate the status code using Assert class Assert.assertEquals(statusCode, response_Status_Code_204,'Status is 204 No Content'); }
Production
Avant de valider une réponse, obtenez l'URL correcte du développeur, puis vérifiez si vous obtenez la réponse attendue du serveur, préparez des cas de test pour chaque scénario et organisez les cas de test en séquence avec les fonctionnalités.
Conclusion
Dans cet article, nous avons expliqué comment utiliser Apache HTTP Client pour automatiser les appels POST, PUT, GET et Delete en détail avec des exemples de code. Nous avons également discuté des types de services Web et de l'importance des fichiers JSON / XML et pourquoi ils sont utilisés.
Tutoriel PREV | PREMIER Tutoriel
lecture recommandée
- Tutoriel sur les services Web: composants, architecture, types et exemples
- 15+ Tutoriels SoapUI: Le meilleur outil de test d'API de services Web
- Questions et réponses d'entretien chez Amazon Web Services (AWS)
- Top 20 des questions et réponses d'entrevue sur les services Web RESTful
- Top 25 des questions et réponses d'entretien sur les services Web Java
- Top 45 des questions et réponses d'entretien des services Web (RESTful, SOAP, questions de sécurité)
- Test des performances des services Web à l'aide du script LoadRunner VuGen
- Tutoriel de test d'API: un guide complet pour les débutants