Müssen Sie BDD / TDD wirklich zuerst testen?

11

Obwohl ich nicht in einem TDD- oder BDD-Projekt war oder in einigen, die sagen, dass sie TDD machen, aber ziemlich weit davon entfernt sind, sind dies Dinge, über die ich nachdenke und die ich wirklich versuche, so viel wie möglich zu lesen Über.

Zurück zur Frage. Wenn Sie BDD machen, sollten Sie zuerst Ihren "Test" schreiben und ihn zum Scheitern bringen, oder? Und dann implementieren Sie diese Funktion oder wie Sie es nennen. Aber wenn Sie dies auf die Spitze treiben, könnte dies nicht eine Art Top-Down-Entwicklung sein? Sie sehen sich Ihre Benutzeroberfläche an und sagen: "Ich möchte diese Funktion / dieses Verhalten hier haben." Anschließend korrigieren Sie Ihre Benutzeroberfläche, um diese Funktion und den Code zu implementieren, der die Benutzeroberfläche unterstützt. Zu diesem Zeitpunkt haben Sie noch keine Geschäftslogik oder Datenzugriffslogik implementiert, sondern nur Ihr Verhalten implementiert. Was ich anstrebe, anstatt zuerst den Test zu schreiben, schreiben Sie zuerst Ihren UI-Code. In einigen Fällen sollte dies zu demselben Code für den Datenzugriff und die Geschäftsschicht führen, da Sie Ihren UI-Code verwenden, um zu definieren, was Ihr Unternehmen unterstützen muss.

Natürlich sollten Sie dies durch Tests ergänzen, mit denen sichergestellt wird, dass die Funktion ordnungsgemäß funktioniert.

Irgendwelche Gedanken?

Tomas Jansson
quelle
Die Tests unter TDD sind Einheit Tests, die das Modul direkt fahren, als wenn es durch eine separate war main. In Ihrem Top-Down-Kommentar sprechen Sie von Funktionstests, bei denen das gesamte Programm in einem einzigen ausgeführt wird main.
Macneil
@Macneil: Ich spreche nicht über Funktionstests, die das gesamte Programm testen, obwohl Sie Ihr Programm von oben nach unten implementieren / entwerfen, sollten Sie dennoch einen Komponententest für Ihren gesamten öffentlichen Code implementieren. Nur weil Sie es von oben nach unten tun, heißt das nicht, dass Sie nicht verschiedene Ebenen abstrakt machen können, sodass Sie alle Ebenen für sich isolieren können.
Tomas Jansson
1
@ Macneil: Dies ist ein häufiges Missverständnis. TDD-Tests sind keine Unit- Tests. TDD testet Funktionen , für die keine Skalierung festgelegt wurde.
Steven A. Lowe
2
Es gibt jedoch eine festgelegte Skala: Der Test muss in TDD schnell ausgeführt werden. Es müssen Tests durchgeführt werden, die ebenfalls nicht in den Anwendungsbereich von TDD fallen. Insgesamt ist TDD ein Entwicklungsplan, kein Testplan.
Macneil
@ Macneil: "schnell" ist ein relativer Begriff. Die Testsuite in meinem letzten Projekt wird in ungefähr 30 Minuten ausgeführt. Es ersetzt 8 Stunden manuelles Testen. Das ist "schnell" genug!
Steven A. Lowe

Antworten:

8

Sie sprechen über BDD aus einer hochrangigen Perspektive beim Testen Ihrer Benutzeroberfläche. Das Testen ist auf dieser Ebene etwas flockiger als weiter unten in Ihrem Javascript / Server-Code.

In mehreren Büchern, die ich über TDD gelesen habe, heißt es, Sie sollten Code so schreiben, als ob die zugrunde liegenden Systeme vorhanden wären, und nur so viel schreiben, dass Ihr Test bestanden wird. Sie können Stubs auf den Server schreiben, damit Ihre UI-Verhaltenstests bestanden werden. Dann beginnen Sie an dieser Stichnaht, schreiben einige Komponententests für Ihren serverseitigen Code und arbeiten sich bis zu einer vollständigen Implementierung vor.

Ich codiere oft so, als ob zugrunde liegende Ebenen existieren, um einen Test auf hoher Ebene zu bestehen. Es fühlt sich an, als würde man in ein Kaninchenloch gehen und viele andere Klassen extrahieren, um den Test auf hoher Ebene zu bestehen, und dann Tests für diese niedrigeren Ebenen schreiben. Wie Sie bereits erkannt haben, ist es hilfreich, sich auf Tests höherer Ebenen zu konzentrieren.

Wie jeder erfahrene Programmierer weiß, hat die Softwareentwicklung viele Ebenen. Ich arbeite in der Regel niedriger als die Benutzeroberfläche und denke über die Daten oder das Verhalten nach, die meine Benutzeroberfläche vom Server benötigt, und beginne dort (möglicherweise, weil ich heutzutage nicht viel mit der Benutzeroberfläche arbeite).

