Tester vos APIs avec Bruno CLI dans un pipeline Azure DevOps

Publié par Armel GANNE
Catégorie : Azure / DevOps
04/06/2025

Les tests automatisés jouent un rôle central pour assurer la qualité et la fiabilité des livraisons. Pourtant, l’automatisation des tests d’APIs dans les workflows CI/CD reste un défi pour de nombreuses équipes. Le client (CLI) Bruno se présente comme une solution innovante pour simplifier cette tâche. Cet outil accessible en open-source permet d’exécuter des tests d’APIs rapidement, de manière efficace et intégrée. Dans cet article, nous allons explorer comment configurer un pipeline CI/CD dans Azure DevOps pour automatiser ces tests.

 

Importance des tests automatisés et défis des tests d’APIs

 
L’automatisation des tests est une solution intéressante pour éviter les régressions et garantir le bon fonctionnement des APIs. Voici les principaux défis qui se posent lors de l’intégration de ces tests dans un workflow CI/CD :

  • Gestion des environnements : Cela impose d’exécuter les tests sur différentes plateformes.
  • Protection des secrets : Exige de ne pas exposer les identifiants et clés d’API dans le pipeline.
  • Performance : Les tests doivent s’exécuter rapidement sans impacter la durée des pipelines.
  • Gestion des erreurs : Une bonne gestion des logs est nécessaire pour identifier rapidement les causes d’échec.

 
 

Présentation de Bruno et de Bruno CLI

 
Bruno, une alternative à Postman, est un outil open-source spécialement conçu pour tester les APIs REST. Il se distingue par sa performance et sa simplicité, offrant une expérience fluide et efficace. Son interface graphique regroupe toutes les fonctionnalités essentielles d’un client HTTP, garantissant une utilisation intuitive. De plus, grâce à son onglet Tests, il permet de définir très facilement les assertions attendues, optimisant ainsi le processus de validation des requêtes.

De plus, son principal atout réside dans la possibilité d’intégrer les requêtes directement dans le code, sous forme de fichiers stockés dans un projet. Cette approche permet un contrôle total sur les requêtes et les tests API, en facilitant leur partage, le suivi des modifications et la gestion collaborative au sein des équipes techniques, notamment grâce à une intégration naturelle avec Git.

Pour en savoir plus, voir la documentation en ligne.

 
Visuel de la page d'accueil de l'interface de Bruno

 
 

Pourquoi utiliser Bruno CLI ?

 

Bruno se distingue par sa simplicité d’utilisation, avec une syntaxe intuitive et des commandes faciles à intégrer via son CLI. En effet, il offre également une grande flexibilité en s’intégrant aisément dans des scripts PowerShell et des pipelines CI/CD, ce qui en fait un outil adapté aux workflows de développement.

Cependant, son utilisation peut nécessiter une certaine adaptation, notamment en raison de la structure spécifique de ses collections de tests, qui demande un temps d’apprentissage pour les nouveaux utilisateurs.

 
 

Architecture d’un pipeline Azure DevOps avec Bruno CLI

 
Dans Azure DevOps nous avons créé le Task Group Bruno Test (BT) qui nous permet d’exécuter des opérations d’API avec Bruno CLI. En outre, les paramètres du Task Group incluent des informations essentielles telles que l’API Key, le scope utilisé pour l’authentification, ainsi que le chemin de la racine du projet Bruno et les requêtes de test.

 
Capture d'écran du task group Bruno test
 

Voici la structuration du Task group décomposées en quatre étapes.

  1. L’extraction des secrets depuis Azure Key Vault
  2. L’installation des outils nécessaires (Node.js, Bruno CLI, etc.)
  3. L’exécution des tests avec Bruno CLI
  4. La publication des résultats dans Azure DevOps

 
 

1.Extraction des secrets avec Azure Key Vault et Azure CLI

 
La première étape consiste à récupérer les secrets stockés dans Azure Key Vault, notamment le clientID et le clientSecret, qui sont nécessaires pour authentifier les appels d’API. Pour cela, nous utilisons Azure CLI, ce qui permet d’accéder aux secrets directement en ligne de commande :

 
$Secret = az keyvault secret show --name "secret-key-name" --vault-name "key-vault-service-name" --query "value" -o tsv
 

Ensuite, une fois le secret récupéré, il est stocké dans une variable de pipeline Azure DevOps afin d’être utilisé dans les étapes suivantes :

 
Write-Host "##vso[task.setvariable variable=Secret]$Secret"
 

De même, il est important de noter que pour garantir un accès sécurisé aux secrets, il est préférable d’attribuer au Service Principal lié à Azure DevOps les droits nécessaires sur Azure Key Vault plutôt que d’exposer un Personal Access Token (PAT) en clair dans le pipeline. Cette approche permet d’éviter tout problème de permissions tout en maintenant un haut niveau de sécurité.

 
 

2. Installation des outils

 

Avant d’exécuter les tests, il est nécessaire d’installer Node.js et Bruno CLI sur l’agent d’exécution avec la commande :

 
npm install -g @usebruno/cli
 
 

3. Configuration et exécution des tests avec Bruno CLI

 

Définition des chemins et de la configuration

L’exécution sur le CLI Bruno se fait à partir de la racine du projet Bruno $path en indiquant le dossier dans lequel se trouve les opérations à tester $folder. Pour assurer le bon fonctionnement du pipeline Azure DevOps, gérez efficacement le fichier de configuration d’environnement $configFilePath et veillez à générer correctement les rapports de tests dans $destinationReport. Pour cela, nommez le fichier d’environnement en fonction de l’environnement d’exécution du pipeline $(Env_Maj), enregistré dans une bibliothèque de variables Azure DevOps.
Cela permet une configuration adaptable aux différents environnements de déploiement.
 

$folder="$(QueriesFolder)"
$path="$(ProjectPath)"
$configFilePath = "$path\environments\$(Env_Maj).bru"
$destinationReport = "$path\Results\report.xml"

 

Mise à jour dynamique du fichier de configuration <ENV>.bru

Avant d’exécuter les tests API, il est essentiel d’injecter dynamiquement les valeurs des variables récupérées dans le fichier de configuration <ENV>.bru. Ce script PowerShell automatise cette mise à jour en lisant le fichier existant, en modifiant ou en ajoutant la section vars contenant les informations nécessaires (hôte de l’API, clés d’authentification, client ID, etc.), puis en sauvegardant le fichier mis à jour.

L’approche adoptée permet de garantir la cohérence des tests en s’assurant que les valeurs utilisées correspondent aux paramètres définis dans le pipeline. De plus, si le fichier de configuration n’existe pas encore, le script génère automatiquement un fichier de base, évitant ainsi tout risque d’erreur bloquante.

Enfin, une gestion des erreurs est intégrée pour assurer la fiabilité du processus, notamment en vérifiant l’accès au fichier et en contrôlant les permissions lors de l’écriture des nouvelles valeurs. Cette méthode permet d’adapter dynamiquement la configuration sans intervention manuelle, garantissant ainsi une exécution fluide et automatisée des tests API dans les différents environnements.

 

# Lire, modifier et sauvegarder le fichier de configuration
Write-Host "Mise à jour du fichier de configuration : $configFilePath"

if (Test-Path $configFilePath) {
    # Lire le contenu existant
    $existingContent = Get-Content -Path $configFilePath -Raw
} else {
    # Si le fichier n'existe pas, créer un contenu de base
    $existingContent = ''
    Write-Warning "Le fichier de configuration '$configFilePath' n'existe pas. Un nouveau fichier sera créé."
}

# Construire la nouvelle section `vars`
$newVarsSection = @"
vars {
  apimHost: $(Common_Host_Name)
  scope: $(Scope)
  apiKeyExternal: $subscriptionValue
  client_id: $clientIdValue
  client_secret: $clientSecretValue
}
"@

