Lass mich zuerst aus dem Schrank kommen. Ich bin ein TDD-Gläubiger. Ich versuche, Test Driven Development so viel wie möglich zu üben.
Einige Entwickler bei meiner Arbeit weigern sich, es überhaupt auszuprobieren. Ich selbst habe TDD mit dem Versuch begonnen, einem meiner Kollegen zu beweisen, dass Test Driven Development eine schlechte Idee ist. Die Argumente sind:
Was ist das beste pro TDD-Argument, das Sie gehört oder benutzt haben?
Siehe auch: Was ist der beste Grund für Komponententests?
TDD ist ein "Bezahlen Sie mich jetzt oder zahlen Sie mich später" -Konkurrenz. Wenn Sie nur die Zeit vom Beginn des Codierens bis zum Einchecken Ihres Codes zählen, dauert TDD oft länger, insbesondere wenn Sie TDD zuerst lernen. Die Auszahlung kommt später während der Testphase und auch in zukünftigen Kodierungsrunden.
Für die Testphase habe ich das mit TDD gefunden:
Der Code selbst hatte die folgenden Eigenschaften:
Als ich anfing, wie ein Client des Codes zu denken, war der Code tendenziell einfacher zu verwenden. (Dies ist einer der Vorteile, zuerst Tests zu schreiben).
Der Code ist einfacher zu testen.
Das Schreiben von Komponententests ist einfacher (und in vielen Fällen mehr Spaß) kurz davor als danach, so dass mehr Tests geschrieben werden.
Der Code ist leichter zu refaktorieren und aufzuräumen. Dies galt insbesondere für Python, wo automatische Refactoring-Tools eine größere Schwierigkeit haben.
Aus diesem Grund war es, als es an der Zeit war, den Code erneut zu lesen, einfacher zu verstehen und leichter zu ändern, und wir hatten zumindest einige Regressionstests bereits durchgeführt.
Was dies bedeutet, ist, dass die Amortisation für TDD-Zeit später Monate sein kann. Außerdem ist das Starten von TDD mit Legacy-Code besonders schwierig. Dann braucht es Zeit, um zu lernen, wie man gute Tests schreibt (ein schlechtes Testset kann entweder ungenügend sein oder schlimmer, spröde zu sein, was es schwieriger macht, Refaktorierungen zu machen) und wie man ein komplexes System unter Test bekommt.
>Ich muss zugeben, dass ich nicht wirklich in der Lage war, zu viele andere Leute dazu zu bringen, zu TDD zu wechseln. Ich denke, dass ich größtenteils gewechselt habe, weil ich eine einfachere Art des Testens wollte und auch die Möglichkeit hatte, mit einer kleinen Code-Basis und einem persönlichen Projekt zu lernen.
Vielleicht wissen sie es besser.
Komponententests von Entwicklern ist eine äußerst nützliche Methode, und ich kann seine Vorteile nicht überbewerten, nicht nur während der anfänglichen Entwicklung, sondern auch während des Refactorings, wenn Komponententests nicht nur gewöhnliche Codefehler, sondern auch den Bruch früh erkennen können von Annahmen, die von Entwicklern gemacht wurden, die nie in der formellen Dokumentation erfasst wurden und daher wahrscheinlich verloren sind, wenn das Refactoring stattfindet.
TDD ist also kein Zaubereistaub:
Ich verstehe, dass ich jetzt zu Tode geärgert werde, um dies zu veröffentlichen, aber was zum Teufel, wen interessiert das ...
Kein Argument wird jemanden dazu bringen, TDD zu benutzen.
Sie müssen sie zeigen und die Vorteile demonstrieren. Es ist einfacher, jemandem das Licht zum Vorschein zu bringen, indem man eher zeigt als erzählt.
Verschiedene Menschen werden auf unterschiedliche Weise überzeugt sein (oder auch nicht), also ist die einzige ehrliche Antwort "es kommt darauf an".
Eine Möglichkeit, die ich schon mehrmals gesehen habe, ist, mit jemandem zusammen zu sitzen, nachdem er sich mit einem Stück Code herumgeschlagen hat, und ihn mit TDD neu zu erstellen. Der resultierende Code ist normalerweise kleiner und klarer.
Ich übe TDD nicht. Obwohl ich sehe, wie es gut ist, wenn Sie komplexe Projekte haben, in denen Sie viele verschiedene Testfälle testen müssen, sehe ich keinen großen Vorteil darin, sie beispielsweise in einer einfachen Webanwendung zu verwenden.
Eine Art, wie jemand mich davon überzeugen könnte, TDD zu benutzen, wäre, wenn wir das gleiche Projekt machen und sie Seite an Seite machen, sehen, wer bessere Ergebnisse erzielt und wer die Aufgabe schneller erledigt.
Passen Sie mit ihnen zusammen. Man muss es nicht "Paarprogrammierung" nennen - das ist für jemanden, der nur widerwillig ist, "radikale" Techniken wie TDD zu betrachten, gruselig - aber wenn Sie beide an einem Schreibtisch sitzen und an demselben Problem arbeiten, ist es einfach demonstrieren den Wert von TDD. Das kann nicht das Ende des Gesprächs sein, aber es ist ein höllischer Anfang. Gibt Ihnen Glaubwürdigkeit für den Rest der Konversation und gibt Ihnen etwas Echtes als Grundlage für weitere Diskussionen.
Der "aha" -Moment für mich war das Lesen von Kapitel 2 von "Test-Driven Development in Microsoft.Net" von James Newkirk. (Nicht dass der Rest des Buches nicht wichtig wäre ... er widmet mehrere Kapitel dem Aufbau einer mehrstufigen Anwendung in TDD).
Er erstellt einen einfachen Stapel, aber Sie können sehen, dass der Code seine Komplexität "entwickelt", anstatt komplex zu beginnen.
Selbst dann werden Sie immer noch Schwierigkeiten haben, Neinsager zu überzeugen, denn es scheint, dass TDD viel mehr Arbeit erfordert als traditionelle Programmierung. Die meisten Anti-TDD-Entwickler vergessen jedoch, zumindest nach meiner Erfahrung, die Entwicklungszeit für Unit-Tests am Ende zu berücksichtigen.
Die aufgeführten Argumente sind keine rationalen, logischen Argumente. Sie haben keine Gründe hinter ihnen (es sei denn, Sie haben nur viel längere echte Argumente zusammengefasst.)
Als solcher denke ich nicht, dass Sie in der Lage sein werden, jemanden zu überzeugen, der diese Behauptungen mit eigenen rationalen Argumenten macht. Der beste Weg wird sein, an die Quelle ihrer Argumente zu appellieren; Erfahrung. Entweder lassen Sie sie TDD vorläufig verwenden, um zu sehen, was sie davon halten, oder aber arbeiten TDD selbst, das ist eindeutig eine sehr gute Arbeit, und präsentieren Sie es als ein Beispiel für sie.
(Ich bin kein TDD-Gläubiger. Das ist ein praktischer Weg, um mich davon zu überzeugen, dass es eine gute Idee war.)
Als professioneller Entwickler seit mehr als 10 Jahren ist das beste Argument, das ich vorbringen kann, dass sogar ich meine Fehler gefunden habe, bevor ich wirklich in der Lage war, die Anwendung "auszuführen".
Ich fand auch, dass das Design meines Codes robuster und einfacher zu ändern war, und es gab mir mehr Vertrauen in die Refactoring.
"Ziemlich erfolgreich" ist nicht gleich "Wirklich erfolgreich".
Der andere große Vorteil besteht darin, dass ich keine Testkabel mehr schreiben muss, da die Unit Test-Läufe effektiv zu meinem Testkabelbaum werden.
Zeigen Sie ihnen diese Präsentation. Es hat mich verkauft.
Jeder Programmierer, der jemals mit einer wirklich komplexen Aufgabe mit vielen Randbedingungen konfrontiert wurde, sollte den Wert von TDD sehen können. Wenn es darum geht, sicherzustellen, dass eine Suchmaschine bestimmten Strings entspricht, ist TDD der einzige Weg, um während der Wartung gesund zu bleiben - der einzige Weg, um sicher zu sein, dass Sie einen Fall behoben haben, ohne einige andere zu brechen ist mit automatisierten Tests.
Tags und Links unit-testing tdd