Dies ist eine alte Version des Dokuments!


LU08c – Chai-Assertions in Bruno (BDD & TDD)

Bruno nutzt die Chai-Bibliothek – d. h. du kannst dieselbe Syntax wie in Chai für Assertions in deinen Tests verwenden. Zusätzlich bietet Bruno neben JS-Tests auch deklarative Assertions im eigenen Reiter.

Bruno kennt zwei Wege für automatische Prüfungen:

  • Assertions-Reiter (No-Code/Low-Code): Bedingungen per Ausdruck/Operator/Wert definieren (z. B. *response.status equals 200*).
  • Tests (JavaScript): Frei mit Chai formulieren – ideal für komplexe Logik, Schleifen, dynamische Vergleiche etc.
Typischer Ablauf: Request ausführen → im Reiter Tests oder Assertions die Bedingungen definieren → erneut ausführen → Bruno zeigt Pass/Fail pro Bedingung.

Chai bietet drei Stile für Assertions:

  • BDD: `expect(…)` und `should` (lesbare, „natürliche“ Sprache)
  • TDD: `assert(…)` (klassisch, funktionsorientiert)

In Bruno ist `expect` der gebräuchlichste Stil in Beispielen und Doku. `assert` ist ebenso möglich. `should` existiert in Chai, wird in Bruno jedoch seltener verwendet.


Lesbarkeit vor Kürze: Gut für „verhaltensorientierte“ Checks (Antwortstatus, Struktur, Werte).

Beispiele Statuscode

test("Status ist 200", () => {
  expect(res.getStatus()).to.equal(200);
});

Body-Struktur (Objekt)

test("Body enthält erwartete Felder", () => {
  const body = res.getBody(); // JSON wird automatisch geparst, falls Content-Type JSON
  expect(body).to.have.property("title");
  expect(body).to.have.property("author");
});

Array-Länge & Teilmenge

test("Liste enthält genau 3 Bücher", () => {
  const list = res.getBody();
  expect(Array.isArray(list)).to.equal(true);
  expect(list.length).to.equal(3);
});

Deep Equality (Objekte/Arrays)

test("Buch entspricht dem erwarteten Objekt", () => {
  const book = res.getBody();
  expect(book).to.eql({
    title: "The Winds of Winter",
    author: "George R R Martin"
  });
});
Tipp: Für tiefe Vergleiche nutze `eql`/`deep.equal`; für Primitive reicht `equal`.

Kürze vor Lesbarkeit: Prägnant, beliebt in Unit-Tests – auch in Bruno nutzbar, wenn du TDD gewohnt bist.

Beispiele

test("Status ist 200 (assert)", () => {
  assert.equal(res.getStatus(), 200);
});
 
test("Body ist Array (assert)", () => {
  const body = res.getBody();
  assert.isArray(body, "Antwort ist kein Array");
  assert.equal(body.length, 3, "Erwartete Länge 3");
});

Der `should`-Stil von Chai existiert, wird in Bruno jedoch nicht aktiv beworben. Wenn du ihn verwendest, achte darauf, dass er initialisiert ist; in der Praxis empfiehlt sich in Bruno `expect`.


Nutze BDD (`expect`), wenn …

  • Anforderungen fachlich/lesbar dokumentiert werden sollen (z. B. im Unterricht, Review mit Nicht-Entwicklern).
  • du API-Verhalten/Szenarien formulierst („Wenn ich X aufrufe, erwarte ich Y“).
  • du deklarative Assertions im UI mit wenigen Klicks ergänzen willst (Status, Header, Teilinhalte).

Nutze TDD (`assert`), wenn …

  • du aus Unit-Test-Denke kommst und kurze, funktionale Checks bevorzugst.
  • du sehr präzise Vergleiche und klassische Assertions magst (z. B. `assert.strictEqual`).
  • du bestehende TDD-Snippets (aus anderen Projekten) nach Bruno überträgst.
Faustregel in Bruno: Für Unterricht & Teams mit gemischter Erfahrung → BDD/`expect` (+ Assertions-Reiter). Für Entwickler-zentrierte, knappe Checks → TDD/`assert`.

Header prüfen

test("Content-Type ist JSON", () => {
  const ct = res.getHeader("content-type");
  expect(ct).to.contain("application/json");
});

Teilinhalt prüfen

test("Titel ist nicht leer", () => {
  const b = res.getBody();
  expect(b.title).to.be.a("string").and.not.empty;
});

Antwortzeit (einfacher Leistungs-Check)

test("Antwort < 800 ms", () => {
  expect(res.getResponseTime()).to.be.below(800);
});

  • `equal` vs. `eql`: Für komplexe Strukturen (Objekte/Arrays) `eql`/`deep.equal` nutzen, nicht `equal`.
  • Kontext „Tests“ vs. „Script“: Chai-Hilfen sind im Tests-Kontext standardmäßig verfügbar; im Script-Kontext kann es je nach Version abweichen → Tests-Tab verwenden.
  • Parsing: `res.getBody()` liefert bei JSON-Antworten ein bereits geparstes Objekt (ansonsten String) – prüfe ggf. Content-Type.

  • Bruno – Testing (Einführung & Beispiele)

– Assertions & `expect(res.getStatus()).to.equal(200)` u. a.

  • Bruno – Assertions (No-Code Assertions-Reiter)
  • Bruno – JavaScript/Response-API (z. B. `res.getBody()`, `getHeader()`)
  • Chai – Assertion-Stile (BDD `expect`/`should`, TDD `assert`)

Marcel Suter (angepasst)

  • modul/m450/learningunits/lu08/chaibruno.1758181812.txt.gz
  • Zuletzt geändert: 2025/09/18 09:50
  • von kmaurizi