DEV Community

Cover image for Warum Ihre Postman Collections keine Wahrheitsquelle sind (und wie Sie das ändern können)
Emre Demir
Emre Demir

Posted on • Originally published at apidog.com

Warum Ihre Postman Collections keine Wahrheitsquelle sind (und wie Sie das ändern können)

Die Frage nach Postman Collections vs. OpenAPI Spec wird kritisch, sobald ein Team wächst. Eine vor sechs Monaten erstellte Collection beschreibt plötzlich einen Endpunkt mit veralteten Parametern, fehlenden Pflichtfeldern und einer Antwortstruktur, die nicht mehr zum Server passt. Die OpenAPI Spec in Git sagt etwas anderes. Swagger UI zeigt wieder etwas anderes. Niemand weiß, welche Quelle stimmt.

Teste Apidog noch heute

Das ist kein Tool-Fehler. Es ist ein Workflow-Problem. Postman eignet sich sehr gut für Requests, Skripting und exploratives Testen. Die Abweichung entsteht, wenn Teams die Collection als API-Vertrag behandeln, statt sie aus dem Vertrag abzuleiten.

💡 Sobald Sie die Abhängigkeit umkehren und die Spezifikation die Collection generieren lassen, stoppt die Abweichung. Apidog verbindet diesen spezifikationsgesteuerten Workflow mit Kollaboration, Mocking, Tests und CI/CD, sodass Ihr Team aus derselben Quelle arbeitet.

Warum Collections überhaupt abweichen

Eine Postman Collection ist ein Request-First-Artefakt:

  1. Sie senden eine Anfrage.
  2. Sie beobachten die Antwort.
  3. Sie speichern den Request.
  4. Später ergänzen Sie Variablen, Pre-Request-Skripte, Assertions und Ordnerstrukturen.

Das beschreibt, wie Ihr Team die API aktuell aufruft.

Eine OpenAPI-Spezifikation ist dagegen ein Contract-First-Artefakt. Sie definiert Pfade, Parameter, Schemas und Antworttypen maschinenlesbar. Daraus können Tools validieren, Mocks erzeugen, Dokumentation bauen oder Code generieren.

OpenAPI Spec vs Postman Collection

Die beiden Artefakte beantworten unterschiedliche Fragen:

  • Collection: Wie rufe ich diesen Endpunkt heute auf?
  • Spezifikation: Was soll diese API formal tun?

Wenn beide unabhängig gepflegt werden, driften sie auseinander. Ein Entwickler aktualisiert die Spezifikation im Pull Request. Ein anderer passt die Collection an, sobald ein Test fehlschlägt. Niemand führt beide Quellen zuverlässig zusammen.

Das Ergebnis: zwei teilweise korrekte API-Beschreibungen und keine klare Quelle der Wahrheit.

Dieses Muster ist in Teams häufig. Inventis Korea berichtete über genau diesen Ablauf: API bauen, OpenAPI-Spezifikation für Swagger generieren, Collection in Postman importieren und anschließend drei Repräsentationen synchron halten. Tests übersahen Randfälle, weil die Collection nicht das vollständige Schema widerspiegelte. Die Dokumentation wich ab, weil die Spezifikation nicht die Grundlage für Tests war.

Die Grundursache: Postman ist kein Spezifikationsspeicher

Postman Collections verwenden ein eigenes Format. Das Postman Collection Schema beschreibt Requests, Skripte und Ordnerhierarchien als JSON. Es ist aber keine OpenAPI-Spezifikation.

Postman kann OpenAPI importieren und exportieren. Diese Konvertierung ist jedoch verlustbehaftet:

  • OpenAPI → Collection: Schemadetails können verloren gehen, wenn sie nicht als konkrete Requests ausdrückbar sind.
  • Collection → OpenAPI: Skripte, Testlogik und bestimmte Request-Daten passen nicht sauber in Spezifikationsfelder.

Das ist keine Kritik an Postman. Es beschreibt nur, wofür das Tool gedacht ist: Postman ist ein Request Runner mit Kollaborationsfunktionen. Als kanonischer API-Vertrag ist das Collection-Format nicht optimiert.

Eigenschaft Postman Collection OpenAPI Spezifikation
Anfrageparameter Schlüssel-Wert-Paare mit optionaler Beschreibung Typisiert, validiert, mit required- und schema-Feldern
Antwortstruktur Gespeichertes Beispiel, optional JSON-Schema mit $ref-Wiederverwendung
Fehlerantworten Manuell pro Anfrage hinzugefügt In responses mit gemeinsamen components/schemas definiert
Schema-Wiederverwendung Keine; häufig Copy-Paste $ref zu components/schemas
Maschinenlesbarer Vertrag Nein Ja
Git-Diff-freundlich JSON mit undurchsichtigen IDs YAML/JSON mit sinnvollen Diffs
Linting und Validierung Nicht nativ im Collection-Format Spectral, Redocly CLI und andere

