API-Testing mit Bruno API-Client: Der neue Sheriff in der API-Stadt

🕒 Lesedauer: 6 Minuten

APIs sind die Kommunikationswege zwischen den Services der modernen Softwarelösungen. Ohne sie wären Apps, Websites und Cloud-Dienste nichts weiter als isolierte Datensilos. Doch aus dieser wichtigen Rolle, die APIs in Softwaresystemen einnehmen, folgt große Verantwortung – und die muss getestet werden. API-Testing stellt sicher, dass Schnittstellen funktionale Anforderungen und Spezifikationen zuverlässig erfüllen. Ob Performance, Sicherheit oder Geschäftslogik – gute API-Tests können Teile dieser relevanten Aspekte abdecken bzw. die Grundlage für weitere Teststrategien schaffen.

Lange Zeit war Postmann das dominierende Tool im Bereich API-Testing. Doch nun gibt es eine vielversprechende Alternative: Bruno.

 

Was ist Bruno?

Bruno ist ein Open-Source API-Testing-Tool, das auf eine lokal gespeicherte Dateistruktur setzt und dabei eine effiziente Kombination aus CLI und UI bietet. Es ist schlank, leistungsfähig und richtet sich an Nutzer, die sowohl eine strukturierte Benutzeroberfläche als auch die Flexibilität einer skriptgesteuerten Umgebung schätzen.

Warum API Testing mit Bruno?

  • Bruno bietet verschiedene Vorteile, doch die folgenden vier sind entscheidend:
  • Keine Cloud-Abhängigkeiten – alles bleibt lokal.
  • Versionskontrolle mit Git? Kein Problem!
  • Simples, aber mächtiges CLI.
  • Entwicklerfreundlich und Open-Source-Community

 

Die Grundkomponenten, Workflows und Best Practices in Bruno

Bruno setzt auf einfache, aber effektive Strukturen, die auch in vergleichbaren API-Tools in ähnlicher Form wiederzufinden sind. Die wichtigsten Bausteine:

Request

Ein Request (meistens HTTP) umfasst immer die folgenden Eigenschaften:

  • HTTP-Methode (GET, POST, PUT, DELETE, ...)
  • URL (inklusive Path- und Query-Parameter)

 

Zusätzlich können optionale Daten angegeben werden:

  • Header (Authorization, Content-Type, ...)
  • Body (Dateien, JSON, ...)

Hat man einen Request definiert, kann man ihn in Bruno auch direkt ausprobieren und abschicken. Im Screenshot ist beispielsweise ein Request an eine Jira API zu sehen, der nach einem bestimmten Issue sucht. In der Response sind dann die vom Server zurückgeschickten Daten zu sehen.

Image
API Testing Bruno Requests
Bild: Bereich zum Definieren und Abschicken einzelner Requests [Quelle: Qytera]

Requests können wie im Screenshot auch über Platzhalter der Form {{variable}} parametrisiert werden. Bruno ersetzt den Platzhalter dann mit dem konkreten Wert, der aus einer der folgenden Quellen entnommen werden kann:

  • Request-Variablen im Variablen-Tab in der UI
  • Collection-Variablen
  • Ordner-Variablen
  • Environment-Variablen (und damit auch Systemumgebungsvariablen vom Betriebssystem)

Über die Parametrisierung lassen sich Requests sehr gut für verschiedene Tests wiederverwenden.

Collections

Bruno organisiert API-Tests in sogenannten Collections. Eine Collection ist ein einfaches Verzeichnis mit .bru-Dateien, die die API-Requests enthalten. Diese werden mit der Bru-Language (eine proprietäre DSL von Bruno) in einer Groovy-ähnlichen Struktur spezifiziert, die sich problemlos in Git einbinden lassen. Jede Collection enthält eine strukturierte Übersicht über die darin enthaltenen Requests. Im Screenshot ist der Bereich einer Collection mit Jira API Requests markiert.

Image
API Testing Bruno Collections und Requests
Bild: Bereich zum Verwalten von Collections und ihren Requests [Quelle: Qytera]

