Was ist der wahre Aufwand für TDD, wenn das gesamte Team daran gewöhnt ist?

24

Welcher Prozentsatz an Zeit wird durch TDD eingespart und gekostet?

Ich gehe davon aus, dass sich dieser Prozentsatz an Kosten- und Belohnungsänderungen während eines Projektlebenszyklus ändert.

Ich würde mir vorstellen, dass die Anfangsphase viel mehr kostet, aber wenig Belohnungen mit sich bringt. Weiterhin (beim Refactoring ) profitieren Sie von Ihren Tests.

Ich habe gehört, dass 30-50% Ihrer Zeit Unit-Tests schreiben. Dies berücksichtigt jedoch nicht die Zeit, die durch das Schreiben dieser Tests eingespart wurde .

Wie ist die Erfahrung aller damit?

Wir s

BEARBEITEN Was ist die Zeit gespart sowie die Zeitkosten? In Bugfixing und Refactorablity?

Wir s
quelle
Schreiben Sie Tests, bevor Sie Code schreiben, oder schreiben Sie Tests, nachdem ich denke, dass der Overhead vernachlässigbar ist, wie Sie Tests schreiben.
Chris
1
@Chris, wenn Sie zuerst Tests schreiben, entwerfen Sie die API von vornherein und nicht nachträglich.
3
@ Thorbjørn: Stimmte Ihrer Beobachtung zu, obwohl es durchaus möglich ist, eine API ohne TDD zu entwerfen, kaum nachträglich.
Robert Harvey
2
@Steven: Ja, ich weiß was TDD ist. Es ist interessant zu sagen, dass Sie die API von vornherein entwerfen. Das erscheint mir als vernünftige Herangehensweise. Ich war noch nie völlig von der Idee überzeugt, dass man eine API einfach "erweitern" kann, indem man eine Reihe von Tests schreibt.
Robert Harvey

Antworten:

8

Ich habe gehört, dass 30-50% Ihrer Zeit Unit-Tests schreiben. Dies berücksichtigt jedoch nicht die eingesparte Zeit

Nach meiner Erfahrung sind es mehr als 50%.

Sobald Sie den Test geschrieben haben, ist die Lösung in der Regel sehr einfach. Ich halte es nicht für ungewöhnlich, 70% - 75% Ihrer Zeit damit zu verbringen, Tests zu schreiben, aber Sie verbringen viel weniger Zeit damit, den 'Produktionscode' (Code, der getestet wird) zu schreiben und praktisch keine Zeit im Debugger zu verbringen .

Je früher Sie einen Fehler finden, desto billiger ist die Behebung, und TDD hilft dabei enorm. Ich habe an Projekten gearbeitet, bei denen die letzten 2 Monate (eines 8-monatigen Projekts) damit verbracht wurden, Fehler zu beheben, und diese Phase würde mit TDD fast vollständig beseitigt werden.

Für mich liegt der wahre Wert jedoch in der Wartung. Wenn Sie eine Codebasis mit Tests erben, haben Sie weniger Angst, sie zu ändern. Sie haben das Gefühl, dass Sie nichts kaputt gemacht haben, als die Tests noch bestanden wurden. Da Sie keine Angst vor Änderungen haben, sind Sie bereit, Änderungen vorzunehmen, wenn etwas nicht stimmt. Dies bedeutet, dass der Code übersichtlicher gestaltet werden kann, das Design besser passt und theoretisch Änderungen vorgenommen werden können. Vergleichen Sie das mit Voodoo-Code, den jeder anfassen kann.

Brad Cupit
quelle
Wenn die Tests gute Tests sind. Einige sind jedoch besser als keine, und im Allgemeinen können Sie ziemlich schnell feststellen, ob der Test gut ist oder nicht.
Michael K
1
Sie denken also, es gibt echte spürbare Zeiteinsparungen. (2 Monate) pro Beispiel, aber wie viel Zeit wäre für das Testen aufgewendet worden? Gute Antwort übrigens.
Wes
@Wes Es ist so schwer zu wissen. Ich schreibe den zu testenden Code schneller, verbringe aber eine Menge Zeit mit den Tests, die mir helfen, Fehler früher zu finden, was Zeit spart, aber ich weiß nicht, wie viel Zeit es gespart hat, da ich den Fehler nicht gefunden habe spät! Ich persönlich denke, TDD kostet kurzfristig mehr, spart aber langfristig mehr. Je länger das Projekt dauert, desto mehr profitiert es.
Brad Cupit
Verschob dies jetzt auf meine akkreditierte Antwort.
Wes,
15