# Supprimer la section `vars:secret [...]`
$updatedContent = $existingContent -replace '(?s)vars:secret\s*\[.*?\]', ''

# Rechercher et remplacer la section `vars {}` ou ajouter une nouvelle section
if ($existingContent -match '(?s)vars\s*{.*?}') {
    # Remplacer la section existante par la nouvelle
    $updatedContent = $updatedContent -replace '(?s)vars\s*{.*?}', $newVarsSection
    Write-Host "Section 'vars {}' existante remplacée dans le fichier de configuration."
} else {
    # Ajouter la section `vars {}` à la fin du fichier
    $updatedContent = $updatedContent + "`r`n" + $newVarsSection
    Write-Host "Nouvelle section 'vars {}' ajoutée au fichier de configuration."
}

# Sauvegarder le fichier
try {
    Set-Content -Path $configFilePath -Value $updatedContent -Force
    Write-Host "Fichier de configuration sauvegardé avec succès : $configFilePath"
} catch {
    Write-Error "Échec de la mise à jour du fichier de configuration. Vérifiez les permissions et le chemin."
    exit 1
}

 

Exécution des tests avec Bruno CLI

Une fois le fichier de configuration de l’environnement mis à jour, exécutez les tests avec la commande suivante en utilisant les options –output et –format pour générer le rapport au format JUnit.

 
bru run --env "$(Env_Maj)" --output "$destinationReport" --format junit $folder
 
 

4. Publication des résultats des tests dans Azure DevOps

 
Les fichiers XML contenant les résultats des tests sont publiés avec Publish Test Results depuis le chemin $destinationReport. En intégrant cette tâche au pipeline, l’équipe s’assure que les rapports de tests générés sont bien pris en compte et accessibles. Une fois cette étape ajoutée, les résultats apparaissent dans l’onglet Tests d’Azure DevOps, où chaque exécution est tracée avec des détails sur les éventuels tests échoués.

 
Capture d'écran du rendu des rapports de test dans Devops
 
 

Conclusion

 

L’intégration de Bruno dans un pipeline d’Azure DevOps apporte de réels avantages en matière de test des APIs. En automatisant ces tests, nous réduisons considérablement le temps passé sur les validations manuelles tout en garantissant une meilleure fiabilité des déploiements. L’intégration native des requêtes dans le code simplifie le versionnement et l’intègre naturellement aux workflows des développeurs.

Pour assurer un pipeline efficace et sécurisé, plusieurs bonnes pratiques sont essentielles. La gestion des secrets doit être rigoureuse : l’utilisation d’Azure Key Vault permet de sécuriser les identifiants et clés API tout en contrôlant précisément les accès. Avant toute exécution, il est aussi crucial de valider les fichiers de configuration, en testant localement les assertions et la génération des rapports afin d’anticiper d’éventuelles erreurs. Par ailleurs, comme Bruno nécessite Node.js pour fonctionner, il faut configurer correctement l’environnement d’exécution afin d’éviter tout problème lié aux dépendances. Enfin, il est essentiel de renforcer la résilience du pipeline en gérant les erreurs de manière à prévenir les blocages en cas de problème mineur.

En pratique, cette approche a montré des gains de temps significatifs, en limitant les tâches répétitives et les risques d’erreur humaine. Les tests automatisés garantissent une meilleure fiabilité sur l’ensemble des environnements de déploiement. Toutefois, certaines améliorations restent possibles, notamment sur la gestion des jeux de données, afin d’assurer des tests reproductibles avec des données stables. De même, la personnalisation des rapports, en y intégrant des métadonnées spécifiques, pourrait faciliter encore davantage l’analyse des résultats.

Adopter Bruno dans un pipeline CI/CD, c’est donc faire un pas de plus vers une automatisation robuste et performante, tout en optimisant la qualité des tests API.