Auf Collection-Ebene wird bei Bruno typischerweise auch die Authentifizierung oder Autorisierung umgesetzt, etwa in Form eines bestimmten OAuth-Flows oder per Definition eines Authorization: Bearer <token>-Headers, der für alle in der Collection definierten Requests mitgeschickt werden soll.

Assertions & Tests

Ohne Validierung ist ein API-Request wie ein Kuchenrezept, das man Schritt für Schritt nachbackt, ohne jemals zu probieren, ob das Resultat den Erwartungen entspricht. Oder anders gesagt: Erst durch die Validierung werden die von Bruno gesendeten Requests zu echten API-Tests, die sicherstellen, dass man nicht erst im Fehlerfall die bittere Überraschung serviert bekommt.

In Bruno gibt es zwei Möglichkeiten, diese Überprüfungen zu implementieren: Assertions und Tests. Die Namensgebung mag auf den ersten Blick verwirren – schließlich impliziert ein Test doch immer auch eine Überprüfung (Assertion), oder? Bruno hat sich hier scheinbar für eine redundant wirkende Implementierung und Namensgebung entschieden: Zwei Bereiche, die fast das Gleiche tun, aber eben nicht ganz.

Assertion - die klickfreundliche Variante: Hier können häufige Überprüfungen bequem per UI-Klick erstellt werden. Der Funktionsumfang ist begrenzt, aber für Standardfälle völlig ausreichend. Wer also nicht gleich in JavaScript abtauchen will, ist hier richtig.

Image
API Testing Bruno Assertions

Tests - für die, die mehr wollen: Wer komplexere oder individuellere Prüfungen braucht, kann im Tests-Bereich mit JavaScript kreativ werden. Hier sind kaum Grenzen gesetzt – außer vielleicht die der eigenen Programmierkünste.

Image
API Testing Bruno Tests

Bei Ausführung des zugehörigen Requests werden beide Bereiche im Test-Report separat gelistet. Mit den Assertions und Tests wird also sichergestellt, dass der API-Endpoint nicht nur antwortet, sondern sich auch korrekt verhält.

Environment Variablen & Secrets

Ein Environment in Bruno kann als Sammlung von Variablen aufgefasst werden. Typischerweise finden sich darin die URL des Testobjekts sowie eventuelle Authentifizierungsparameter. Bestimmte Variablen können hier als Secret markiert werden, um sensible Daten zu schützen.

Die Auswirkung dieser Secret-Option lässt sich am besten anhand eines Screenshots verdeutlichen. 

Image
API Testing Bruno Environment
Bild: Ein Environment mit drei definierten Variablen, von denen das Zugangstoken zur Autorisierung als geheim markiert wurde. [Quelle: Qytera]

In der dort abgebildeten Variante wird Bruno das Environment in folgender Datei abspeichern:

vars { 
  username: example@qytera.de 
  url: https://example.atlassian.net 
} 
vars:secret [ 
  token 
] 

Würde man das Häkchen nicht setzen, sähe die Datei wie folgt aus:

vars { 
  username: example@qytera.de 
  url: https://example.atlassian.net 
  token: my-super-secret-token 
}

⚠️ Auch die Environments werden auf dem System abgespeichert und meist in die Repositories mit gespeichert. Wenn Werte im Environment nicht als Secret markiert sind, werden sie im Klartext gespeichert, sodass sie jeder sehen kann, der Zugriff auf das Repository hat. Es muss also immer darauf geachtet werden, dass geheimzuhaltende Informationen als Secret markiert sind, wenn sie direkt eingetragen werden, damit Bruno die Werte nicht mit in den Environment-Dateien abspeichert.

 

Skripting

Bruno erlaubt das Ausführen von benutzerdefinierten JavaScript-Skripten auf verschiedenen Ebenen:

  • Collection-Ebene
  • Ordner-Ebene
  • Request-Ebene

