====== LU08c – Chai-Assertions in Bruno (BDD & TDD) ======
Bruno nutzt die ''Chai''-Bibliothek – du kannst also 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.
===== Tests in Bruno =====
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-Assertion-Stile =====
Chai bietet drei Stile für Assertions:
* **BDD**: ''expect(...)'' und ''should'' (lesbar, „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, wird aber selten genutzt.
----
===== BDD-Stil (empfohlen) =====
Gut für verhaltensorientierte Tests, die API-Verhalten in natürlicher Sprache ausdrücken.
test("Status ist 200", () => {
expect(res.getStatus()).to.equal(200);
});
test("Body enthält erwartete Felder", () => {
const body = res.getBody();
expect(body).to.have.property("title");
expect(body).to.have.property("author");
});
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);
});
test("Buch entspricht erwarteten Werten", () => {
const book = res.getBody();
expect(book).to.eql({
title: "The Winds of Winter",
author: "George R R Martin"
});
});
----
===== TDD-Stil (assert) =====
Kurz und präzise – beliebt in klassischen Unit-Tests.
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");
});
----
===== ''should''-Stil =====
Der ''should''-Stil ist in Chai vorhanden, wird in Bruno aber kaum genutzt.
Falls verwendet, muss er initialisiert werden. Im Unterricht empfehlen wir ''expect''.
----
===== BDD oder TDD – was wann? =====
Nutze **BDD (expect)**, wenn …
* Anforderungen lesbar dokumentiert werden sollen (z. B. im Unterricht oder Review mit Nicht-Entwicklern).
* API-Verhalten beschrieben wird (''Wenn ich X aufrufe, erwarte ich Y'').
* deklarative Assertions im UI ergänzt werden.
Nutze **TDD (assert)**, wenn …
* du sehr präzise, knappe Checks bevorzugst.
* du Unit-Test-Denke gewohnt bist.
* bestehende ''assert''-Snippets nach Bruno überträgst.
**Faustregel:** Für Unterricht und API-Tests ist ''BDD/expect'' der Standard.
''assert'' eignet sich für Entwickler, die mit TDD vertraut sind.
----
===== Häufige Assertions in Bruno =====
**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 prüfen**
test("Antwort < 800 ms", () => {
expect(res.getResponseTime()).to.be.below(800);
});
----
===== Typische Stolpersteine =====
* ''equal'' vs. ''eql'': Für komplexe Strukturen (Objekte/Arrays) ''eql'' oder ''deep.equal'' nutzen.
* Kontext ''Tests'' vs. ''Script'': Chai ist nur im Tests-Kontext garantiert verfügbar.
* Parsing: ''res.getBody()'' liefert bei JSON automatisch ein Objekt, sonst einen String.
----
===== Weiterführende Links =====
* [[https://docs.usebruno.com/testing/tests/introduction|Bruno Docs: Tests (Chai)]]
* [[https://docs.usebruno.com/testing/assertions/introduction|Bruno Docs: Assertions-Reiter]]
* [[https://docs.usebruno.com/testing/script/javascript-reference|Bruno Docs: JavaScript-API (res, bru, expect)]]
* [[https://www.chaijs.com/guide/styles/|Chai Assertion Styles (BDD & TDD)]]
----
{{tag>M450-LU08}}
[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] Kevin Maurizi