BDD in Kotlin: Tests schreiben, die Manager und Entwickler lesen
\n\nHaben Sie jemals Ihrem Produktmanager einen Unit-Test gezeigt? Wahrscheinlich nicht. Denn das ist, als würde man einem Piloten die Baupläne eines Düsentriebwerks zeigen – nützlich, aber unverständlich. Behaviour-Driven Development (BDD) in Kotlin löst genau dieses Problem: Es verwandelt trockene Assert-Statements in lebendige Szenarien, die das Verhalten des Systems in menschlicher Sprache beschreiben.
\n\nIn diesem Artikel schauen wir uns an, wie Sie BDD in Kotlin mit modernen Frameworks – Kotest und Spek – einführen können. Sie werden sehen, wie Sie Tests im Given-When-Then-Stil schreiben, die sowohl Dokumentation als auch automatische Überprüfung sind. Und ja, selbst Ihr Teamleiter ohne Vorkenntnisse wird sie lesen können.
\n\nWas ist BDD und wie unterscheidet es sich von TDD?
\n\nViele verwechseln TDD (Test-Driven Development) und BDD (Behaviour-Driven Development). Der Unterschied ist einfach:
\n\n- \n
- TDD dreht sich um die Frage: „Wie überprüfe ich diese Methode?“ \n
- BDD dreht sich um die Frage: „Wie erhält der Benutzer einen Mehrwert von dieser Funktion?“ \n
Behaviour-Driven Development konzentriert sich auf das Verhalten des Systems, nicht auf Implementierungsdetails. Sie beschreiben ein Szenario: Unter bestimmten Bedingungen (Given), wenn eine Aktion ausgeführt wird (When), liefert das System das erwartete Ergebnis (Then).
\n\nAnstatt beispielsweise zu schreiben: assertEquals(42, calculator.add(20, 22)),
schreiben Sie:
Given("ich habe einen Taschenrechner") {\n val calc = Calculator()\n When("ich addiere 20 und 22") {\n val result = calc.add(20, 22)\n Then("das Ergebnis sollte 42 sein") {\n result shouldBe 42\n }\n }\n}\n\n\nStimmen Sie zu, die zweite Variante liest sich wie eine Geschichte, nicht wie eine technische Anleitung.
\n\nWarum Kotlin ideal für BDD ist
\n\nKotlin ist eine Sprache, die von Natur aus zum Schreiben lesbaren Codes einlädt. Erweiterungsfunktionen, Infix-Notation, Lambdas mit Empfänger – all das macht BDD-Tests in Kotlin besonders natürlich. Sie können shouldBe, shouldThrow und andere Matcher schreiben, die wie englische Sätze aussehen.
Darüber hinaus unterstützt Kotlin mehrere Paradigmen, was die Verwendung verschiedener Frameworks für BDD ermöglicht. Schauen wir uns die beiden beliebtesten an.
\n\nFramework Kotest: BDD aus der Box
\n\nKotest (früher KotlinTest) ist ein leistungsstarkes, plattformübergreifendes Test-Framework. Es unterstützt mehrere Stile, darunter BehaviorSpec, das sich perfekt für BDD eignet.
\n\nSo sieht ein vollständiges BDD-Szenario in Kotlin mit Kotest aus:
\n\nimport io.kotest.core.spec.style.BehaviorSpec\nimport io.kotest.matchers.shouldBe\n\nclass CartSpec : BehaviorSpec({\n given("ein leerer Warenkorb") {\n val cart = ShoppingCart()\n `when`("wir fügen einen Artikel mit Preis 100 hinzu") {\n cart.addItem(Item("Buch", 100.0))\n then("der Warenkorb sollte 1 Artikel enthalten") {\n cart.itemCount shouldBe 1\n }\n then("die Gesamtsumme sollte 100 sein") {\n cart.total shouldBe 100.0\n }\n }\n `when`("wir fügen einen Artikel hinzu und wenden 10% Rabatt an") {\n cart.addItem(Item("Buch", 100.0))\n cart.applyDiscount(10.0)\n then("die Endsumme sollte 90 sein") {\n cart.total shouldBe 90.0\n }\n }\n }\n})\n\n\nBeachten Sie die Backticks um when. Dies ist eine Besonderheit von Kotlin: when ist ein reserviertes Wort, funktioniert aber in Anführungszeichen als Bezeichner. Einige Entwickler bevorzugen die Verwendung von When mit Großbuchstaben.
Spek: Strukturiertes BDD für Kotlin
\n\nSpek