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?
quelle
main
. In Ihrem Top-Down-Kommentar sprechen Sie von Funktionstests, bei denen das gesamte Programm in einem einzigen ausgeführt wirdmain
.Antworten:
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.
quelle
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 .
quelle
Wenn Sie Ihre Tests nicht zuerst schreiben, treiben Sie die Entwicklung nicht durch Ihre Tests voran. Ergo machst du keine testgetriebene Entwicklung!
quelle
Wenn Sie so arbeiten möchten, machen Sie es. Aber es ist keine testgetriebene Entwicklung.
quelle
Was Sie beschreiben, klingt ähnlich wie der Front-Ahead-Design- Ansatz. Leider ist Front-Ahead Design Alex Papadimoulis 'satirischer Versuch, agile Methoden anzuwenden.
quelle
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.
quelle