Die Collection kann den API-Vertrag nicht vollständig ausdrücken. Deshalb muss der Vertrag woanders liegen. Ohne klare Abhängigkeitsrichtung fallen beide auseinander.

Was „Spec-First“ für ein Postman-Team bedeutet

„Spec-First“ bedeutet nicht zwingend, dass Sie jede API vollständig in YAML entwerfen, bevor Code geschrieben wird.

Für Teams, die bereits mit Collections arbeiten, bedeutet es vor allem:

Die OpenAPI-Spezifikation in Git wird zur autoritativen API-Beschreibung. Alle anderen Artefakte werden daraus abgeleitet.

Die „Spec-First“-Methodik kehrt die Abhängigkeit um:

Spec-First Workflow

Der praktische Workflow:

  1. Die OpenAPI-Spezifikation liegt in Git.
  2. Änderungen an der Spezifikation laufen über Pull Requests.
  3. CI validiert die Spezifikation.
  4. Tests, Mocks und Dokumentation werden aus der Spezifikation generiert.
  5. Eine Postman-kompatible Collection wird ebenfalls aus der Spezifikation erzeugt.
  6. Exploratives Testen bleibt möglich, aber die Collection ist nicht mehr die Quelle der Wahrheit.

Die Collection verschwindet also nicht. Sie wird nur nachgelagert.

Wenn ein neues Feld in der Spezifikation erscheint, erscheint es in der generierten Collection. Wenn ein Feld entfernt wird, enthält die generierte Anfrage es nicht mehr. Abweichungen werden im CI-Lauf sichtbar, nicht erst Monate später.

Collections aus einer OpenAPI-Spezifikation generieren

Eine einfache Variante nutzt die Redocly CLI und openapi-to-postmanv2.

1. Tools installieren

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

2. Spezifikation validieren

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

3. Spezifikation bündeln

Das ist besonders wichtig, wenn Sie $ref über mehrere Dateien verwenden.

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

4. Postman Collection generieren

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

Die Ausgabe ist eine Postman Collection im JSON-Format. Sie können sie in Postman importieren oder mit Newman bzw. der Postman CLI ausführen.

Wichtig: Pre-Request-Skripte, Testskripte und Umgebungsvariablen sollten separat gepflegt werden. Die generierte Collection enthält die Request-Struktur. Die Verhaltensebene bleibt getrennt.

CI-Beispiel: Collection vor jedem Testlauf neu generieren

So stellen Sie sicher, dass jeder Testlauf gegen den aktuellen API-Vertrag läuft:

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

on:
  push:
    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 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 against generated collection
        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

Damit ist die Spezifikation der Input für jeden Testlauf. Eine API-Änderung, die Tests bricht, wird im selben Pull Request sichtbar.

Wo Apidog in diesen Workflow passt

Apidog ersetzt Postman nicht einfach als Request Runner. Der Nutzen liegt darin, die OpenAPI-Spezifikation mit den anderen API-Artefakten zu verbinden: Dokumentation, Mocks, Tests und Kollaboration.

Die Spezifikation in Git bleibt die Quelle der Wahrheit. Apidog wird zur Kollaborations- und Ausführungsebene darüber.

Der Spec-First-Modus von Apidog befindet sich derzeit in Beta. Er ermöglicht es, eine OpenAPI-Spezifikation aus einem Git-Repository in einen Apidog-Workspace zu synchronisieren.

Aus dieser synchronisierten Spezifikation entstehen:

  • interaktive API-Dokumentation
  • automatisch generierte Mocks
  • Testszenarien
  • ein gemeinsamer Workspace für Teamkollaboration

Wenn sich die Spezifikation in Git ändert, aktualisieren sich die davon abhängigen Artefakte. Dadurch müssen Teams nicht mehr eine Collection, ein Dokumentationstool und einen Mock-Server separat synchron halten.

Für Teams mit komplexen Zugriffsanforderungen lohnt sich ein Proof of Concept. Prüfen Sie dabei insbesondere Workspace-Berechtigungen, SSO-Anforderungen und Branching-Workflows gegen Ihre konkrete Teamstruktur.

Wenn Sie von Postman kommen, können Sie bestehende Postman Collections in Apidog konvertieren, um einen Ausgangspunkt zu haben. Danach sollte die OpenAPI-Spezifikation zum kanonischen Dokument werden.

Die Spezifikation als Code behandeln

Der „API-Spec-as-Code“-Ansatz behandelt OpenAPI wie Anwendungscode:

  • Pull Requests
  • Code Reviews
  • CI-Linting
  • Versionstags
  • Branching für Breaking Changes

Die meisten Teams haben die Infrastruktur dafür bereits. Sie müssen sie nur auf die Spezifikationsdatei anwenden.

Praktische Regeln

  1. Spezifikation im Service-Repository speichern

Legen Sie die OpenAPI-Datei im selben Repository ab wie den Service, den sie beschreibt.

Beispiel:

   my-service/
   ├── src/
   ├── openapi/
   │   └── service.yaml
   ├── package.json
   └── .github/
       └── workflows/
           └── api-tests.yml
