Dans mon précédent article, nous avons vu comment créer des tests d’API avec Postman. Mais un test, même s’il est très bien conçu, n’est vraiment utile que s’il est exécuté automatiquement par l’usine de build. Au travers de ce tutoriel, nous allons donc voir dans cet article comment mettre en place cette automatisation.

Si Postman est un formidable outil pour tester nos requêtes, nous allons utiliser un autre outil pour les automatiser : il s’agit de Newman. En effet, Newman est un petit utilitaire en ligne de commande qui permet d’exécuter des collections Postman.

 

Etape 1 – Préparation des tests

 

Pour être efficace, nos scénarios de test doivent être le plus paramétrés possible. Par exemple, pour une requête de ce type :

POST https://localhost:44317/api/Team/5

Il serait plus judicieux d’utiliser des variables :

POST {{ApiServer}}/api/Team/{{gameId}}

 

Ici, “ApiServer" est une variable d’environnement et “gameId", une variable de collection, remplie par la requête précédente :

Extraction des résultats d'une requête

Extraction des résultats d’une requête

 

Attention, si vous n’utilisez pas la syntaxe spécifique pour les tests, Newman ne générera aucun résultat :

Test du résultat de requête

Test du résultat de requête

Par ailleurs, comme on n’est pas chez les sauvages, quelques petites requêtes de ménage en fin de collection sont de mises.

 

Etape 2 – Exportation des collections

 

Un fois que notre collection fonctionne correctement, nous allons l’exporter pour automatiser les tests :

Menu de collection

Menu de collection

 

Exportation de collection

Exportation de collection

 

Pendant qu’on y est, exportons également les variables d’environnement :

Exportation des variable d'environnement

Exportation des variable d’environnement

 

Nous recevons alors 2 fichiers json avec respectivement les requêtes et les variables d’environnement utilisées par ces requêtes. Placez-les dans votre gestionnaire de version préféré.

Cette exportation vous permet également d’avoir une sauvegarde de vos requêtes. Cela est particulièrement utile si vous utilisez la fonctionnalité de travail en équipe de Postman sans licence payante. En effet, Postman à la fâcheuse manie d’archiver vos requêtes au moment le moins opportun et vous ne pourrez les retrouver qu’en payant votre obole.

 

Etape 3 – Test en local

 

Muni de ces fichiers, nous allons pouvoir « tester nos tests » hors de Postman. Pour cela, nous aurons besoin de Newman, le runner de tests Postman. Newman est une application tournant sous “npm”, donc, si ce n’est pas encore le cas, installez Node.js + npm au préalable et installez newman :

npm i -g newman

 

Une fois installé, on lance un test sur une collection :

newman run <myCollection.json> -e <myEnvironment.json>

 

On obtient alors le résultat suivant (en rouge, une indication de l’élément affiché):


Create a Team Nom de la collection
→ Login Nom de la requête
POST https://localhost:44317/api/Account/Login [200 OK, 1.63KB, 180ms]
→ Create game
Verbe + requête                          Résultat de la requête
POST https://localhost:44317/api/Game/ [201 Created, 646B, 4.8s]
→ Create team
POST https://localhost:44317/api/Team/5 [201 Created, 510B, 1411ms]
→ Add User
POST https://localhost:44317/api/Team/AddPlayer/1 [200 OK, 951B, 328ms]
→ Cleanup Game
DELETE https://localhost:44317/api/Game/5 [200 OK, 135B, 249ms]
→ Cleanup Team
DELETE https://localhost:44317/api/Team/1 [200 OK, 135B, 237ms]
┌─────────────────────────┬─────────────────────┬─────────────────────┐
│                         │            executed │              failed │
├─────────────────────────┼─────────────────────┼─────────────────────┤
│              iterations │                   1 │                   0 │
├─────────────────────────┼─────────────────────┼─────────────────────┤
│                requests │                   6 │                   0 │
├─────────────────────────┼─────────────────────┼─────────────────────┤
│            test-scripts │                  10 │                   0 │
├─────────────────────────┼─────────────────────┼─────────────────────┤
│      prerequest-scripts │                   6 │                   0 │
├─────────────────────────┼─────────────────────┼─────────────────────┤
│              assertions │                   0 │                   0 │
├─────────────────────────┴─────────────────────┴─────────────────────┤
│ total run duration: 7.4s                                            │
├─────────────────────────────────────────────────────────────────────┤
│ total data received: 2.02KB (approx)                                │
├─────────────────────────────────────────────────────────────────────┤
│ average response time: 1195ms [min: 180ms, max: 4.8s, s.d.: 1652ms] │
└─────────────────────────────────────────────────────────────────────┘

