Bruno : le client API qui stocke vos collections dans des fichiers

Postman et Hoppscotch stockent vos collections dans le cloud ou dans localStorage. Bruno fait un choix radicalement différent : chaque collection est un dossier sur votre disque, chaque requête est un fichier texte. Vous les versionnez avec git, vous les partagez comme du code.

Ce que fait Bruno

Bruno est un client API desktop (macOS, Windows, Linux) qui remplace Postman pour tester des APIs REST, GraphQL et SOAP. Sa différence fondamentale : les collections ne vivent pas dans un compte cloud. Elles sont des dossiers sur votre système de fichiers, dans un format appelé Bru.

mon-projet/
├── bruno/
│   ├── environments/
│   │   ├── dev.bru
│   │   └── prod.bru
│   ├── auth/
│   │   ├── login.bru
│   │   └── refresh-token.bru
│   └── users/
│       ├── get-users.bru
│       └── create-user.bru

Ce dossier bruno/ vit dans votre dépôt git. Chaque développeur a les mêmes requêtes, à jour, sans synchronisation manuelle.

Installation

Téléchargez l’installeur depuis usebruno.com ou via les gestionnaires de paquets :

# macOS
brew install bruno

# Windows (Winget)
winget install Bruno.Bruno

# Linux (AppImage ou .deb disponibles sur le site)

Le format Bru

Chaque requête est un fichier .bru lisible et modifiable à la main :

meta {
  name: Get Users
  type: http
  seq: 1
}

get {
  url: {{BASE_URL}}/users
  body: none
  auth: bearer
}

auth:bearer {
  token: {{TOKEN}}
}

headers {
  Accept: application/json
}

Ce format texte est conçu pour être diffable dans git. Quand une requête change, git diff montre exactement ce qui a changé — URL, headers, body, scripts.

Variables d’environnement

Bruno gère les environnements dans des fichiers .bru séparés :

# environments/dev.bru
vars {
  BASE_URL: http://localhost:3000
  TOKEN: eyJhbGc...
}

# environments/prod.bru
vars {
  BASE_URL: https://api.exemple.com
  TOKEN: {{SECRET}}  # Variable secrète non versionnée
}

Distinction importante : les variables “secrètes” (mots de passe, tokens) sont marquées comme telles et ne sont pas écrites dans les fichiers — elles restent en mémoire uniquement. Vous versionez la structure des variables, pas les valeurs sensibles.

Scripts pre/post requête

Bruno supporte les scripts JavaScript avant et après chaque requête :

// Script pre-request (onglet Script > Pre Request)
const token = bru.getEnvVar("TOKEN");
if (!token) {
  throw new Error("TOKEN manquant dans l'environnement");
}

// Script post-response
const data = res.getBody();
bru.setEnvVar("USER_ID", data.id);
// La variable USER_ID est maintenant disponible dans les requêtes suivantes

Tests automatisés

// Onglet Tests
test("Status 200", function() {
  expect(res.getStatus()).to.equal(200);
});

test("Body contient un id", function() {
  const body = res.getBody();
  expect(body).to.have.property("id");
  expect(body.id).to.be.a("number");
});

test("Temps de réponse < 500ms", function() {
  expect(res.getResponseTime()).to.be.below(500);
});

Exécution en CLI (CI/CD)

Bruno fournit une CLI pour exécuter les collections en dehors de l’interface graphique :

# Installer la CLI
npm install -g @usebruno/cli

# Exécuter une collection complète
bru run --env dev

# Exécuter un dossier spécifique
bru run auth/ --env staging

# Exécuter en CI avec sortie JUnit
bru run --env prod --reporter junit > results.xml

Intégration dans un pipeline GitLab CI :

api-tests:
  stage: test
  script:
    - npm install -g @usebruno/cli
    - bru run --env staging
  artifacts:
    reports:
      junit: results.xml

Import depuis Postman

Bruno importe les collections Postman v2.1 directement depuis l’interface :

File → Import Collection → Postman Collection v2.1

Les requêtes, dossiers, variables et scripts pre/post sont convertis automatiquement.

Workflow en équipe

Le workflow typique avec Bruno en équipe :

# 1. Les collections sont dans le repo
git clone git@gitlab.com:mon-org/mon-api.git

# 2. Ouvrir la collection Bruno
# File > Open Collection > /chemin/vers/mon-api/bruno/

# 3. Ajouter une requête → le fichier .bru est créé
# 4. Commiter comme du code
git add bruno/users/delete-user.bru
git commit -m "feat: ajouter requête DELETE /users/:id"

# 5. Les collègues récupèrent la requête avec git pull

+ Les points forts

  • Collections versionnables — les fichiers .bru dans git, c’est la fin des collections perdues ou désynchronisées entre collègues
  • Pas de compte requis — aucun cloud, aucune inscription, les données ne quittent pas votre machine
  • Format lisible — le format Bru est du texte structuré, lisible et modifiable sans l’application
  • CLI intégrée — exécuter les collections en CI/CD sans interface graphique
  • Secrets protégés — les variables sensibles ne sont jamais écrites sur le disque
  • Open source — code disponible sur GitHub, pas de lock-in commercial

- Les points faibles

  • Pas de version web — Bruno est une application desktop uniquement. Pas d’accès depuis un navigateur ou un serveur distant (contrairement à Hoppscotch)
  • Format propriétaire — le format .bru est spécifique à Bruno. Si vous arrêtez d’utiliser Bruno, les fichiers restent lisibles mais nécessitent une conversion pour d’autres outils
  • Moins mature que Postman — certaines fonctionnalités de Postman (mock servers, monitoring, documentation auto-générée) sont absentes ou en développement
  • Partage d’environnements complets — partager les valeurs de variables (hors secrets) entre collègues nécessite une communication manuelle ou un fichier .env supplémentaire

Bruno vs Postman vs Hoppscotch

BrunoPostmanHoppscotch
StockageFichiers sur disqueCloudLocalStorage / Cloud
Git-friendly✅ natif
InstallationApp desktopApp desktopNavigateur
CLI / CI✅ (payant)Partiel
Auto-hébergementN/A (local)
Open source
PrixGratuitGratuit limitéGratuit

En résumé

Bruno résout un problème que Postman et Hoppscotch ignorent : comment partager et versionner des collections API comme du code. Si votre équipe travaille avec git, Bruno s’intègre naturellement dans le workflow. Les collections vivent dans le repo, évoluent avec le code, et n’ont jamais besoin d’être “exportées” ou “synchronisées”.


Voir aussi :

  • Hoppscotch — client API léger dans le navigateur sans installation
  • HTTPie — tester rapidement des APIs en ligne de commande
  • jq — transformer les réponses JSON depuis le terminal