Standardmäßig wird dabei eine Art Sandwich-Modell angewendet. Beim Abschicken eines Requests führt Bruno entsprechende Skripte in folgender Reihenfolge aus:

  • Collection Pre-Request
    • Folder Pre-Request
      • Pre-Request
        • Request wird durchgeführt
      • Post-Request
    • Folder Post-Request
  • Collection Post-Request

Die Skripte ermöglichen eine programmatische/dynamische Modifikation bestimmter Request-Parameter. Beispielsweise lässt sich hier Verhalten wie "sende den aktuellen Zeitstempel im Body" realisieren:

bru.setVar("timestamp", Date.now());

Der Inhalt vom Body wäre dann einfach:

{ 
  "timestamp": "{{timestamp}}" 
}

Bruno API-Client: CI/CD & CLI-Nutzung

Bruno lässt sich über das offizielle @usebruno/cli-Paket nahtlos in CI/CD-Pipelines integrieren. Ein einfacher CLI-Befehl genügt, um eine Collection auszuführen:

npx bru run

Man kann auch einzelne Requests oder bestimmte Ordner ausführen:

npx bru run my-request.bru 
npx bru run my-folder 
# to also run nested folders: 
npx bru run -r my-folder 

Führt man Ordner und Collections aus, so werden alle Requests in der Reihenfolge ausgeführt, in der sie dort definiert sind. 

my-collection 
├─ endpoint 1 
│  ├─ POST create user 
│  ├─ PATCH rename user 
│  ├─ DELETE delete user 
├─ endpoint 2 
│  ├─ POST upload picture 
│  ├─ DELETE delete picture 
├─ POST authenticate

In diesem Fall wäre die Ausführungsreihenfolge:

  1. POST create user
  2. PATCH rename user
  3. DELETE delete user
  4. POST upload picture
  5. DELETE delete picture
  6. POST authenticate

Reporting in Bruno API Client

Bruno kann die gesammelten Testergebnisse als Report in Dateien schreiben. Als Formate stehen JSON, JUnit XML und HTML zur Verfügung:

npx bru run --reporter-json results.json --reporter-junit results.xml --reporter-html results.html

Insbesondere der JUnit-Report lässt sich in allen gängigen Testmanagement-Tools einbinden, um stets über die aktuellen Testergebnisse zu verfügen. In Kombination mit einer Pipeline, die regelmäßig alle API Tests durchführt, wird dadurch mit sehr wenig Aufwand eine sehr mächtige Testautomatisierungslösung umsetzbar.

Integration Bruno API Client - Xray

Die von Bruno erstellten Reports passen nicht immer zu der Art und Weise, wie in Projekten mit Tests, Fehlern und Testausführungsergebnissen umgegangen wird. Beispielsweise erstellt Xray beim Import von JUnit-Testergebnissen gerne mal hunderte neue Test-Issues, weil die API-Requests neue Namen bekommen haben und somit nicht mehr zu den bestehenden zugeordnet werden können. Weil für Bruno jeder einzelne Request ein vollständiger API-Test ist, erlaubt es auch keine Gruppierung von mehreren Requests zu einem API-Test. Typische Use Cases wie “User anlegen, User umbenennen, User löschen” lassen sich mit Bruno aus Testmanagement-Sicht standardmäßig schlecht umsetzen.

Durch unser Open-Source Bruno-Xray-Plugin können die Testergebnisse unter Berücksichtigung von Projektanforderungen nach Xray übertragen werden. Ein besonderes Highlight ist dabei die Möglichkeit, bestimmte Tests basierend auf Xray-Datensätzen datengetrieben auszuführen, inklusive automatischer Downloads dieser Testdaten. Das erleichtert das Testmanagement ungemein und bringt API-Testing in eine strukturierte Teststrategie.

 

Fazit: Warum Bruno API Client?

Wer API-Testing ernst nimmt und Wert auf Datensicherheit sowie eine local-first Arbeitsweise legt, sollte Bruno eine Chance geben. Es ist Open Source und zwingt (aktuell) niemanden in eine Cloud-Abhängigkeit, wie es bei Postman der Fall ist: Postman vs. Bruno

