Simuler les services API en développement et en test avec WireMock
Pendant le développement local et les tests, il est assez courant de rencontrer des situations où votre application dépend d'API distantes. Les problèmes de réseau, les limites de débit ou même les temps d'arrêt du fournisseur d'API peuvent freiner votre progression. Cela peut considérablement nuire à votre productivité et rendre les tests plus difficiles. C'est là que WireMock entre en jeu.
WireMock est un outil open source qui aide les développeurs à créer un serveur fictif qui simule le comportement de véritables API, offrant un environnement contrôlé pour le développement et les tests.
Imaginez que vous ayez à la fois une API et une application frontale, et que vous souhaitiez tester comment le frontal interagit avec l'API. En utilisant WireMock, vous pouvez configurer un serveur fictif pour simuler les réponses de l'API, ce qui vous permet de tester le comportement du frontal sans dépendre de l'API réelle. Cela peut être particulièrement utile lorsque l'API est encore en cours de développement ou lorsque vous souhaitez tester différents scénarios sans affecter l'API réelle. WireMock prend en charge les protocoles HTTP et HTTPS et peut simuler divers scénarios de réponse, notamment des retards, des erreurs et différents codes d'état HTTP.
Dans ce guide, vous apprendrez à :
- Utiliser Docker pour lancer un conteneur WireMock.
- Utiliser des données fictives dans le développement local sans dépendre d'une API externe
- Utiliser une API en direct en production pour récupérer des données météorologiques en temps réel d'AccuWeather.
Utiliser WireMock avec Docker
L'image Docker officielle pour WireMock offre un moyen pratique de déployer et de gérer les instances de WireMock. WireMock est disponible pour diverses architectures de processeur, notamment amd64, armv7 et armv8, garantissant la compatibilité avec différents appareils et plates-formes. Vous pouvez en savoir plus sur WireMock autonome sur le site de documentation de WireMock.
Prérequis
Les prérequis suivants sont nécessaires pour suivre ce guide pratique :
Lancement de WireMock
Lancez une démonstration rapide de WireMock en suivant les étapes suivantes :
-
Clonez le dépôt GitHub localement.
$ git clone https://github.com/dockersamples/wiremock-node-docker
-
Accédez au répertoire
wiremock-endpoint
$ cd wiremock-node-docker/
WireMock agit comme l'API fictive avec laquelle votre backend communiquera pour récupérer des données. Les réponses de l'API fictive ont déjà été créées pour vous dans le répertoire des mappages.
-
Démarrez la pile Compose en exécutant la commande suivante à la racine du répertoire du projet cloné
$ docker compose up -d
Après un moment, l'application sera opérationnelle.
Vous pouvez vérifier les journaux en sélectionnant le conteneur
wiremock-node-docker
: -
Testez l'API fictive.
$ curl http://localhost:8080/api/v1/getWeather\?city\=Bengaluru
Il renverra la réponse prédéfinie suivante avec des données fictives :
{"city":"Bengaluru","temperature":27.1,"conditions":"Mostly cloudy","forecasts":[{"date":"2024-09-02T07:00:00+05:30","temperature":83,"conditions":"Partly sunny w/ t-storms"},{"date":"2024-09-03T07:00:00+05:30","temperature":83,"conditions":"Thunderstorms"},{"date":"2024-09-04T07:00:00+05:30","temperature":83,"conditions":"Intermittent clouds"},{"date":"2024-09-05T07:00:00+05:30","temperature":82,"conditions":"Dreary"},{"date":"2024-09-06T07:00:00+05:30","temperature":82,"conditions":"Dreary"}]}
Avec WireMock, vous définissez des réponses prédéfinies à l'aide de fichiers de mappage. Pour cette demande, les données fictives sont définies dans le fichier JSON à l'adresse
wiremock-endpoint/mappings/getWeather/getWeatherBengaluru.json
.Pour plus d'informations sur la simulation de réponses prédéfinies, reportez-vous à la documentation de WireMock.
Utiliser WireMock en développement
Maintenant que vous avez essayé WireMock, utilisons-le en développement et en test. Dans cet exemple, vous utiliserez une application exemple qui a un backend Node.js. Cette pile d'applications a la configuration suivante :
- Environnement de développement local : le contexte dans lequel le backend Node.js et WireMock s'exécutent.
- Backend Node.js : représente l'application backend qui gère les requêtes HTTP.
- API externe AccuWeather : la véritable API à partir de laquelle les données météorologiques en direct sont extraites.
- WireMock : le serveur fictif qui simule les réponses de l'API pendant les tests. Il s'exécute en tant que conteneur Docker.


- En développement, le backend Node.js envoie une requête à WireMock au lieu de l'API AccuWeather réelle.
- En production, il se connecte directement à l'API AccuWeather en direct pour des données réelles.
Utiliser des données fictives en développement local
Configurons une application Node pour envoyer des requêtes au conteneur WireMock au lieu de l'API AccuWeather réelle.
Prérequis
- Installez Node.js et npm
- Assurez-vous que le conteneur WireMock est opérationnel (voir Lancement de WireMock
Suivez les étapes pour configurer une application Node non conteneurisée :
-
Accédez au répertoire
accuweather-api
Assurez-vous d'être dans le répertoire où se trouve votre fichier
package.json
. -
Définissez la variable d'environnement.
Ouvrez le fichier
.env
placé dans le répertoireaccuweather-api/
. Supprimez les anciennes entrées et assurez-vous qu'il ne contient que la seule ligne suivante.API_ENDPOINT_BASE=http://localhost:8080
Cela indiquera à votre application Node.js d'utiliser le serveur WireMock pour les appels d'API.
-
Examinez le point d'entrée de l'application
- Le fichier principal de l'application est
index.js
, situé dans le répertoireaccuweather-api/src/api
. - Ce fichier démarre le module
getWeather.js
, qui est essentiel pour votre application Node.js. Il utilise le packagedotenv
pour charger les variables d'environnement du fichier.env
. - En fonction de la valeur de
API_ENDPOINT_BASE
, l'application achemine les requêtes soit vers le serveur WireMock (http://localhost:8080
), soit vers l'API AccuWeather. Dans cette configuration, il utilise le serveur WireMock. - Le code garantit que
ACCUWEATHER_API_KEY
n'est requis que si l'application n'utilise pas WireMock, ce qui améliore l'efficacité et évite les erreurs.
require("dotenv").config(); const express = require("express"); const axios = require("axios"); const router = express.Router(); const API_ENDPOINT_BASE = process.env.API_ENDPOINT_BASE; const API_KEY = process.env.ACCUWEATHER_API_KEY; console.log('API_ENDPOINT_BASE:', API_ENDPOINT_BASE); // Journal après sa définition console.log('ACCUWEATHER_API_KEY is set:', !!API_KEY); // Journal booléen au lieu de la clé réelle if (!API_ENDPOINT_BASE) { throw new Error("API_ENDPOINT_BASE n'est pas défini dans les variables d'environnement"); } // Ne vérifiez la clé API que si vous n'utilisez pas WireMock if (API_ENDPOINT_BASE !== 'http://localhost:8080' && !API_KEY) { throw new Error("ACCUWEATHER_API_KEY n'est pas défini dans les variables d'environnement"); } // Fonction pour récupérer la clé de localisation de la ville async function fetchLocationKey(townName) { const { data: locationData } = await axios.get(`${API_ENDPOINT_BASE}/locations/v1/cities/search`, { params: { q: townName, details: false, apikey: API_KEY }, }); return locationData[0]?.Key; }
- Le fichier principal de l'application est
-
Démarrez le serveur Node
Avant de démarrer le serveur Node, assurez-vous d'avoir déjà installé les packages Node répertoriés dans le fichier package.json en exécutant
npm install
.npm install npm run start
Vous devriez voir la sortie suivante :
> [email protected] start > node src/index.js API_ENDPOINT_BASE: http://localhost:8080 .. Listening: http://localhost:5001
La sortie indique que votre application Node a démarré avec succès. Gardez cette fenêtre de terminal ouverte.
-
Testez l'API simulée
Ouvrez une nouvelle fenêtre de terminal et exécutez la commande suivante pour tester l'API simulée :
$ curl "http://localhost:5001/api/v1/getWeather?city=Bengaluru"
Vous devriez voir la sortie suivante :
{"city":"Bengaluru","temperature":27.1,"conditions":"Mostly cloudy","forecasts":[{"date":"2024-09-02T07:00:00+05:30","temperature":83,"conditions":"Partly sunny w/ t-storms"},{"date":"2024-09-03T07:00:00+05:30","temperature":83,"conditions":"Thunderstorms"},{"date":"2024-09-04T07:00:00+05:30","temperature":83,"conditions":"Intermittent clouds"},{"date":"2024-09-05T07:00:00+05:30","temperature":82,"conditions":"Dreary"},{"date":"2024-09-06T07:00:00+05:30","temperature":82,"conditions":"Dreary"}]}%
Cela indique que votre application Node.js est maintenant en cours de routage des requêtes vers le conteneur WireMock et de réception des réponses simulées
Vous avez peut-être remarqué que vous essayez d'utiliser
http://localhost:5001
comme URL au lieu du port8080
. C'est parce que votre application Node.js est en cours d'exécution sur le port5001
, et elle est routée vers le conteneur WireMock qui écoute le port8080
.TipAvant de passer à l'étape suivante, assurez-vous d'arrêter le service de l'application node.
Utiliser une API en direct en production pour récupérer des données météorologiques d'AccuWeather
Pour améliorer votre application Node.js avec des données météorologiques en temps réel, vous pouvez intégrer facilement l'API AccuWeather. Cette section du guide vous guidera tout au long des étapes impliquées dans la configuration d'une application Node.js non conteneuse et la récupération d'informations météorologiques directement à partir de l'API AccuWeather.
-
Créer une clé API AccuWeather
Inscrivez-vous pour un compte développeur gratuit AccuWeather àhttps://developer.accuweather.com/. Dans votre compte, créez une nouvelle application en sélectionnant
MY APPS
dans le menu de navigation supérieur à gauche pour obtenir votre clé API unique.AccuWeather API est une API web qui fournit des données météorologiques et des prévisions en temps réel. Les développeurs peuvent utiliser cette API pour intégrer des informations météorologiques dans leurs applications, sites web ou autres projets.
-
Changez de répertoire vers
accuweather-api
$ cd accuweather-api
-
Définissez votre clé API AccuWeather en utilisant le fichier
.env
:TipPour éviter les conflits, assurez-vous de supprimer toute variable d'environnement existante nommée
API_ENDPOINT_BASE
ouACCUWEATHER_API_KEY
avant de modifier le fichier.env
.Exécutez la commande suivante sur votre terminal :
unset API_ENDPOINT_BASE unset ACCUWEATHER_API_KEY
Il est temps de définir les variables d'environnement dans le fichier
.env
:ACCUWEATHER_API_KEY=XXXXXX API_ENDPOINT_BASE=http://dataservice.accuweather.com
Assurez-vous de remplir
ACCUWEATHER_API_KEY
avec la valeur correcte. -
Installez les dépendances
Exécutez la commande suivante pour installer les packages requis :
$ npm install
Cela installera tous les packages répertoriés dans votre fichier
package.json
. Ces packages sont essentiels pour que le projet fonctionne correctement.Si vous rencontrez des avertissements liés aux packages dépréciés, vous pouvez les ignorer pour cette démonstration.
-
Supposons que vous n'ayez pas de serveur Node préexistant en cours d'exécution sur votre système, avancez et démarrez le serveur Node en exécutant la commande suivante :
$ npm run start
Vous devriez voir la sortie suivante :
> [email protected] start > node src/index.js API_ENDPOINT_BASE: http://dataservice.accuweather.com ACCUWEATHER_API_KEY is set: true Listening: http://localhost:5001
Gardez cette fenêtre de terminal ouverte.
-
Exécutez la commande curl pour envoyer une requête GET au serveur URL.
Dans la nouvelle fenêtre de terminal, entrez la commande suivante :
$ curl "http://localhost:5000/api/v1/getWeather?city=Bengaluru"
En exécutant la commande, vous dites à votre serveur local de vous fournir des données météorologiques pour une ville nommée
Bengaluru
. La requête est spécifiquement ciblée sur le point de terminaison/api/v1/getWeather
, et vous fournissez le paramètre de requêtecity=Bengaluru
. Une fois que vous exécutez la commande, le serveur traite cette requête, récupère les données et les retourne en tant que réponse, quecurl
affichera dans votre terminal.Lors de la récupération de données à partir de l'API AccuWeather en direct, vous interagissez avec des données en direct qui reflètent les conditions météorologiques les plus récentes.
Récapitulatif
Ce guide vous a guidé à travers la configuration de WireMock à l'aide de Docker. Vous avez appris à créer des stubs pour simuler les points de terminaison d'API, vous permettant de développer et de tester votre application sans dépendre de services externes. En utilisant WireMock, vous pouvez créer des environnements de test fiables et cohérents, reproduire des cas de bordure et accélérer votre flux de travail de développement.