Jedes Mal, wenn Sie Ihre Komponententests ausführen, sparen Sie sich die Zeit, die Sie zum manuellen Testen Ihres Codes benötigt hätten.

Die 30% bis 50% der Zeit, die Sie für das Schreiben Ihrer Tests angeben, werden auch durch die Vorteile eines besseren (testbaren) Softwaredesigns aufgewogen.


Angenommen, das Schreiben eines automatisierten Tests dauert viermal so lange wie das manuelle Ausführen des Tests. Das bedeutet, dass sich das vierte Mal, wenn Sie Ihren automatisierten Test ausführen, bezahlt macht. Jedes Mal, wenn Sie den automatischen Test danach ausführen, ist dies kostenlos.

Dies gilt unabhängig davon, ob der Test ein automatisierter Komponententest oder ein automatisierter Funktionstest ist. Nicht alle Funktionstests können automatisiert werden, aber viele von ihnen. Außerdem ist der automatisierte Test zuverlässiger als eine Person. Der Test wird jedes Mal auf die gleiche Weise ausgeführt .

Unit-Tests bedeuten, dass Sie die zugrunde liegende Implementierung einer Methode (aus Gründen der Leistung oder aus anderen Gründen) umgestalten können. Die Unit-Tests stellen sicher, dass sich die Funktionalität der Methode nicht geändert hat. Dies gilt insbesondere für TDD, bei dem der Komponententest die Funktionalität der Methode festlegt .

Robert Harvey
quelle
Ich bin nicht davon überzeugt, dass Sie sich manuelle Tests ersparen. TBH. Um sicherzustellen, dass etwas funktioniert, sollten Sie, soweit ich weiß, immer noch Regression anwenden.
Wes
6
Unit-Tests sind Regressionstests. Ich bin mir nicht sicher, was du sagst.
Robert Harvey
2
Unit-Tests und Funktionstests sind beide Formen von Regressionstests. Ich denke, Wes bezieht sich auf Letzteres.
Phil Mander
@ Phil Mander genau richtig. @Robert Harvey Ich meinte Funktionstests, mein Gehirn hat nicht das richtige Wort gefunden. Obwohl ich ziemlich sicher bin, dass mein Unterbewusstsein es getan hat, als ich das Wort funktionell dort verwendete: S Oh und gut, btw.
Wes
Ich denke nicht, dass es wirklich positiv ist, den Test jedes Mal auf die gleiche Art und Weise durchzuführen , da es möglich ist, solche Probleme immer wieder zu übersehen.
Peter Ajtai
5

TDD wird oft eher an der Codequalität gemessen als an Zeit und Kosten. Mit einer besseren Codequalität können Entwickler und alle mit ihnen arbeitenden Personen jedoch besser arbeiten (weniger Zeitaufwand, geringere Kosten, zufriedener usw.). http://davidlongstreet.wordpress.com/2009/04/29/new-software-metric-wtfs-per-minute/

Das Schreiben von Tests ist ideal, um die Überprüfung von funktionalen und nicht funktionalen Anforderungen zu automatisieren. Ein Video, das mich überzeugt hat, TDD zu übernehmen (eigentlich BDD, High Level TDD): http://video.google.com/videoplay?docid=8135690990081075324#

  • Das Schreiben von Funktionstests kann dazu beitragen, Fehler / Probleme bereits in der Entwicklungsphase zu erkennen . Angenommen, Sie haben eine große Codebasis. Bei Komponententests / Spezifikationen muss nur "Alle Tests bestanden" / "2 Tests fehlgeschlagen, siehe Zeile xyz" angezeigt werden. Sie brauchen nur ein Entwicklerteam , um sowohl zu entwickeln als auch zu testen. Ohne Unit-Tests / Spezifikationen müssen Sie gedruckte Anweisungen manuell mit erwarteten Anweisungen vergleichen und manuell nachverfolgen, welche Methoden / Klassen Fehler aufweisen. Dazu benötigen Sie wahrscheinlich zwei separate Teams (Entwickler und Tester) .

  • Schriftliche Tests helfen Entwicklern dabei, Fortschritte und Probleme zu erklären.

  • TDD hilft dabei, die Wartbarkeit, Anpassbarkeit und Flexibilität von Code zu erfüllen. Entwickler werden ermutigt, kleine testbare Blöcke zu schreiben und sie zu größeren testbaren Blöcken zusammenzufügen. Umgekehrt (Teil der Refactoring-Praxis) funktioniert dies auch, sofern wir solide Tests geschrieben haben. Infolgedessen können wir gut geschriebenen, modularen Code haben.