Wenn ich wirklich ehrlich bin, bedeutet das Extrahieren einer Klasse aus den zugrunde liegenden Ebenen, dass ich nicht zuerst einen Test durchführe, sondern ... innerhalb von Minuten oder manchmal Stunden einen Test für diesen Code durchführe. Dies ist für mich immer noch von Vorteil, da ich Ihnen dabei helfen kann, herauszufinden, wo Sie möglicherweise Abhängigkeiten für eine Klasse bereitstellen und das Prinzip der Einzelverantwortung einhalten müssen. Wenn es schwierig ist, dies zu testen, tun Sie zu viel an einem Ort usw.

Greg K.
quelle
Ich glaube, Du hast recht. Dies wurde mir klar, als ich diesen Sommer Ruby on Rails ausprobierte. Dort gibt es einen Bdd-Test, der die Benutzeroberfläche steuert und später die Implementierung der zugrunde liegenden Klassen steuert.
Tomas Jansson
17

Ja! Ansonsten erhalten Sie entwicklungsgetriebene Tests .

Realistisch gesehen gibt es jedoch Probleme, die mit "reinem" TDD nur schwer zu lösen sind. Sie könnten produktiver schreiben, indem Sie einen nicht abgedeckten Produktionscode im Voraus schreiben und ihn später mit Tests abdecken (und lernen, wie Sie in Zukunft ähnliche Probleme mit TDD angehen können). Schauen Sie sich diese Technik an , die der Autor aus Mangel an einem besseren Begriff als TDD zum Spülen und Wiederholen bezeichnet hat .

Azheglov
quelle
3
Die erste Zeile ist großartig.
EpsilonVector
Im Vergleich zu TDD ist das wahr, aber Dinge von oben nach unten zu tun, sollte ziemlich gut mit BDD übereinstimmen, oder? Ich schaue auf die GUI und spezifiziere das gewünschte Verhalten, sicher schreibe ich den "Verhaltenstest" nicht sofort, aber ich habe das Verhalten über die Benutzeroberfläche spezifiziert, bevor ich es implementiert habe.
Tomas Jansson
15

Wenn Sie Ihre Tests nicht zuerst schreiben, treiben Sie die Entwicklung nicht durch Ihre Tests voran. Ergo machst du keine testgetriebene Entwicklung!

Frank Shearar
quelle
Um fair zu sein, ist die Frage nicht mehr, ob wir bei BDD (nicht TDD) zuerst den Test schreiben sollten?
Bytedev
Fühlen Sie sich frei, "Test" durch "Verhalten" zu ersetzen. Ich habe nichts gesehen, was mich davon überzeugen könnte, dass es im Herzen einen großen Unterschied zwischen TDD und BDD gibt. Konzentrieren Sie sich vielleicht. Aber die Kernidee? Nicht so viel.
Frank Shearar
Stimmen Sie nicht mit der Tatsache überein, dass Sie keine testgetriebene Entwicklung durchführen. Sie tun dies nicht gemäß der Definition des Schlüsselbegriffs, aber solange Sie Tests für Ihren Code entwickeln, wird Ihr Code definitiv von den Tests gesteuert, unabhängig davon, wann Sie sie schreiben.
Alternative
TDD bedeutet speziell , Tests vor dem Code zu schreiben. Wenn Ihnen das nicht gefällt, wenden Sie sich an Kent Beck, der den Begriff erfunden hat. Wenn Sie Tests schreiben, nachdem Ihr Code Ihren Code in gewissem Maße beeinflusst hat, können Sie sich dennoch täuschen, dass Sie Ihr Code-Design durch Tests steuern, wenn Sie dies nicht tun. Und es ist schwieriger, diese Tests zu schreiben, da Sie häufig nicht getesteten Code ändern müssen . Ich habe es zu oft gesehen, um es zu erwähnen.
Frank Shearar
@FrankShearar Ich habe anerkannt, dass es nicht TDD ist, wie Kent Beck gesagt hat, aber ehrlich gesagt ist es mir egal, was eine zufällige Person gesagt hat. Es ist durchaus möglich, das Code-Design durch Tests zu steuern, ohne die Tests zuerst zu schreiben.
Alternative
4

Wenn Sie so arbeiten möchten, machen Sie es. Aber es ist keine testgetriebene Entwicklung.

Don Roby
quelle
3

Was Sie beschreiben, klingt ähnlich wie der Front-Ahead-Design- Ansatz. Leider ist Front-Ahead Design Alex Papadimoulis 'satirischer Versuch, agile Methoden anzuwenden.

user281377
quelle
Ich habe mich gefragt, ob Sie Artikel kennen, die sich bei FAD wehren und dessen satirischen Stich entlarven.
CL22
3

Persönlich glaube ich, dass es wichtig ist, über Tests während der Entwurfsphase nachzudenken. Es ist wirklich toll, eine funktionierende Implementierung zu haben, aber Sie können nur dann sicher sein, dass Sie ein funktionierendes Produkt haben, wenn Sie es Stück für Stück getestet haben. Die Möglichkeit, dies abzudecken, besteht in einer Kombination aus Unit-Tests und einem qualifizierten QS-Team, das partnerschaftlich zusammenarbeitet.

Nun liegt es an Ihnen, wie Sie diese Disziplin in Ihrem Team installieren. TDD ist eine solche Strategie - und eine, die ihren Platz hat, und es gibt viele andere Variationen. TDD eignet sich jedoch nicht besonders für die Entwicklung des UI-Layouts.

Michael Shaw
quelle