Post-Deployment Tests mit Bruno

Automatisierte Tests vor dem Deployment sind Standard – doch was passiert, nachdem der Code produktiv gegangen ist? Genau hier setzen Post-Deployment-Tests an. Sie prüfen, ob der Dienst auch wirklich wie erwartet online ist und auf reale Anfragen korrekt reagiert.

In diesem Artikel zeige ich dir, wie ich Bruno, ein Open-Source-API-Testing-Tool, in meinen Forgejo Actions-Workflow eingebunden habe, um meine FastAPI-Anwendung direkt nach dem Deployment zu testen.

Was ist Bruno?

Bruno ist ein schlankes Tool zum Schreiben und Ausführen von API-Tests in einer lokalen, dateibasierten Umgebung. Es speichert Test-Fälle im Klartext in einem Git-Repository – ideal für CI/CD-Prozesse.

Zu Bruno und was man damit machen kann, habe ich hier einen eigenen Blog-Post geschrieben.

Der CI/CD-Workflow

Hier eine kurze Übersicht über meinen Workflow, umgesetzt mit Forgejo Actions (kompatibel zu GitHub Actions):

  1. Checkout & Test mit pytest
  2. Docker-Build & Deployment bei Tag-Pushes
  3. Post-Deployment-Tests mit Bruno, sobald die App live ist

Integration von Bruno in den Post-Deployment-Job

Nach erfolgreicher Ausführung des test-and-deploy-Jobs wird automatisch ein zweiter Job post-deploy gestartet. Darin wird Bruno verwendet, um eine zuvor definierte Test-Collection gegen die produktive API auszuführen.

Hier der relevante Ausschnitt aus dem Workflow:

jobs:
  test-and-deploy:
  	runs-on: ubuntu-latest
      steps:
         # ....

  post-deploy:
    runs-on: ubuntu-latest
    needs: test-and-deploy
    if: success() && github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Bruno CLI runner
        id: bru-cli
        uses: krummbar/bruno-run-action@main
        with:
          path: ./bruno-collection
          env: production
          env-vars: |-
            api_key='${{ "secrets.PRODUCTION_API_KEY" }}'

Den API-Key legt man in Forgejo in den Projekt-Einstellungen als Secret ab. Das gleiche geht natürlich auch, wenn ihr Github verwendet.

Wichgig! Die Variable env-vars für die Action bezieht sich nicht auf Betriebssystem Environment Variablen sondern auf das Bruno-Environment!

Im Beispiel verwende ich die Action von krummbar/bruno-run-action. Wenn ihr etwas eigenes nutzen wollt, müsst ich euch das Tool bru CLI Tool über npm installieren.

Bruno-Setup im Repository

In deinem Repository brauchst du:

  • Einen Ordner wie bruno-collection oder collection.bru
  • Eine passende Umgebungskonfiguration (production) mit Variablen wie base_url und api_key
  • Test-Suites, die auf echte Endpunkte zielen – z. B. GET /health, POST /login, etc.

Der Vorteil: Bruno nutzt einfache JSON- oder .bru-Dateien, die du versionieren, reviewen und lokal ausführen kannst.

Die Verzeichnisse und Dateien meiner Bruno Collection

Wie sieht so ein Test in Bruno aus?

In Bruno kann man aufwendige Tests scheiben, die verschiedene Logiken prüfen.
Dazu gibt es noch die Möglichkeit sehr einfache Prüfungen über Asserts zu erstellen.

Für meine Post-Deployment Tests haben ein paar Asserts ausgereicht. Diese prüfen auf den HTTP Status Code den ich erwarte und testen noch ein paar Rückgabewerte aus dem Response-Body.

Asserts eines Requests in Bruno

In Bruno legt man sich am besten auch ein "dev" Environment an. Dann kann man die Tests auch erst einmal gegen die lokale Entwicklungsversion laufen lassen.

Die Post-Deployment Checks lässt man dann gegen ein zweites Environment laufen.

Post Deployment Test in Aktion

So sieht so ein einfacher Post-Deployment Test dann bei mir in meinem Forgejo aus.
Das eine oder andere mal wurde inzwischen auch erkannt, dass die Anwendung defekt ist, obwohl die Tests vor dem Deployment erfolgreich waren. Es kann eben immer mal etwas sein.

Bruno Collection Run in einem Post-Deployment Test in Forgejo

Vorteile dieser Lösung

  • Schneller Feedback-Loop: Funktioniert der Live-Service wirklich?
  • Transparente Test-Cases: Klar lesbar und versionierbar
  • Zero-Setup: Kein zusätzlicher Test-Server nötig – der Live-Endpunkt ist die Bühne

Fazit

Post-Deployment-Tests mit Bruno sind eine einfache, aber effektive Möglichkeit, die Stabilität deiner API nach dem Rollout zu sichern. Die Integration in GitHub- oder Forgejo-Actions ist dabei unkompliziert und fügt sich nahtlos in bestehende CI/CD-Prozesse ein.

Wenn du also sicherstellen willst, dass dein Deployment nicht nur "grün gebaut", sondern auch wirklich funktional produktiv ist – probier Bruno aus.