Bruno glänzt durch Einfachheit: Keine überladenen Features, keine undurchsichtigen Workflows – stattdessen ein schlankes, GUI-basiertes Tool, das sich nahtlos in eine entwicklerfreundliche Umgebung einfügt. Natürlich gibt es Grenzen: Wer tief integrierte CI/CD-Pipelines oder ausgefeilte Team-Collaboration erwartet, muss ggf. Lösungen selbst implementieren oder integrieren. Aber dafür bleibt alles unter Kontrolle – kein Vendor-Lock-in.

Am Ende ist es eine Frage der Philosophie: Wer ein schnörkelloses, pragmatisches API-Testing-Tool sucht, wird mit Bruno vermutlich glücklich. Wer hingegen möglichst viele Buttons, “Automagie” und Enterprise-Gimmicks bevorzugt – na ja, der weiß vermutlich schon, wo er klicken muss: Die besten API Testing Tools im Überblick

Sie sind Fan von Bruno und möchten es in Ihrem Projekt implementieren? Oder sind Sie noch unsicher und benötigen Unterstützung in der Auswahl des für Sie perfekten API Testing Tools? Wir sind die Experten, die Ihnen helfen, Ihr API-Testing aufs nächste Level zu heben. Vereinbaren Sie einfach ein kostenfreies Erstgespräch mit uns und wir erörtern gemeinsam, wie wir Sie unterstützen können. Gemeinsam bringen wir Bruno zum Laufen – und Ihre APIs zum Fliegen!

Termin vereinbaren

 

FAQ: Häufige Fragen zu Bruno API Client

Was ist Bruno API Client? 

Bruno ist ein Open-Source API-Testing-Tool, das auf eine lokal gespeicherte Dateistruktur setzt und eine Kombination aus CLI und UI bietet. Es ist leichtgewichtig, leistungsstark und entwickelt sich zunehmend zur ernstzunehmenden Alternative zu Postman.

Bruno vs. Postman - Welches Tool passt zu meinem Projekt?

  • Bruno: Ideal für Entwicklerteams, die Wert auf lokale Datenspeicherung, Versionskontrolle mit Git legen.
  • Postman: Bietet umfangreiche Features für Team-Collaboration, Cloud-Integration und eine ausgebaute Benutzeroberfläche.
  • Mehr Details zu den Unterschieden finden Sie in unserem Artikel: API Testing Tools: Postman vs. Bruno

Wie einfach kann Bruno in mein Projekt implementiert werden? 

Bruno ist unkompliziert in bestehende Workflows integrierbar. API-Tests werden in Collections organisiert, die sich leicht in Git verwalten lassen. Zudem lässt sich Bruno in CI/CD-Pipelines über das CLI-Tool einbinden.

Ist Bruno für Einsteiger geeignet? 

Bruno bietet eine intuitive UI für grundlegende Tests und ein CLI für fortgeschrittene Nutzer. Es eignet sich sowohl für API-Testanfänger als auch für erfahrene Tester.

Kann Bruno mit Xray für Testmanagement integriert werden? 

Unser Open-Source-Plugin ermöglicht die strukturierte Übertragung von Testergebnissen nach Xray.

 

Veröffentlicht am 03.Februar 2025

Aktualisiert am 07.Februar 2025

Sebastian Vollbrecht

Junior Test Automation Engineer

Sebastian Vollbrecht ist nach Erhalt seines M. Sc. Informatik direkt im Testing gelandet. Dort konnte er als Consultant innerhalb kürzester Zeit bereits mehrere Projekte erfolgreich abschließen und weiß mittlerweile, dass das Reporting von (Test-)Ergebnissen oft eines der wichtigsten Elemente gelungener Projektarbeit ist. Zurzeit ist er als Test Automation Engineer für die Qytera Software Testing Solutions GmbH tätig.

Finden Sie weitere interessante Artikel zum Thema: