DEV Community

Cover image for Pourquoi vos Collections Postman ne sont pas une Source de Vérité (et comment y remédier)
Antoine Laurent
Antoine Laurent

Posted on • Originally published at apidog.com

Pourquoi vos Collections Postman ne sont pas une Source de Vérité (et comment y remédier)

La question des collections Postman contre les spécifications OpenAPI revient dès qu’une équipe dépasse quelques développeurs. Vous ouvrez une collection écrite il y a six mois et elle décrit encore un endpoint avec trois champs requis manquants, deux paramètres obsolètes et une réponse qui ne correspond plus au serveur. Pendant ce temps, la spécification OpenAPI dans Git dit autre chose, et Swagger UI affiche encore une troisième version. Le problème n’est pas Postman : c’est l’absence d’une source de vérité unique.

Essayez Apidog aujourd’hui

Cette dérive n’est pas un échec d’outil. C’est un échec de workflow. Postman reste très utile pour exécuter des requêtes, écrire des scripts, explorer une API et lancer des tests. Le problème commence quand la collection devient le contrat d’API au lieu d’être un artefact généré depuis ce contrat.

💡 Une fois la dépendance inversée — la spécification génère la collection, et non l’inverse — la dérive devient beaucoup plus facile à contrôler. Apidog connecte ce workflow piloté par la spécification à la collaboration, au mocking, aux tests et au CI/CD, afin que l’équipe travaille depuis la même source.

Pourquoi les collections dérivent-elles ?

Une collection Postman est centrée sur les requêtes :

  1. vous envoyez une requête ;
  2. vous observez la réponse ;
  3. vous l’enregistrez ;
  4. vous ajoutez progressivement scripts, variables, assertions et dossiers.

C’est pratique pour travailler vite, mais la collection reflète souvent la manière dont l’équipe appelle l’API, pas forcément ce que l’API spécifie formellement.

Une spécification OpenAPI, elle, est centrée sur le contrat. Elle décrit les chemins, paramètres, schémas, types de réponse et erreurs dans un format lisible par machine. Les outils peuvent ensuite l’utiliser pour valider, mocker, documenter et générer du code.

OpenAPI vs Postman collection

Les deux artefacts répondent à deux questions différentes :

  • Collection Postman : « Comment appeler cet endpoint aujourd’hui ? »
  • Spécification OpenAPI : « Que doit garantir cette API ? »

Si vous maintenez les deux à la main, ils divergent. Un développeur met à jour la spec dans une PR. Un autre corrige la collection après un test cassé. Personne ne synchronise les deux. Quelques mois plus tard, vous avez deux descriptions partiellement vraies de la même API.

Inventis Korea a rencontré ce schéma : API construite, spécification OpenAPI générée pour Swagger, collection importée dans Postman pour les tests, puis effort permanent pour synchroniser trois représentations. Les tests rataient des cas limites parce que la collection ne reflétait pas tout le schéma. La documentation dérivait parce que la spécification n’était pas l’entrée des tests.

La cause : Postman n’est pas un magasin de spécifications

Les collections Postman utilisent leur propre format. Le schéma de collection Postman décrit des requêtes, scripts et hiérarchies de dossiers. Ce n’est pas OpenAPI.

Postman peut importer et exporter de l’OpenAPI, mais la conversion est imparfaite :

  • OpenAPI vers collection : certains détails de schéma ne s’expriment pas naturellement sous forme de requêtes.
  • Collection vers OpenAPI : les scripts et données propres à Postman ne deviennent pas des champs de spécification.

Ce n’est pas une critique de Postman. C’est simplement la limite du format : Postman est d’abord un exécuteur de requêtes. L’utiliser comme description canonique d’une API impose au format un rôle pour lequel il n’a pas été conçu.

Propriété Collection Postman Spécification OpenAPI
Paramètres de requête Paires clé-valeur avec description optionnelle Typés, validés, avec required et schema
Forme de la réponse Exemple enregistré optionnel Schéma JSON réutilisable avec $ref
Réponses d’erreur Ajoutées manuellement par requête Définies dans responses avec components/schemas partagés
Réutilisation de schéma Copier-coller entre requêtes $ref vers components/schemas
Contrat lisible par machine Non Oui
Diff Git JSON avec IDs opaques YAML/JSON avec diffs exploitables
Lint et validation Pas natif Spectral, Redocly CLI, etc.

La dérive arrive parce que la collection ne peut pas exprimer tout le contrat. Le contrat vit donc ailleurs, et les deux fichiers se désynchronisent dès qu’une modification n’est pas propagée.

Passer à un workflow spec-first sans abandonner Postman

Le workflow spec-first ne signifie pas nécessairement « écrire tout le YAML avant la première ligne de code ».

Pour une équipe qui utilise déjà Postman, cela signifie surtout inverser la dépendance :

Avant :
Collection Postman -> documentation/tests partiels -> spec parfois mise à jour

Après :
OpenAPI dans Git -> collection générée -> tests/mocks/docs
Enter fullscreen mode Exit fullscreen mode

