Test Driven Development war in den letzten Jahren der letzte Schrei in der .NET-Community. Kürzlich habe ich in der ALT.NET-Community Murren über BDD gehört. Was ist es? Was unterscheidet es von TDD?
Test Driven Development war in den letzten Jahren der letzte Schrei in der .NET-Community. Kürzlich habe ich in der ALT.NET-Community Murren über BDD gehört. Was ist es? Was unterscheidet es von TDD?
Antworten:
Ich verstehe, dass es bei BDD mehr um Spezifikation als um Testen geht . Es ist mit Domain Driven Design verknüpft (lieben Sie diese * DD-Akronyme nicht?).
Es ist mit einer bestimmten Art verbunden, User Stories zu schreiben, einschließlich Tests auf hoher Ebene. Ein Beispiel von Tom ten Thij :
Story: User logging in
As a user
I want to login with my details
So that I can get access to the site
Scenario: User uses wrong password
Given a username 'jdoe'
And a password 'letmein'
When the user logs in with username and password
Then the login form should be shown again
(In seinem Artikel führt Tom diese Testspezifikation direkt in Ruby aus.)
Der Papst von BDD ist Dan North . Eine großartige Einführung finden Sie in seinem Artikel zur Einführung in BDD .
In diesem Video finden Sie einen Vergleich von BDD und TDD . Auch eine Meinung zu BDD als "TDD richtig gemacht" von Jeremy D. Miller
Update vom 25. März 2013
Das obige Video fehlt seit einiger Zeit. Hier ist eine aktuelle von Llewellyn Falco, BDD vs TDD (erklärt) . Ich finde seine Erklärung klar und auf den Punkt.
Für mich ist der Hauptunterschied zwischen BDD und TDD der Fokus und der Wortlaut. Und Worte sind wichtig, um Ihre Absicht zu kommunizieren.
TDD konzentriert sich auf das Testen. Und da in der "alten Wasserfallwelt" Tests nach der Implementierung stattfinden, führt diese Denkweise zu falschem Verständnis und Verhalten.
BDD konzentriert sich auf Verhalten und Spezifikation, sodass Wasserfallgeister abgelenkt werden. BDD wird daher leichter als Entwurfspraxis und nicht als Testpraxis verstanden.
Es scheint zwei Arten von BDD zu geben.
Der erste ist der ursprüngliche Stil, den Dan North diskutiert und der zur Erstellung der xBehave-Stil-Frameworks geführt hat. Für mich gilt dieser Stil hauptsächlich für Abnahmetests oder Spezifikationen für Domänenobjekte.
Der zweite Stil ist das, was Dave Astels populär gemacht hat und was für mich eine neue Form von TDD ist, die einige ernsthafte Vorteile hat. Es konzentriert sich eher auf das Verhalten als auf das Testen und auch auf kleine Testklassen und versucht, an den Punkt zu gelangen, an dem Sie im Grunde eine Zeile pro Spezifikationsmethode (Testmethode) haben. Dieser Stil eignet sich für alle Teststufen und kann mit jedem vorhandenen Unit-Test-Framework durchgeführt werden. Neuere Frameworks (xSpec-Stil) helfen jedoch dabei, das Verhalten zu fokussieren, anstatt es zu testen.
Es gibt auch eine BDD-Gruppe, die Sie möglicherweise nützlich finden:
Testgetriebene Entwicklung ist eine Test-First-Softwareentwicklungsmethode, bei der Testcode geschrieben werden muss, bevor der eigentliche Code geschrieben wird, der getestet werden soll. In Kent Becks Worten:
Der Stil hier besteht darin, ein paar Codezeilen zu schreiben, dann einen Test, der ausgeführt werden sollte, oder noch besser, einen Test zu schreiben, der nicht ausgeführt werden soll, und dann den Code zu schreiben, der ihn ausführen lässt.
Nachdem wir herausgefunden haben, wie man ein kleines Stück Code schreibt, möchten wir jetzt, anstatt nur weiter zu codieren, sofortiges Feedback erhalten und üben, "ein wenig zu codieren, ein wenig zu testen, ein wenig zu codieren, ein wenig zu testen". Also schreiben wir sofort einen Test dafür.
TDD ist also eine einfache technische Methode, mit der Programmierer sauberen Code erstellen, der funktioniert.
Behavior-Driven Development ist eine Methodik, die auf TDD basiert, sich jedoch zu einem Prozess entwickelt hat, der nicht nur Programmierer und Tester betrifft, sondern sich mit dem gesamten Team und allen wichtigen technischen und nichttechnischen Stakeholdern befasst. BDD begann mit ein paar einfachen Fragen, die TDD nicht gut beantwortet: Wie viele Tests sollte ich schreiben? Was soll ich eigentlich testen - und was soll ich nicht? Welche der Tests, die ich schreibe, sind tatsächlich wichtig für das Geschäft oder die Gesamtqualität des Produkts, und welche sind nur meine Überentwicklung?
Wie Sie sehen, erfordern solche Fragen die Zusammenarbeit zwischen Technologie und Unternehmen. Geschäftsinteressenten und Domain-Experten können Ingenieuren häufig sagen, welche Art von Tests nützlich erscheinen - aber nur, wenn es sich bei den Tests um Tests auf hoher Ebene handelt, die sich mit wichtigen Geschäftsaspekten befassen. BDD nennt solche geschäftsmäßigen Tests „Beispiele“ wie in „Nennen Sie mir ein Beispiel für das korrekte Verhalten dieser Funktion“ und reserviert das Wort „Test“ für technische Überprüfungen auf niedriger Ebene wie Datenvalidierung oder Testen von API-Integrationen. Der wichtige Teil ist, dass Tests zwar nur von Programmierern und Testern erstellt werden können, Beispiele jedoch vom gesamten Bereitstellungsteam gesammelt und analysiert werden können - von Designern, Analysten usw.
In einem Satz ist eine der besten Definitionen von BDD, die ich bisher gefunden habe , dass es bei BDD darum geht, „Gespräche mit Domain-Experten zu führen und anhand von Beispielen ein gemeinsames Verständnis des gewünschten Verhaltens zu erlangen und Unbekanntes zu entdecken“. Der Entdeckungsteil ist sehr wichtig. Je mehr Beispiele das Lieferteam sammelt, desto mehr verstehen sie den Geschäftsbereich und verringern so die Unsicherheit über einige Aspekte des Produkts, mit dem sie sich befassen müssen. Mit abnehmender Unsicherheit nehmen Kreativität und Autonomie des Lieferteams zu. Zum Beispiel können sie jetzt ihre eigenen Beispiele vorschlagen, die die Geschäftsanwender aufgrund ihres Mangels an technischem Fachwissen nicht für möglich hielten.
Gespräche mit Geschäfts- und Domain-Experten zu führen, klingt großartig, aber wir alle wissen, wie oft dies in der Praxis endet. Ich habe meine Reise mit Technik als Programmierer begonnen. Als Programmierer lernen wir , Code zu schreiben - Algorithmen, Entwurfsmuster, Abstraktionen. Oder wenn Sie Designer sind, wird Ihnen das Entwerfen beigebracht- Informationen organisieren und schöne Schnittstellen erstellen. Aber wenn wir unsere Einstiegsjobs bekommen, erwarten unsere Arbeitgeber von uns, dass wir "den Kunden einen Mehrwert bieten". Und unter diesen Kunden kann zum Beispiel ... eine Bank sein. Aber ich konnte so gut wie nichts über Bankgeschäfte wissen - außer wie ich meinen Kontostand effizient senken kann. Also müsste ich irgendwie das, was von mir erwartet wird, in Code übersetzen ... Ich müsste eine Brücke zwischen dem Bankgeschäft und meinem technischen Know-how schlagen, wenn ich irgendeinen Wert liefern will. BDD hilft mir dabei, eine solche Brücke auf einem stabilen Fundament der fließenden Kommunikation zwischen dem Lieferteam und den Domain-Experten zu bauen.
Mehr erfahren
Wenn Sie mehr über BDD lesen möchten, habe ich ein Buch zu diesem Thema geschrieben. In „Schreiben großartiger Spezifikationen“ wird die Kunst des Analysierens von Anforderungen untersucht und Sie lernen, wie Sie einen großartigen BDD-Prozess erstellen und Beispiele als Kernbestandteil dieses Prozesses verwenden. Das Buch spricht über die allgegenwärtige Sprache, das Sammeln von Beispielen und das Erstellen sogenannter ausführbarer Spezifikationen (automatisierte Tests) aus den Beispielen - Techniken, die BDD-Teams dabei helfen, großartige Software pünktlich und im Rahmen des Budgets bereitzustellen.
Wenn Sie sich für den Kauf von „Writing Great Specifications“ interessieren, können Sie mit dem Promo-Code 39nicieja2 39% sparen :)
Ich habe ein wenig mit dem BDD-Ansatz experimentiert und meine vorzeitige Schlussfolgerung lautet, dass BDD für die Implementierung von Anwendungsfällen gut geeignet ist, jedoch nicht für die zugrunde liegenden Details. TDD rockt immer noch auf diesem Level.
BDD wird auch als Kommunikationsmittel verwendet. Ziel ist es, ausführbare Spezifikationen zu schreiben, die von den Domain-Experten verstanden werden können.
Behavior Driven Development scheint sich mehr auf die Interaktion und Kommunikation zwischen Entwicklern sowie zwischen Entwicklern und Testern zu konzentrieren.
Der Wikipedia-Artikel hat eine Erklärung:
Verhaltensorientierte Entwicklung
Ich übe BDD nicht selbst.
Betrachten Sie den Hauptvorteil von TDD als Design. Es sollte Test Driven Design heißen. BDD ist eine Teilmenge von TDD und wird als verhaltensgesteuertes Design bezeichnet.
Betrachten Sie nun eine beliebte Implementierung von TDD - Unit Testing. Die Einheiten in Unit Testing sind normalerweise ein Stück Logik, das die kleinste Arbeitseinheit darstellt, die Sie ausführen können.
Wenn Sie diese Einheiten auf funktionale Weise zusammensetzen, um das gewünschte Verhalten für die Maschinen zu beschreiben, müssen Sie das Verhalten verstehen, das Sie für die Maschine beschreiben. Behavior Driven Design konzentriert sich auf die Überprüfung des Verständnisses der Implementierer für die Anwendungsfälle / Anforderungen / Was auch immer und überprüft die Implementierung der einzelnen Funktionen. BDD und TDD dienen im Allgemeinen dem wichtigen Zweck, das Design zu informieren, und dem zweiten Zweck, die Richtigkeit der Implementierung zu überprüfen, insbesondere wenn sie sich ändert. Richtig gemachtes BDD beinhaltet biz und dev (und qa), während Unit-Tests (möglicherweise fälschlicherweise als TDD und nicht als eine Art von TDD angesehen) normalerweise im dev-Silo durchgeführt werden.
Ich würde hinzufügen, dass BDD-Tests als Lebensbedürfnisse dienen.
BDD ist weitgehend TDD richtig gemacht. BDD bietet jedoch einen zusätzlichen Wert. Hier ist ein Link dazu:
Es gibt keinen Unterschied zwischen TDD und BDD. außer Sie können Ihre Tests besser lesen und sie als Anforderungen verwenden. Wenn Sie Ihre Anforderungen mit denselben Worten schreiben wie BDD-Tests, können Sie von Ihrem Kunden einige Ihrer Tests definieren, die zum Schreiben von Code definiert sind.
Unterschied zwischen testgetriebener Entwicklung (TDD) und verhaltensgetriebener Entwicklung (BDD)
BDD konzentriert sich eher auf den Verhaltensaspekt des Systems als auf den
Implementierungsaspekt des Systems, auf den sich TDD konzentriert.
BDD gibt ein klareres Verständnis dafür, was das System
aus Sicht des Entwicklers und des Kunden tun sollte . TDD
gibt dem Entwickler nur ein Verständnis dafür, was das System tun sollte.
Mit BDD können Entwickler und Kunde gemeinsam an einer Anforderungsanalyse arbeiten, die im Quellcode des Systems enthalten ist.
Kurz gesagt, es gibt einen großen Unterschied zwischen TDD und BDD. Bei TDD konzentrieren wir uns hauptsächlich auf Testdaten. Bei BDD liegt unser Hauptaugenmerk auf dem Verhalten des Projekts, damit jede nicht programmierende Person die Codezeile im Namen des Titels von verstehen kann diese Methode
Hier ist der kurze Schnappschuss:
TDD ist nur der Prozess des Testens von Code vor dem Schreiben!
DDD ist der Prozess, bei dem vor jedem Zyklus des Berührens von Code über die Domain informiert wird!
BDD ist eine Implementierung von TDD, die einige Aspekte von DDD einbezieht!