Mit TDD sind wir froh zu wissen, wann:

  • Ein Kunde fordert Änderungen an den Anforderungen an (Erfüllung der Anforderungen)
  • Es werden bessere Möglichkeiten zum Schreiben von Code entdeckt
  • Teamkollegen haben Vorschläge zur Code-Verbesserung
  • Wir müssen unseren Code anderen Leuten erklären / weitergeben

TDD kann langweilig sein, weil der Entwicklungsprozess kleine Schritte erfordert und somit vorhersehbar wird.

n193853
quelle
4

In unserem Fall würde ich schätzen, dass es fast 40% ist. Ich glaube jedoch nicht, dass wir eine Phase durchlaufen haben, in der es noch mehr war. Wir haben einen Code-Generator, der sowohl ein Code-Skelett ausspuckt, das von den Entwicklern ausgearbeitet wird, als auch eine Testsuite, die ebenfalls ausgearbeitet wird. Der größte Teil unserer Testbemühungen besteht darin, geeignete Testdaten aufzuspüren (oder zu erstellen), um sicherzustellen, dass wir eine vollständige Abdeckung erhalten.

TMN
quelle
Handelt es sich um einen selbst entwickelten Codegenerator oder um einen Open-Source-Codegenerator, der in freier Wildbahn erhältlich ist?
Robert Harvey
Es ist eine handgerollte Lösung, die auf den .NET CodeDOM-Klassen basiert.
TMN
3

Die wichtigsten langfristigen Maßnahmen sind nicht nur die Codequalität und das Code-Vertrauen, sondern auch die Tatsache , dass das Team keine sinnlosen Tests durchführt

Die kurzfristigen Maßnahmen wären der ROI der Automatisierung der Tests

Zum Beispiel: Letzte Woche habe ich über 1000 Codeänderungen aufgrund einer Verschiebung der internen Architektur vorgenommen, die automatisierte Testsuite gestartet und bin eingeschlafen.

Die Tests dauerten 28 Minuten. sie alle gingen vorbei. Das manuelle Durchführen derselben über 40 Abnahmetests würde ungefähr 6 Stunden dauern.

Ein weiteres Beispiel: In einer früheren Iteration hatte ich eines der Testszenarien mit einem subtilen Fehler überlistet, den manuelle Tests wahrscheinlich nicht gefunden hätten (die automatisierten Tests führen DB-Integritätsprüfungen durch, die manuelle Tester so gut wie nie durchführen). Ich musste dieses Testszenario ungefähr 50 Mal ausführen, bevor ich es herausfinden und reparieren konnte. Das manuelle Durchführen der Testszenariooperationen würde etwa 50 Minuten dauern. Das sind also 41,6 Arbeitsstunden, die an einem Tag eingespart werden

Es gibt keine Möglichkeit, den ROI automatisierter Tests im Voraus zu berechnen, da Sie nicht genau wissen können, wie oft Sie die Tests ausführen müssen.

Für mich ist der ROI automatisierter Tests nahezu unbegrenzt

Steven A. Lowe
quelle
1
Oh, das ist ein interessanter Punkt. Ich dachte, dass DB-Integritätsprüfungen außerhalb von Unit-Tests sein sollten. Welche anderen Tests außer Unit-Tests führen Sie automatisiert durch?
Wes
1
@Wes: Die Tests in TDD werden als "Einheitentests" bezeichnet, aber lassen Sie sich durch diesen unglücklichen Namen nicht in ihrem Umfang einschränken. Sie dienen zum Testen von Funktionen . Ein Merkmal kann sein, dass 'die foo-Funktion immer null zurückgibt', oder es kann sein, dass 'die gesamte Systemlatenz unter maximaler Last weniger als 12 Pikosekunden betragen muss'.
Steven A. Lowe
0

Es kann sehr hilfreich sein, Komponententests auf komplexe Algorithmen, Fälle, in denen sie automatisch generiert werden können, und Regressionen zu beschränken.

Komponententests leisten oft gute Arbeit bei eher trivialem Code, und das Ändern der Implementierung ist viel billiger, da die Tests nur an die Schnittstelle gekoppelt sind.

Die vollständige Abdeckung mit feinkörnigen Komponententests verursacht einen enormen Aufwand für das Ändern oder Umgestalten einer Implementierung, was genau das ist, was sie für einfach halten.

yeoman
quelle