Workflow spec-first

Un workflow pratique ressemble à ceci :

  1. La spécification OpenAPI est stockée dans Git.
  2. Toute modification de contrat passe par une pull request.
  3. La CI valide la spécification.
  4. La collection Postman est générée depuis la spécification.
  5. Les tests s’exécutent sur cette collection générée.
  6. Les mocks et la documentation sont mis à jour depuis la même source.

La collection existe toujours. Vos environnements, scripts de pré-requête, tests et variables peuvent rester dans votre workflow. La différence est que la structure des requêtes vient de la spécification.

Générer une collection Postman depuis OpenAPI

Voici une approche reproductible avec Redocly CLI et openapi-to-postmanv2.

1. Installer les outils

npm install -g @redocly/cli openapi-to-postmanv2
Enter fullscreen mode Exit fullscreen mode

2. Valider la spécification

redocly lint openapi/petstore.yaml
Enter fullscreen mode Exit fullscreen mode

3. Résoudre les $ref

redocly bundle openapi/petstore.yaml \
  -o dist/petstore-bundled.yaml
Enter fullscreen mode Exit fullscreen mode

4. Générer la collection Postman

openapi2postmanv2 \
  --spec dist/petstore-bundled.yaml \
  --output dist/petstore-collection.json \
  --prettyPrint
Enter fullscreen mode Exit fullscreen mode

Vous obtenez une collection Postman v2.1 standard :

dist/
  petstore-bundled.yaml
  petstore-collection.json
Enter fullscreen mode Exit fullscreen mode

Vous pouvez ensuite :

  • importer petstore-collection.json dans Postman ;
  • l’exécuter avec Newman ;
  • l’utiliser dans la CLI Postman ;
  • la régénérer à chaque changement de spec.

Vos scripts et environnements peuvent rester séparés :

config/
  env-staging.json
  env-production.json

scripts/
  auth-pre-request.js
Enter fullscreen mode Exit fullscreen mode

Ainsi, la régénération de la collection n’écrase pas votre logique de test ou vos variables.

Exécuter la collection générée en CI

Ajoutez une étape CI qui valide la spec, régénère la collection, puis exécute les tests.

Exemple GitHub Actions :

# .github/workflows/api-tests.yml
name: API contract tests

on:
  push:
    paths:
      - "openapi/**"
      - "src/**"
  pull_request:
    paths:
      - "openapi/**"
      - "src/**"

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Install dependencies
        run: |
          npm install -g @redocly/cli openapi-to-postmanv2 newman

      - name: Validate OpenAPI spec
        run: redocly lint openapi/petstore.yaml

      - name: Generate Postman collection from spec
        run: |
          mkdir -p dist
          redocly bundle openapi/petstore.yaml \
            -o dist/petstore-bundled.yaml

          openapi2postmanv2 \
            --spec dist/petstore-bundled.yaml \
            --output dist/petstore-collection.json \
            --prettyPrint

      - name: Run tests with Newman
        run: |
          mkdir -p results
          newman run dist/petstore-collection.json \
            --environment config/env-staging.json \
            --reporters cli,junit \
            --reporter-junit-export results/test-results.xml

      - name: Upload test results
        uses: actions/upload-artifact@v4
        with:
          name: test-results
          path: results/
Enter fullscreen mode Exit fullscreen mode

Avec ce modèle, une PR qui modifie l’API doit aussi modifier la spec. Si la spec casse la génération ou les tests, la CI échoue dans la même PR.

Où Apidog s’insère dans ce workflow

Apidog ne remplace pas nécessairement Postman comme exécuteur de requêtes. Son intérêt est de connecter la spécification OpenAPI aux autres artefacts : collaboration, mocks, documentation interactive, scénarios de test et synchronisation Git.

Le Mode Spec-First d’Apidog, actuellement en bêta, permet de synchroniser une spécification OpenAPI depuis un dépôt Git vers un espace de travail Apidog.

À partir de cette spécification synchronisée, vous pouvez obtenir :

  • des mocks auto-générés ;
  • une documentation interactive ;
  • des scénarios de test ;
  • une mise à jour alignée sur les changements de spec dans Git.

Le principe reste le même :

OpenAPI dans Git
  -> Apidog
    -> documentation
    -> mocks
    -> tests
Enter fullscreen mode Exit fullscreen mode

Vous ne maintenez plus une collection séparée à côté de la spécification. La spécification détermine ce qu’Apidog affiche et exécute.

Pour migrer progressivement, vous pouvez convertir vos collections Postman existantes vers Apidog, puis définir la spécification comme document canonique pour les changements suivants.

Traiter la spécification comme du code

L’approche API spec as code consiste à appliquer au fichier OpenAPI les mêmes règles qu’au code applicatif :

  • pull requests ;
  • revue de code ;
  • lint en CI ;
  • versionnement ;
  • tags ;
  • branches pour les changements cassants.

Pratiques recommandées

1. Stocker la spec avec le service

Placez la spécification dans le même dépôt que le service qu’elle décrit :