Enter fullscreen mode Exit fullscreen mode

So können Code- und Spezifikationsänderungen im selben Pull Request überprüft werden.

  1. OpenAPI in CI linten

Nutzen Sie z. B. Spectral, um die Spezifikation gegen die OpenAPI-Spezifikation und interne Regeln zu prüfen.

Beispiel:

   npm install -g @stoplight/spectral-cli
   spectral lint openapi/service.yaml
Enter fullscreen mode Exit fullscreen mode
  1. Breaking Changes über Branches entwickeln

Behandeln Sie Breaking Changes wie Anwendungscode. Arbeiten Sie auf einem Branch, prüfen Sie Auswirkungen und mergen Sie erst nach Review.

Apidog-Workspaces unterstützen Branching für Spezifikationen, sodass Teams parallel an stabilen und zukünftigen API-Versionen arbeiten können.

  1. Spezifikationsversionen pinnen

Wenn Service B für Vertragstests von der Spezifikation von Service A abhängt, sollte Service B ein Versions-Tag referenzieren, nicht den aktuellen Stand von main.

Beispiel:

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

Dadurch werden Consumer-Tests reproduzierbar.

Eine detaillierte Einrichtung beschreibt der Leitfaden zum git-nativen API-Workflow.

Häufig gestellte Fragen

Muss ich Postman komplett aufgeben?

Nein. Die Änderung betrifft die Abhängigkeitsrichtung, nicht zwingend das Tool.

Sie können Postman weiter für explorative Tests und Skripting verwenden. Die Collection wird jedoch vor Testläufen aus der Spezifikation generiert, statt separat gepflegt zu werden.

Was passiert mit bestehenden Postman-Skripten und Umgebungsvariablen?

Pre-Request-Skripte, Testskripte und Umgebungsvariablen sollten separat gepflegt werden. Sie sind nicht Teil der generierten Request-Struktur.

So behalten Sie die Verhaltensebene, während die Strukturebene aus OpenAPI kommt.

Beispielstruktur:

api-tests/
├── dist/
│   └── generated-collection.json
├── config/
│   └── env-staging.json
└── scripts/
    └── shared-tests.js
Enter fullscreen mode Exit fullscreen mode

Wie gehe ich mit Endpunkten um, die noch nicht in der Spezifikation stehen?

In einem Spec-First-Workflow ist ein Endpunkt ohne Spezifikation noch nicht testbereit.

Das ist bewusst streng: Der Spezifikationseintrag sollte Teil des Pull Requests sein, der den Endpunkt einführt.

Für frühe explorative Entwicklung können Sie lokal mit Stubs arbeiten. Vor dem Merge sollte der Endpunkt aber in OpenAPI beschrieben und validiert sein. Der Leitfaden zu den besten OpenAPI-Validierungstools hilft beim Einstieg.

Ist der Apidog Spec-First-Modus verfügbar?

Der Apidog Spec-First-Modus befindet sich derzeit in Beta. Sie können ihn über Apidog ausprobieren und prüfen, ob Git-Synchronisation, Branch-Unterstützung und automatisch generierte Mocks zu Ihrem Workflow passen.

Wie bei jeder Beta-Funktion sollten Sie ihn mit Ihrer realen Spezifikationsstruktur testen, bevor Sie ihn produktiv einführen.

Was ist der Unterschied zum einmaligen Import einer Spezifikation in Postman?

Ein einmaliger Import erzeugt eine Collection aus OpenAPI. Danach wird die Collection wieder unabhängig gepflegt. Die Abweichung beginnt erneut.

Ein Spec-First-Workflow generiert die Collection wiederholt aus der Spezifikation:

  • bei jedem CI-Lauf
  • bei jeder Synchronisation
  • oder vor jedem Release

Damit bleibt die Collection ein abgeleitetes Artefakt und wird nicht zur zweiten Quelle der Wahrheit.

Fazit

Das Abweichungsproblem entsteht nicht, weil Postman schlecht ist. Es entsteht, weil zwei teilweise überlappende API-Beschreibungen ohne klare Abhängigkeit gepflegt werden.

Die robuste Lösung:

  1. OpenAPI-Spezifikation in Git als Quelle der Wahrheit etablieren.
  2. Spezifikation über Pull Requests ändern.
  3. Spezifikation in CI validieren.
  4. Collections, Mocks, Dokumentation und Tests aus der Spezifikation ableiten.
  5. Postman oder Newman nur noch gegen generierte Collections ausführen.

Dadurch ändern sich Fehler früher im Prozess: Eine Spezifikationsänderung, die Tests bricht, fällt im Pull Request auf. Dokumentation, Mocks und Tests bleiben konsistent, weil sie aus derselben Quelle lesen.

Laden Sie Apidog herunter und öffnen Sie einen Spec-First-Workspace mit Ihrer vorhandenen OpenAPI-Spezifikation. Wenn Sie von einer Collection starten, importieren Sie diese als Ausgangspunkt und arbeiten anschließend konsequent „spec-forward“.

Top comments (0)