Penchons-nous sur les 2 résultats de la commande :

  • Le résultat individuel de chaque requête,
  • Le résultat global avec notamment le temps d’exécution (très pratique pour effectuer des tests de performance dans le temps).

De nombreuses options existent sur Newman. Cependant, il est probable, dans le cadre d’appels https avec des certificats auto signés d’avoir une erreur de ce type :

unable to verify the first certificate

L’option --insecure permet d’outrepasser le contrôle.

 

Etape 4 – Création de build de test

 

Une fois que nos tests fonctionnent en local, il est temps de les exécuter automatiquement, potentiellement à chaque build. Nous utiliserons Azure DevOps pour cette build. Le fonctionnement est similaire pour d’autres usine de build, comme TeamCity par exemple.

 

Création de la pipeline

Rien de particulier ici, on crée une pipeline basée sur le système de gestion de sources. Il est toutefois conseillé de partir sur des sources fraîches à chaque build :

Installation de Postman

Par défaut, Newman n’est pas installé dans Azure DevOps, mais Npm l’est. La première tache sera donc de l’installer :

npm install -g newman

Utilisation de Newman

Cette tâche va procéder aux tests des API.

On s’inspire de la ligne de commande utilisée en local :

newman run <myCollection.json> -e <myEnvironment.json> --reporters cli,junit --reporter-junit-export Results\junitReport.xml

 

Attention de bien spécifier le Working Directory pour que Newman puisse accéder aux fichiers.

Les paramètres en plus spécifient le format et le fichier de sortie des résultats de tests en vue d’une exploitation ultérieure par la tâche de publication (cf. plus bas).

 

Publication des résultats de test

Pour être publiés au niveau des résultats de la pipeline, le fichier de résultat généré par Newman doit être fournis à une tâche de type Publish Test Result :

Publication des résulats de test

Publication des résulats de test

 

La build, une fois exécutée donnera le résultat des tests dans l’onglet réservé aux tests :

Résulat d'un build

Résulat d’un build

 

Etape 5 – Création des scénarios

 

La création de scénarios peut être assez fastidieuse et nécessite des connaissances techniques. Pour faciliter l’écriture des scénarios, un plugin Chrome permet l’enregistrement des requêtes effectuées (par exemple depuis un front-end Angular) dans une collection dédiée.

Configuration du plugin dans Chrome

Configuration du plugin dans Chrome

 

Configuration dans Postman

Configuration dans Postman (cliquez sur le bouton de l’antenne parabolique pour y accéder)

Une fois le plugin téléchargé et connecté à Postman, toutes les requêtes émises par Chrome qui respectent les filtres éventuels seront copiées dans Postman. Dans notre exemple, seules les requêtes comprenant « exemple » et de type POST, PUT, PATCH ou DELETE seront prises en compte.

Si le plugin facilite l’écriture des scénarios (un utilisateur non technique peut les enregistrer facilement), il ne remplace pas le travail du développeur pour variabiliser les requêtes ou éliminer celles qui sont inutiles.

 

Pour conclure

 

Nous venons de voir l’automatisation basique de tests d’API REST, mais l’outil Postman/Newman permet d’aller beaucoup plus loin. En effet, il permet le :

  • Passage de fichier de données pour personnaliser les tests d’un run à l’autre,
  • Faire des tests de charge en exécutant chaque collection un nombre défini de fois,
  • Appeler des API lors du déclenchement d’un trigger,
  • Etc.

A vous de jouer pour augmenter la qualité de vos applications !