my-service/
  src/
  openapi/
    service.yaml
  .github/
    workflows/
      api-tests.yml
Enter fullscreen mode Exit fullscreen mode

Cela force les changements de contrat à vivre dans la même PR que le code.

2. Ajouter un lint OpenAPI en CI

Utilisez Spectral ou Redocly CLI pour détecter :

  • schémas invalides ;
  • $ref cassés ;
  • descriptions manquantes ;
  • formats incohérents ;
  • conventions de nommage non respectées.

Exemple avec Spectral :

npm install -g @stoplight/spectral-cli

spectral lint openapi/service.yaml
Enter fullscreen mode Exit fullscreen mode

Vous pouvez aussi ajouter vos règles d’équipe :

# .spectral.yaml
extends: ["spectral:oas"]

rules:
  operation-description:
    description: Chaque opération doit avoir une description.
    given: "$.paths[*][*]"
    then:
      field: description
      function: truthy
Enter fullscreen mode Exit fullscreen mode

3. Brancher les changements cassants

Pour une modification incompatible :

git checkout -b breaking/change-user-response
Enter fullscreen mode Exit fullscreen mode

Travaillez sur la spec et le code ensemble, puis ouvrez une PR. Les espaces de travail Apidog prennent aussi en charge le branching sur la spécification, ce qui permet de travailler sur une branche stable pendant qu’un changement cassant est en revue.

4. Épingler les versions consommées

Si le service B dépend de la spec du service A pour ses tests de contrat, évitez de pointer vers main.

Préférez un tag :

service-a-openapi@v1.12.0
Enter fullscreen mode Exit fullscreen mode

Cela évite qu’un changement non validé côté fournisseur casse les tests consommateur sans contrôle.

Le guide du workflow API natif Git détaille cette approche pour un nouveau projet.

FAQ

Dois-je arrêter complètement d’utiliser Postman ?

Non. Le changement concerne la direction de la dépendance, pas l’outil.

Vous pouvez continuer à utiliser Postman pour :

  • les tests exploratoires ;
  • les scripts de pré-requête ;
  • les variables d’environnement ;
  • les tests manuels ;
  • l’exécution via Newman.

La différence est que la collection est générée depuis OpenAPI avant l’exécution, au lieu d’être maintenue manuellement comme contrat séparé.

Que deviennent les scripts Postman et les variables d’environnement ?

Ils peuvent rester séparés de la collection générée.

Exemple :

newman run dist/petstore-collection.json \
  --environment config/env-staging.json \
  --globals config/globals.json
Enter fullscreen mode Exit fullscreen mode

La collection décrit la structure des requêtes. Les environnements et scripts décrivent le comportement d’exécution. Vous pouvez donc régénérer la collection sans écraser vos fichiers d’environnement.

Comment gérer les endpoints qui ne sont pas encore dans la spécification ?

Dans un workflow spec-first, un endpoint absent de la spécification n’est pas prêt pour les tests de contrat.

La règle pratique :

  1. ajouter l’endpoint dans OpenAPI ;
  2. valider la spec ;
  3. générer la collection ;
  4. écrire ou adapter les tests ;
  5. merger le code et la spec ensemble.

Pour accélérer l’édition et la validation, consultez le guide des meilleurs outils de validation OpenAPI.

Le Mode Spec-First d’Apidog est-il disponible ?

Le Mode Spec-First d’Apidog est actuellement en bêta. Vous pouvez y accéder via Apidog et vérifier si la synchronisation Git, le support des branches et les mocks auto-générés correspondent à votre workflow.

Comme pour toute fonctionnalité bêta, testez-la d’abord avec votre structure OpenAPI réelle avant de l’adopter en production.

Quelle différence avec une importation OpenAPI dans Postman ?

Importer une spécification OpenAPI dans Postman génère une collection à un instant donné. Après l’import, la collection peut de nouveau dériver si elle est modifiée indépendamment.

Un workflow spec-first régénère ou resynchronise la collection depuis la spécification à chaque exécution de CI ou changement de spec. La collection reste donc un artefact en aval, pas une source de vérité concurrente.

Conclusion

La dérive entre collections Postman et spécifications OpenAPI n’est pas un bug Postman. C’est le résultat normal de deux descriptions d’API maintenues séparément.

La solution opérationnelle :

  1. définir OpenAPI dans Git comme source de vérité ;
  2. valider la spec en CI ;
  3. générer les collections depuis la spec ;
  4. exécuter les tests sur les artefacts générés ;
  5. connecter documentation, mocks et scénarios de test à la même source.

Cette inversion change le moment où les problèmes apparaissent : au lieu de découvrir la dérive six mois plus tard, vous la détectez dans la PR qui modifie le contrat.

Téléchargez Apidog et ouvrez un espace de travail en Mode Spec-First avec votre spécification OpenAPI existante. Si vous partez d’une collection Postman, importez-la comme point de départ, puis faites évoluer votre workflow vers une spécification OpenAPI canonique dans Git.

Top comments (0)