Qu'est-ce que REST?
REST signifie «REpresentational State Transfer», qui est un nouveau moyen de communication entre deux systèmes à un moment donné. L'un des systèmes s'appelle «REST Client» et l'autre «REST Server».
Dans ce didacticiel REST, vous apprendrez:
- Qu'est-ce que REST?
- Qu'est-ce que le client REST?
- Qu'est-ce que le serveur REST?
- Qu'est-ce que Restito?
- Comment tester le client REST avec Restito?
- Avantages de l'utilisation de Restito Framework pour les tests de clients REST
- Inconvénients de l'utilisation de Restito Framework pour les tests de clients REST
Avant de découvrir Restito Framework pour les tests de clients REST, commençons par apprendre quelques notions de base.
Qu'est-ce que le client REST?
Le client REST est une méthode ou un outil pour appeler une API de service REST qui est exposée pour la communication par n'importe quel système ou fournisseur de services. Par exemple: si une API est exposée pour obtenir des informations de trafic en temps réel sur un itinéraire de Google, le logiciel / outil qui invoque l'API de trafic de Google s'appelle le client REST.
Qu'est-ce que le serveur REST?
C'est une méthode ou une API qui est exposée à la communication par tout système ou fournisseur de services. Par exemple, Google expose une API pour obtenir des informations de trafic en temps réel sur un itinéraire donné.
Ici, le serveur Google doit être opérationnel pour écouter toutes les requêtes adressées à l'API exposée de différents clients.
Exemple:
Il est temps d'établir un scénario de bout en bout complet à partir des définitions ci-dessus.
Considérons une application de réservation de taxi comme Uber, car une entreprise a besoin d'informations en temps réel sur la situation du trafic autour des itinéraires sur lesquels se trouve un véhicule donné.
Client de repos:
Ici, le client est une application mobile Uber à laquelle le conducteur s'est connecté. Cette application envoie une requête à l'API REST exposée par Google Maps pour obtenir les données en temps réel. Par exemple, une requête HTTP GET.
Serveur de repos:
Dans cet exemple, Google est le fournisseur de services et l'API de Google maps répond avec les détails requis à la demande de l'application Uber.
Le client et le serveur sont tous deux également importants dans la communication REST.
Ici, nous avons implémenté des exemples pour les tests d'automatisation du client REST uniquement. Pour tester le serveur REST, reportez-vous à https://www.guru99.com/top-6-api-testing-tool.html.
Qu'est-ce que Restito?
Restito est un framework développé par Mkotsur. C'est une application légère pour vous aider à exécuter tout type de requête HTTP. Vous pouvez utiliser Restito pour tester vos API REST et rechercher des problèmes dans votre application ou votre réseau.
Comment tester le client REST avec Restito?
Divisons l'exercice en 4 étapes:
- Créez un client HTTP et une méthode pour envoyer une requête HTTP GET à n'importe quel point de terminaison de serveur. Pour l'instant, considérez que le point de terminaison est http: // localhost: 9092 / getevents.
- Démarrez un serveur Restito pour écouter et capturer les requêtes envoyées au point de terminaison 'getevents' dans localhost http: // localhost: 9092 / getevents.
- Créez une classe de test pour tester le client ci-dessus. Appelez la méthode du client HTTP 'sendGETRequest' pour lancer une requête GET à l'API 'getevents'.
- Validez l'appel HTTP GET à l'aide du framework Restito.
Laissez-nous plonger dans chacune des étapes ci-dessus.
Étape 1) Créez un client HTTP et une méthode pour envoyer une requête HTTP GET à n'importe quel point de terminaison de serveur.
========== JAVA CODE commence ===========
package com.chamlabs.restfulservices.client;import java.util.HashMap;import java.util.Map;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.HttpClientBuilder;import org.json.JSONObject;/ *** Cette classe crée un client HTTP et dispose d'une méthode pour envoyer une requête HTTP GET:* sendGETRequest (…)* /public class RestClient {/ *** Constructeur pour la classe RestClient* /public RestClient () {System.out.println ("Création du constructeur RestClient");}/ *** Méthode pour envoyer une requête GET à http: // localhost: <> / getevents* @param port* @return true si la demande GET est envoyée avec succès. Faux, sinon.* /public static boolean sendGETRequest (int port) {essayer {Client HttpClient = HttpClientBuilder.create (). Build ();HttpGet getRequest = new HttpGet ("http: // localhost: + port + "/ getevents");// Réponse HttpResponse = client.execute (demande);client.execute (getRequest);System.out.println ("La requête HTTP est envoyée avec succès."+ "Retourner vrai");retourne vrai;}catch (Exception e) {e.printStackTrace ();}System.out.println ("Une exception s'est produite lors de la création du client HTTP."+ "Retour faux");retourne faux;}}
========== Fin du CODE JAVA ===========
Étape 2) Démarrez un serveur Restito pour écouter et capturer les requêtes envoyées au point de terminaison 'getevents' dans localhost http: // localhost: 9092 / getevents.
========== JAVA CODE commence ===========
package com.chamlabs.restfultesting.util;import statique com.xebialabs.restito.builder.stub.StubHttp.whenHttp;import statique com.xebialabs.restito.semantics.Action.status;import static com.xebialabs.restito.semantics.Condition.get;import static com.xebialabs.restito.semantics.Condition.post;import java.util.List;import org.glassfish.grizzly.http.util.HttpStatus;import com.xebialabs.restito.semantics.Call;import com.xebialabs.restito.server.StubServer;/ *** Cette classe utilitaire contient plusieurs méthodes utilitaires telles que:* restartRestitoServerForGETRequests (…)* restartRestitoServerForPOSTRequests (…)* waitAndGetCallList (…)** @auteur cham6* @email: [email protected]* @fork: https://github.com/cham6/restfultesting.git** /public class TestUtil {/ *** Méthode utilitaire pour démarrer le serveur stub restito pour accepter les demandes GET* serveur @param* @param port* Statut @param* /public static void restartRestitoServerForGETRequests (serveur StubServer, port int, état HttpStatus){// Tuez le serveur restitoif (serveur! = null) {server.stop ();}// Initialise et configure une instance plus récente du serveur stubserveur = nouveau StubServer (port) .run ();whenHttp (serveur) .match (get ("/ getevents")). then (status (status));}/ *** Méthode utilitaire pour démarrer le serveur stub restito pour accepter les demandes POST* serveur @param* @param port* Statut @param* /public static void restartRestitoServerForPOSTRequests (serveur StubServer, port int, état HttpStatus){// Tuez le serveur restitoif (serveur! = null) {server.stop ();}// Initialise et configure une instance plus récente du serveur stubserveur = nouveau StubServer (port) .run ();whenHttp (serveur) .match (post ("/ postevents")). then (status (status));}/ *** Pour un serveur stub restito donné, bouclez pendant le nombre de secondes donné et* interrompre et renvoyer la liste d'appels du serveur.** serveur @param* @param waitTimeInSeconds* @revenir* @throws InterruptedException* /Liste statique publiquewaitAndGetCallList (serveur StubServer, int waitTimeInSeconds)lance InterruptedException{int timeoutCount = 0;List callList = server.getCalls ();while (callList.isEmpty ()) {Thread.sleep (1000);timeoutCount ++;if (timeoutCount> = waitTimeInSeconds) {Pause;}callList = server.getCalls ();}// Attendez 2 secondes pour obtenir tous les appels dans callList pour éliminer toute falkyness.Thread.sleep (2000);return server.getCalls ();}}
========== Fin du CODE JAVA ===========
Étape 3) Créez une classe de test pour tester le client ci-dessus. Appelez la méthode sendGETRequest du client HTTP pour lancer une requête GET à l'API «getevents».
========== JAVA CODE commence ===========
import junit.framework.TestCase;import com.chamlabs.restfulservices.client.RestClient;import com.chamlabs.restfultesting.util.TestUtil;import com.xebialabs.restito.semantics.Call;import com.xebialabs.restito.server.StubServer;import statique org.glassfish.grizzly.http.util.HttpStatus.ACCEPTED_202;import org.json.JSONObject;import java.util.List;import java.util.Map;/ *** Cette classe contient plusieurs tests junit pour valider les opérations RestClient comme:* envoyer une demande(… )* sendRequestWithCustomHeaders (…)* sendPOSTRequestWithJSONBody (…)** /La classe publique RestClientTester étend TestCase {Entier final statique privé PORT = 9098;Entier final statique privé PORT2 = 9099;Entier final statique privé PORT3 = 9097;public RestClientTester () {System.out.println ("Démarrage du test RestClientTester");}/ *** Test Junit pour valider la requête GET de RestClient* Pas:* 1) Créez un serveur stub à l'aide du framework Restito et configurez-le pour écouter sur un port donné* 2) Appelez la méthode sendGETRequest (…) de RestClient* 3) Restito capture les requêtes GET correspondantes envoyées, le cas échéant.* 4) Validez si Restito a capturé des requêtes GET sur un point de terminaison donné* Comportement prévisible:*> Restito doit avoir capturé la requête GET et il ne doit avoir capturé qu'une seule requête GET.* Pour terminer:*> Arrêtez le serveur stub démarré en utilisant restito.* /public void testGETRequestFromClient () {Serveur StubServer = null;essayer {// Cela démarrera le serveur stub sur 'PORT' et répondra avec HTTP 202 'ACCEPTED_202'TestUtil.restartRestitoServerForGETRequests (serveur, PORT, ACCEPTED_202);RestClient.sendGETRequest (PORT);ListcallList = TestUtil.waitAndGetCallList (serveur, 30);assertTrue ("La requête GET n'est pas reçue du RestClient. Le test a échoué.",(callList! = null) && (callList.size () == 1));}catch (Exception e) {e.printStackTrace ();échec ("Le test a échoué en raison d'une exception: + e);}finalement {if (serveur! = null) {server.stop ();}}}
========== Fin du CODE JAVA ===========
Étape 4) Comment valider la demande GET avec les en-têtes et la demande POST avec le corps à l'aide du framework Restito.
========== JAVA CODE commence ===========
/ *** Test Junit pour valider la requête GET avec les en-têtes de RestClient* Pas:* 1) Créez un serveur stub à l'aide du framework Restito et configurez-le pour écouter sur un port donné* 2) Appelez la méthode sendGETRequestWithCustomHeaders (…) de RestClient* 3) Restito capture les requêtes GET correspondantes envoyées, le cas échéant.* 4) Validez si Restito a capturé des requêtes GET sur un point de terminaison donné* Comportement prévisible:*> Restito doit avoir capturé la requête GET, et il ne doit avoir capturé qu'une seule requête GET.*> Obtenez les en-têtes de la requête GET capturée* et assurez-vous que les en-têtes correspondent à ceux configurés.* Pour terminer:*> Arrêtez le serveur stub démarré en utilisant restito.* /public void testGETRequestWithHeadersFromClient () {Serveur StubServer = null;essayer {// Cela démarrera le serveur stub sur 'PORT' et répondra avec HTTP 202 'ACCEPTED_202'TestUtil.restartRestitoServerForGETRequests (serveur, PORT2, ACCEPTED_202);RestClient.sendGETRequestWithCustomHeaders (PORT2);ListcallList = TestUtil.waitAndGetCallList (serveur, 30);assertTrue ("La requête GET n'est pas reçue du RestClient. Le test a échoué.",(callList! = null) && (callList.size () == 1));// Valide les en-têtes de la requête GET du client RESTMap > headersFromRequest = callList.get (0) .getHeaders ();assertTrue ("La requête GET contient l'en-tête Accept et sa valeur",headersFromRequest.get ("Accepter"). contains ("text / html"));assertTrue ("La requête GET contient l'autorisation d'en-tête et sa valeur",headersFromRequest.get ("Autorisation"). contains ("Bearer 1234567890qwertyuiop"));assertTrue ("La requête GET contient l'en-tête Cache-Control et sa valeur",headersFromRequest.get ("Cache-Control"). contains ("no-cache"));assertTrue ("La requête GET contient la connexion d'en-tête et sa valeur",headersFromRequest.get ("Connection"). contains ("keep-alive"));assertTrue ("La requête GET contient l'en-tête Content-Type et sa valeur",headersFromRequest.get ("Content-Type"). contains ("application / json"));}catch (Exception e) {e.printStackTrace ();échec ("Le test a échoué en raison d'une exception: + e);}finalement {if (serveur! = null) {server.stop ();}}}
/ *** Test Junit pour valider la requête POST avec le corps et les en-têtes de RestClient* Pas:* 1) Créez un serveur stub à l'aide du framework Restito et configurez-le pour écouter sur un port donné* 2) Appelez la méthode sendPOSTRequestWithJSONBody (…) de RestClient* 3) Restito capture les requêtes POST correspondantes envoyées, le cas échéant.* 4) Validez si Restito a capturé des requêtes POST sur un point final donné* Comportement prévisible:*> Restito doit avoir capturé la requête POST et il ne doit avoir capturé qu'une seule requête POST.*> Récupérez le corps de la requête POST capturée et validez les valeurs JSON* Pour terminer:*> Arrêtez le serveur stub démarré en utilisant restito.* /public void testPOSTRequestWithJSONBody () {Serveur StubServer = null;essayer {// Cela démarrera le serveur stub sur 'PORT' et répondra avec HTTP 202 'ACCEPTED_202'TestUtil.restartRestitoServerForPOSTRequests (serveur, PORT3, ACCEPTED_202);RestClient.sendPOSTRequestWithJSONBody (PORT3);ListcallList = TestUtil.waitAndGetCallList (serveur, 30);assertTrue ("La demande POST n'est pas reçue du RestClient. Le test a échoué.",(callList! = null) && (callList.size () == 1));// Valide les en-têtes de la requête GET du client RESTString requestBody = callList.get (0) .getPostBody ();JSONObject postRequestJSON = nouveau JSONObject (requestBody);assertTrue ("Le timeUpdated dans json est incorrect",postRequestJSON.get ("timeUpdated"). toString (). equalsIgnoreCase ("1535703838478"));assertTrue ("Le jeton d'accès dans json est incorrect",postRequestJSON.get ("jeton d'accès"). toString ().equalsIgnoreCase ("abf8714d-73a3-42ab-9df8-d13fcb92a1d8"));assertTrue ("Le jeton refresh_token dans json est incorrect",postRequestJSON.get ("refresh_token"). toString ().equalsIgnoreCase ("d5a5ab08-c200-421d-ad46-2e89c2f566f5"));assertTrue ("Le token_type dans json est incorrect",postRequestJSON.get ("token_type"). toString (). equalsIgnoreCase ("porteur"));assertTrue ("Le expires_in dans json est incorrect",postRequestJSON.get ("expires_in"). toString (). equalsIgnoreCase ("1024"));assertTrue ("La portée dans json est incorrecte",postRequestJSON.get ("portée"). toString (). equalsIgnoreCase (""));}catch (Exception e) {e.printStackTrace ();échec ("Le test a échoué en raison d'une exception: + e);}finalement {if (serveur! = null) {server.stop ();}}}}
========== Fin du CODE JAVA ===========
Avantages de l'utilisation de Restito Framework pour les tests de clients REST
Voici les avantages / avantages de Restito Framework pour les tests de clients ReST
- Nous n'avons pas besoin que le serveur REST réel soit développé pour tester le client REST.
- Restito fournit des utilitaires et des méthodes puissants et variés pour simuler différents comportements d'un serveur. Par exemple: pour tester le comportement du client REST lorsque le serveur répond avec une erreur HTTP 404 ou une erreur HTTP 503.
- Les serveurs Restito peuvent être configurés en quelques millisecondes et peuvent être arrêtés une fois les tests terminés.
- Restito prend en charge tous les types de contenus de méthode HTTP tels que compressé, non compressé, unifié, application / texte, application / JSON, etc.
Inconvénients de l'utilisation de Restito Framework pour les tests de clients REST
Voici les inconvénients / inconvénients de Restito Framework pour les tests du client ReST
- La source du client REST doit être modifiée pour considérer «localhost» comme une machine serveur.
- L'ouverture du serveur dans n'importe quel port peut entrer en conflit si nous utilisons un port couramment utilisé comme '8080' ou '9443', etc.
- Il est conseillé d'utiliser des ports comme 9092 ou 9099, qui ne sont pas couramment utilisés par d'autres outils.
Résumé:
- REST signifie "REpresentational State Transfer" qui est un nouveau moyen standard de communication entre deux systèmes à un moment donné.
- Le client REST est une méthode ou un outil pour appeler une API de service REST qui est exposée à la communication par n'importe quel système ou fournisseur de services.
- Dans la méthode RestServer ou une API qui est exposée pour la communication par tout système ou fournisseur de services.
- Restito est une application légère pour vous aider à exécuter tout type de requête HTTP
- Créez un client HTTP et une méthode pour envoyer une requête HTTP GET à n'importe quel point de terminaison de serveur
- Démarrez un serveur Restito pour écouter et capturer les requêtes envoyées au point de terminaison «getevents».
- Démarrez un serveur Restito pour écouter et capturer les requêtes envoyées au point de terminaison 'getevents' dans localhost
- Ici, nous avons implémenté des exemples pour les tests d'automatisation du client REST uniquement.
- Nous n'avons pas besoin que le serveur REST réel soit développé pour tester le client REST.
- La source du client REST doit être modifiée pour considérer «localhost» comme une machine serveur.
Cet article est contribué par Chandrasekhar Muttineni