Wenn Code zur Geschichte wird
\nStellen Sie sich vor: Sie schreiben Code in Go, führen Tests aus – grüner Balken. Aber Ihr Manager sieht Ihr t.Errorf und versteht nicht, was genau kaputtgegangen ist. Das Geschäft sagt: „Machen Sie es so, dass sich ein Benutzer registrieren kann“, und der Entwickler übersetzt das in „POST /api/v1/user mit E-Mail-Validierung“. Die Kluft zwischen technischer und menschlicher Sprache ist der Hauptkopfschmerz vieler Projekte.
Es gibt eine Lösung – BDD (Behaviour-Driven Development) in Go. Das sind nicht nur Tests. Es ist eine Brücke zwischen Code und Geschäftslogik. In diesem Artikel werden wir uns ansehen, wie man BDD-Tests in Go mit realen Beispielen schreibt und warum Ihr Produktmanager Ihnen dankbar sein wird.
\n\nWas ist BDD und warum Go?
\nBehaviour-Driven Development (verhaltensgetriebene Entwicklung) ist eine Weiterentwicklung von TDD. Während sich TDD auf das „Wie“ konzentriert (wie eine Funktion implementiert wird), beantwortet BDD das „Was“ (was das System aus Benutzersicht tun soll).
\nGo ist ideal für BDD aufgrund seiner Einfachheit, des integrierten Pakets testing und leistungsstarker Frameworks wie Ginkgo und Godog. Die Go-Community nutzt BDD aktiv für Microservices, APIs und sogar CLI-Tools.
Schlüsselprinzipien von BDD in Go
\n- \n
- Einheitliche Sprache (Ubiquitous Language) – Szenarien werden in für das Geschäft verständlichem Englisch oder Deutsch geschrieben. \n
- Given-When-Then – Struktur jedes Szenarios: Vorbedingungen → Aktion → erwartetes Ergebnis. \n
- Automatisierung – Szenarien werden in ausführbare Go-Tests umgewandelt. \n
Tools für BDD in Go
\nDie Wahl des Frameworks hängt davon ab, wie Sie Szenarien beschreiben möchten. Hier sind zwei Hauptansätze:
\n\n1. Ginkgo + Gomega (für Go-Entwickler)
\nGinkgo ist ein BDD-Framework, das in reinem Go geschrieben wird. Szenarien sehen aus wie Go-Code mit lesbaren Beschreibungen. Gomega ist eine Matcher-Bibliothek für Assertions.
\nVorteile: volle Kontrolle über den Code, hervorragende Integration mit Go-Tools, Unterstützung für asynchrone Tests.
\n\n2. Godog (Cucumber für Go)
\nGodog ist eine Implementierung von Cucumber in Go. Sie schreiben Szenarien in Gherkin (Feature-Dateien in natürlicher Sprache) und implementieren dann die Schritte in Go.
\nVorteile: Szenarien werden auch von Nicht-Programmierern gelesen, Logik kann einfach geändert werden, ohne den Code anzupassen.
\n\nPraxis: BDD-Test in Go mit Ginkgo schreiben
\nLassen Sie uns einen einfachen Dienst erstellen – einen Warenkorb für einen Online-Shop. Wir schreiben einen BDD-Test, der das Hinzufügen eines Artikels überprüft.
\n\nSchritt 1: Installation von Ginkgo
\ngo get github.com/onsi/ginkgo/v2\ngo get github.com/onsi/gomega\n\nSchritt 2: Initialisierung des Testpakets
\ncd mycart\nginkgo bootstrap\nEs wird die Datei mycart_suite_test.go erstellt.
Schritt 3: Szenario schreiben
\nErstellen wir die Datei cart_test.go:
package mycart_test\n\nimport (\n . "github.com/onsi/ginkgo/v2"\n . "github.com/onsi/gomega"\n "mycart"\n)\n\nvar _ = Describe("Warenkorb", func() {\n var cart *mycart.Cart\n\n BeforeEach(func() {\n cart = mycart.NewCart()\n })\n\n Describe("Artikel hinzufügen", func() {\n Context("mit korrekter ID und Preis", func() {\n It("sollte die Anzahl der Artikel um 1 erhöhen", func() {\n cart.AddItem("sku-123", 100.0)\n Expect(cart.TotalItems()).To(Equal(1))\n })\n\n It("sollte den Gesamtbetrag korrekt berechnen", func() {\n cart.AddItem("sku-123", 100.0)\n cart.AddItem("sku-456", 250.0)\n Expect(cart.TotalPrice()).To(BeNumerically("~", 350.0, 0.01))\n })\n })\n\n Context("mit einem bereits vorhandenen Artikel", func() {\n It("sollte die Menge erhöhen, anstatt einen neuen Artikel hinzuzufügen", func() {\n cart.