Gibt es harte Beweise für den ROI von Unit-Tests?

127

Unit-Tests klingen für mich großartig, aber ich bin mir nicht sicher, ob ich Zeit damit verbringen sollte, sie wirklich zu lernen, es sei denn, ich kann andere davon überzeugen, dass dies von erheblichem Wert ist. Ich muss die anderen Programmierer und vor allem die Bean-Counter im Management davon überzeugen, dass sich die zusätzliche Zeit, die für das Erlernen des Test-Frameworks, das Schreiben von Tests, das Aktualisieren usw. aufgewendet wird, amortisiert.

Welchen Beweis gibt es? Hat jemand tatsächlich dieselbe Software mit zwei separaten Teams entwickelt, eines mit Unit-Tests und das andere nicht, und die Ergebnisse verglichen? Ich bezweifle das. Soll ich es nur mit "Nachschlagen im Internet, alle reden darüber, also muss es das Richtige sein" rechtfertigen?

Wo sind die harten Beweise, die die Laien davon überzeugen, dass Unit-Tests die Mühe wert sind?

Rabe
quelle

Antworten:

98

Ja. Dies ist ein Link zu einer Studie von Boby George und Laurie Williams bei NCST und einer anderen von Nagappan et al. Ich bin sicher, es gibt noch mehr. Dr. Williams- Veröffentlichungen zu Tests bieten möglicherweise einen guten Ausgangspunkt, um sie zu finden.

[EDIT] Die beiden obigen Veröffentlichungen beziehen sich speziell auf TDD und zeigen eine 15-35% ige Verlängerung der anfänglichen Entwicklungszeit nach der Einführung von TDD, aber eine 40-90% ige Abnahme der Defekte vor der Freisetzung. Wenn Sie nicht auf die Volltextversionen zugreifen können, empfehle ich die Verwendung von Google Scholar , um festzustellen, ob Sie eine öffentlich verfügbare Version finden.

Tvanfosson
quelle
14
Die erste Studie vergleicht agile + TDD mit Wasserfallprojekten. Die Ergebnisse wären relevanter, wenn zwei agile Teams verglichen worden wären. Die zweite Studie erwähnt andere Studien, die wenig bis gar keinen Qualitätsbonus für TDD-Projekte fanden. Wenn Sie die Schätzungen des Managements über die für TDD benötigte zusätzliche Zeit vergleichen, wird diese für die beiden Teams mit hoher Fachkompetenz erheblich höher eingeschätzt, sie haben jedoch auch eine um 20% geringere Testabdeckung. Dies bestätigt meine eigene Erfahrung. Ich finde die Sicherheit in Systemen, mit denen ich noch nicht gearbeitet habe, viel wichtiger, während das Testen für alles andere ein Hindernis darstellt.
LearnCocos2D
Keine der Studien vergleicht ein vergleichbares Prozessmodell nur mit der Änderung der Testmethofologie. Das heißt, die Zeit, die für UT verwendet wird, wird tatsächlich besser für z. Systemtests. So wie es aussieht, könnte es genauso gut sein, "wenn wir klüger testen, hilft das".
Rune FS
1
Was ist, wenn die Kosten für die Behebung der Fehler nach der Veröffentlichung 0,01% der gesamten Entwicklung betragen? TDD wäre in diesem Fall eine schreckliche Investition. Und wenn es nur wenige Fehler gibt? Diese% s bedeuten nichts ohne Kontext. Um fair zu sein, muss ich noch die ganze Studie lesen. Aber so wie es aussieht, ist Ihr Beitrag nützlich (gute Links), beantwortet aber nicht die Frage bezüglich ROI, IMO.
Instine
1
@ Instin Zum Glück (?) Gibt es gute Beweise dafür, dass dies nicht der Fall ist. Das Beheben von Fehlern nach der Veröffentlichung ist exponentiell teurer als das Beheben von Fehlern zu Beginn der Entwicklung (was TDD auch tut). In diesem Zusammenhang sind Kosten von 0,01% der Gesamtentwicklung für alle Fehler nach der Veröffentlichung unwahrscheinlich. (Einzelheiten siehe Code Complete , insbesondere Boehm & al. , "Understanding and Controlling Software Costs", IEEE Trans Softw Eng (1988)).
Konrad Rudolph
Es ist wahrscheinlich erwähnenswert, dass die erste Studie eine Stichprobengröße von 24 Programmierern hat (die paarweise arbeiten, also 12 Teams). Ich bin mir nicht sicher, was eine statistisch gültige Stichprobengröße wäre, aber diese scheinen niedrig zu sein. Vielleicht weiß es jemand anderes?
Zachary Yates
29

"Ich muss die anderen Programmierer und vor allem die Bean-Counter im Management davon überzeugen, dass sich all die zusätzliche Zeit, die für das Erlernen des Test-Frameworks, das Schreiben von Tests, das Aktualisieren usw. aufgewendet wird, amortisiert. ""

Warum?

Warum nicht einfach leise und diskret? Sie müssen nicht alles auf einmal tun. Sie können dies in kleinen Stücken tun.

Das Framework-Lernen nimmt sehr wenig Zeit in Anspruch.

Das Schreiben eines Tests, nur eines, nimmt sehr wenig Zeit in Anspruch.

Ohne Unit-Tests haben Sie nur ein gewisses Vertrauen in Ihre Software. Mit einem Komponententest haben Sie immer noch Ihr Vertrauen und den Nachweis, dass mindestens ein Test bestanden wurde.

Das ist alles was es braucht. Niemand muss wissen, dass Sie es tun. Mach es einfach.

S.Lott
quelle
9
Die Bohnenzähler konnten einen Unit-Test nicht vom Rest des Codes unterscheiden, wenn ihr Leben davon abhing. Ich unterstütze den Vorschlag, es einfach zu tun. Es gibt jedoch eine Einschränkung: Wenn Sie nicht allein sind, brauchen Sie Ihre Entwicklerkollegen, um diese Praxis zu akzeptieren. Wenn nicht, werden Ihre Tests unbeabsichtigt unterbrochen.
Thomas Eyde
Tu es einfach und sag es ihnen nicht und verkaufe die Idee in der Kaffeepause an deine Colleges ;-)
Johan
3
Weil Sie gefeuert würden, wenn Sie Ihre Fristen nicht eingehalten hätten?
Andrew
3
@Neko: Unit-Tests bringen keinen "Overhead". Sie reduzieren die Gesamtarbeitsbelastung, indem sie eine ganze Flut dummer Fehler verhindern. Die Arbeit wächst nicht; Es verschiebt sich einfach in der Natur von schlechtem Code zu guten Unit-Tests und gutem Code.
S.Lott
1
Die Bean-Zähler möchten, dass ihre Ingenieure fundierte Lösungen für die Domänenprobleme bereitstellen. Sie können einfach Tests als Teil Ihrer Lösung schreiben. Sie werden es nicht einmal bemerken. Wenn sie fragen, können Sie ihnen einfach sagen, dass Sie mehr Zeit damit verbringen, um sicherzustellen, dass es robust ist und keine Nacharbeit erfordert. Wenn Sie ihnen empfehlen, Unit-Tests zu schreiben, fragen Sie sie nach ihrer Zustimmung zu etwas, von dem sie nichts wissen.
Yorkshireman
16

Ich gehe das anders an:

Welche Sicherheit haben Sie, dass Ihr Code korrekt ist? Oder dass es die Annahme X nicht bricht, wenn jemand in Ihrem Team func1 () ändert? Ohne Unit-Tests, die Sie "ehrlich" halten, bin ich mir nicht sicher, ob Sie viel Sicherheit haben.

Der Gedanke, Tests auf dem neuesten Stand zu halten, ist interessant. Die Tests selbst müssen sich nicht oft ändern. Ich habe 3x den Testcode im Vergleich zum Produktionscode und der Testcode wurde nur sehr wenig geändert . Es ist jedoch das, was mich nachts gut schlafen lässt und was es mir ermöglicht, dem Kunden zu sagen, dass ich sicher bin, dass ich die Y-Funktionalität implementieren kann, ohne das System zu beschädigen.

Vielleicht gibt es im akademischen Bereich Beweise, aber ich habe noch nie in der Geschäftswelt gearbeitet, wo jemand für einen solchen Test bezahlen würde. Ich kann Ihnen jedoch sagen, dass es für mich gut funktioniert hat, wenig Zeit gebraucht hat, um sich an das Test-Framework zu gewöhnen, und das Schreiben von Tests hat mich wirklich über meine Anforderungen und das Design nachdenken lassen, weit mehr als jemals zuvor, als ich in Teams gearbeitet habe schrieb keine Tests.

Hier zahlt es sich aus: 1) Sie haben Vertrauen in Ihren Code und 2) Sie haben Probleme früher als sonst. Der QS-Mitarbeiter hat nicht gesagt: "Hey, Sie haben sich nicht die Mühe gemacht, die xyz () -Funktion zu überprüfen, oder? Er kann diesen Fehler nicht finden, weil Sie ihn vor einem Monat gefunden haben. Das ist gut für er, gut für Sie, gut für das Unternehmen und gut für den Kunden.

Das ist natürlich anekdotisch, aber es hat Wunder für mich gewirkt. Ich bin nicht sicher, ob ich Ihnen Tabellenkalkulationen zur Verfügung stellen kann, aber mein Kunde ist zufrieden und das ist das Endziel.

itsmatt
quelle
Mein QA-Typ war ziemlich scharfsinnig, aber er sah sich keinen Code an, aber es war leicht zu erkennen, dass die Grenzen nicht überprüft wurden.
matt
Völlig einverstanden mit Unit-Tests, die Sie dazu zwingen, mehr über Ihr Design und Ihre Korrektheit nachzudenken als rücksichtslos zu
codieren
7
Kunden bezahlen uns nicht für das Schreiben von Tests. Andererseits bezahlen sie uns auch nicht dafür, Code zu schreiben. Sie bezahlen uns, um ihre Probleme zu lösen, und wenn sie konfrontiert werden, wollen sie bestimmt auch, dass die Probleme gelöst bleiben. Angesichts der Beweise ist es unglaublich, dass Kunden ihre Investition nicht sichern wollen.
Thomas Eyde
10

Wir haben mit harten Beweisen gezeigt, dass es möglich ist, beschissene Software ohne Unit Testing zu schreiben. Ich glaube, es gibt sogar Beweise für beschissene Software mit Unit Testing. Aber das ist nicht der Punkt.

Unit Testing oder Test Driven Development (TDD) ist eine Designtechnik, keine Testtechnik. Code, der testgetrieben geschrieben wurde, sieht völlig anders aus als Code, der nicht getestet wurde.

Auch wenn dies nicht Ihre Frage ist, frage ich mich, ob es wirklich der einfachste Weg ist, Fragen zu beantworten (und Beweise zu bringen, die durch andere Berichte in Frage gestellt werden könnten), die möglicherweise falsch gestellt werden. Selbst wenn Sie harte Beweise für Ihren Fall finden, könnte jemand anderes harte Beweise dafür finden.

Ist es die Aufgabe der Bohnenzähler, zu bestimmen, wie die technischen Mitarbeiter arbeiten sollen? Bieten sie in allen Fällen die billigsten Werkzeuge an, weil sie glauben, dass Sie keine teureren benötigen?

Dieses Argument wird entweder aufgrund des Vertrauens (einer der Grundwerte agiler Teams) gewonnen oder aufgrund der Rollenmacht der siegreichen Partei verloren. Selbst wenn die TDD-Befürworter aufgrund ihrer Rollenstärke gewinnen würden, würde ich dies als verloren betrachten.

Olaf Kock
quelle
13
hören, hören :) Viele der harten Beweise für TDD stammen auch von sehr erfahrenen Teams, die ohne TDD bereits gute Ergebnisse erzielt haben. TDD hat nur ihre Ergebnisse verbessert, anstatt sie aus der Luft zu schaffen. Der eigentliche ROI besteht darin, anständige Programmierer einzustellen und sie entscheiden zu lassen, wie sie vorgehen sollen.
workmad3
"Ist es die Aufgabe der Bohnenzähler, zu bestimmen, wie die technischen Mitarbeiter arbeiten sollen?" -> Alle Geschäftsentscheidungen laufen auf Geld hinaus. Trotzdem gute Antwort, +1
jcollum
@jcollum, aber wie Sie Ihren Job ausführen, hat nichts mit Geld zu tun. Wenn Sie möchten, dass Dome One zur Rechenschaft gezogen wird, lassen Sie sie entscheiden, wie sie das tun, was Sie von ihnen verlangt haben
Rune FS
TDD ist keine Designtechnik, sondern nur eine Codierungstechnik. blog.ploeh.dk/2010/12/22/TheTDDApostate Viele Kommentatoren sind sich nicht einig , dass TDD Refactoring (eine Designtechnik) beinhaltet, Refactoring jedoch TDD nicht impliziert. Man kann ohne Tests umgestalten, große komplexe Umgestaltungen wirken sich ohnehin auf Unit-Tests aus, dh Tests müssen ebenfalls umgestaltet werden, damit sie ebenso ungültig / falsch grün werden können. Einfachere Refactorings wirken sich oft nicht auf Tests aus, aber das Fehlerrisiko ist geringer - da Refactoring einfach ist.
KolA
@KolA Nun, mit der Reflexion von 10,5 Jahren nach dieser Antwort könnte ich es heute etwas defensiver formulieren, aber dennoch: Ich behaupte nicht, dass TDD die einzige Designtechnik ist, die Sie jemals brauchen werden, und Mark beginnt damit eine gute Designtechnik, bevor man zu dem Schluss kommt, dass es überhaupt keine ist. Ich würde seine Meinung schwächen und sagen, dass es nicht die einzige Designtechnik sein muss. Jeder Code, den ich jemals TDD geschrieben habe , sieht anders aus als Code, ohne den ich geschrieben habe. Ich würde das ein Ergebnis des Designs nennen. Neben TDD arbeite ich am besten mit Whiteboard, Diskussionen und anderen Tools. Aber danke für den Link
Olaf Kock
6

Hier geht es mehr um TDD als um reine Unit-Tests. Hier finden Sie einen Link zur Realisierung von Qualitätsverbesserungen durch testgetriebene Entwicklung: Ergebnisse und Erfahrungen von vier Industrieteams von Nagappan, E. Michael Maximilien, Thirumalesh Bhat und Laurie Williams. Artikel, der von der Microsoft Empirical Software Engineering and Measurement (ESM) -Gruppe veröffentlicht und hier bereits erwähnt wurde.

Das Team stellte fest, dass die TDD-Teams Code produzierten, der zwischen 60% und 90% Prozent besser ist (in Bezug auf die Fehlerdichte) als Nicht-TDD-Teams. Allerdings TDD Teams nahmen zwischen 15% und 35% länger ihre Projekte abzuschließen.

Philant
quelle
5

Hier ist eine großartige und unterhaltsame Lektüre eines Mannes, der seine Firma von innen heraus verändert. Es ist nicht auf TDD beschränkt. http://jamesshore.com/Change-Diary/ Beachten Sie, dass er die "Bohnenzähler" einige Zeit nicht überzeugt hat und stattdessen "Guerilla-Taktiken" durchgeführt hat.

Epaga
quelle
Der Link sieht interessant aus ... es lohnt sich, einen Blick auf die sich ändernden Arbeitsprozesse von Organisationen zu werfen ...
böse Pastete
5

Um diesen Antworten weitere Informationen hinzuzufügen, gibt es zwei Metaanalyse-Ressourcen, mit denen sich die Auswirkungen auf Produktivität und Qualität auf den akademischen und industriellen Hintergrund ermitteln lassen:

Einführung der Gastredakteure: TDD - Die Kunst der furchtlosen Programmierung [ Link ]

Alle Forscher scheinen sich einig zu sein, dass TDD eine bessere Aufgabenorientierung und Testabdeckung fördert. Die bloße Tatsache von mehr Tests bedeutet nicht unbedingt, dass die Softwarequalität besser wird, aber die erhöhte Aufmerksamkeit des Programmierers für das Testdesign ist dennoch ermutigend. Wenn wir das Testen als Stichprobe einer sehr großen Population potenzieller Verhaltensweisen betrachten, bedeuten mehr Tests eine gründlichere Stichprobe. In dem Maße, in dem jeder Test ein wichtiges Problem finden kann, das keiner der anderen finden kann, sind die Tests nützlich, insbesondere wenn Sie sie billig ausführen können.

Tabelle 1. Eine Zusammenfassung ausgewählter empirischer Studien zur testgetriebenen Entwicklung: Branchenteilnehmer *

https://www.computer.org/cms/Computer.org/dl/mags/so/2007/03/figures/s3024t1.gif

Tabelle 2. Eine Zusammenfassung ausgewählter empirischer Studien zu TDD: akademische Teilnehmer *

Geben Sie hier die Bildbeschreibung ein

Die Auswirkungen testgetriebener Entwicklung auf externe Qualität und Produktivität: Eine Metaanalyse [ Link ]

Abstrakt:

Dieses Papier bietet eine systematische Metaanalyse von 27 Studien, die die Auswirkungen der testgetriebenen Entwicklung (TDD) auf die Qualität und Produktivität des externen Codes untersuchen.

Die Ergebnisse zeigen, dass TDD im Allgemeinen einen geringen positiven Effekt auf die Qualität hat, aber nur einen geringen bis keinen erkennbaren Effekt auf die Produktivität. Die Subgruppenanalyse hat jedoch festgestellt, dass sowohl die Qualitätsverbesserung als auch der Produktivitätsabfall in Industriestudien im Vergleich zu akademischen Studien viel größer sind. Ein größerer Produktivitätsabfall wurde in Studien festgestellt, in denen der Unterschied im Testaufwand zwischen dem TDD und dem Prozess der Kontrollgruppe signifikant war. Eine größere Qualitätsverbesserung wurde auch in den akademischen Studien festgestellt, wenn der Unterschied im Testaufwand erheblich ist; Aufgrund fehlender Daten konnte jedoch keine Schlussfolgerung zu den Industriestudien gezogen werden.

Schließlich wurde der Einfluss der Entwicklererfahrung und der Aufgabengröße als Moderatorvariablen untersucht und eine statistisch signifikante positive Korrelation zwischen der Aufgabengröße und dem Ausmaß der Qualitätsverbesserung gefunden.

Dariusz Woźniak
quelle
4

Nun, es gibt einige große Unternehmen, bei denen Sie Unit-Tests durchführen müssen. Wenn Sie jedoch ein kleines Unternehmen sind, warum sollten Sie große Unternehmen nachahmen?

Als ich vor vielen Jahren mit Unit-Tests begann (heute verwenden wir meistens Verhaltensmodelle ), lag das daran, dass ich nicht den gesamten Pfad in einer Anwendung steuern konnte.

Ich war es gewohnt, die erste Programmierung und eine REPL zu beenden. Als ich Unit Test (Ein Test für jede Funktion) bekam, war es, als würde ich eine REPL in Sprachen zurückbringen, in denen sehr viel kompiliert wurde. Es brachte den Spaß zurück zu jeder Codezeile, die ich schrieb. Ich fühlte Gott. Ich mochte es. Ich brauchte keinen Bericht, um zu erfahren, dass ich schneller besseren Code geschrieben habe. Mein Chef brauchte keinen Bericht, um zu bemerken, dass wir plötzlich nie eine Frist verpasst haben, weil wir verrückte Sachen gemacht haben. Mein Chef brauchte keinen Bericht, um zu bemerken, dass die Anzahl der "einfachen" Fehler aufgrund dieser sehr seltsamen Sache, unproduktiven Code zu schreiben, von (zu vielen) auf fast null sinkt.

Wie bereits ein anderes Poster geschrieben hat, verwenden Sie TDD nicht zum Testen (Überprüfen). Sie schreiben es, um die Spezifikation und das Verhalten Ihrer Einheit (Objekt, Modul, Funktion, Klasse, Server, Cluster) zu erfassen.

Es gibt viele Misserfolge und Erfolgsgeschichten beim Wechsel zu einem anderen Modell für die Entwicklung von Software in vielen Unternehmen.

Ich habe gerade angefangen, es zu benutzen, wenn ich etwas Neues zu schreiben hatte. Es gibt ein altes Sprichwort, das mir schwer ins Englische zu übersetzen ist, aber:

Beginnen Sie mit etwas so Einfachem, dass Sie nicht bemerken, dass Sie es tun. Wenn Sie für einen Marathon trainieren, gehen Sie zunächst 9 Meter und laufen Sie 1 Meter. Wiederholen Sie diesen Vorgang.

Jonke
quelle
Also sollte ich es einfach tun? Es funktioniert garantiert und es spielt keine Rolle, ob es sonst niemand mit mir macht?
Rabe
Eigentlich ist dies ein Joel-Test: joelonsoftware.com/articles/fog0000000043.html . Es klingt für mich, dass Sie möglicherweise mehr Probleme haben als das Fehlen der Nobelpreis-Studie über Unit Test
Jonke
4

Es gibt Statistiken, die belegen, dass die Behebung eines im Unit- / Integrationstest gefundenen Fehlers um ein Vielfaches weniger kostet als die Behebung auf dem Live-System (sie basieren auf der Überwachung von Tausenden von Projekten im realen Leben).

Bearbeiten : Wie bereits erwähnt, berichtet beispielsweise das Buch " Code Complete " über solche Studien (Absatz 20.3, "Relative Wirksamkeit von Qualitätstechniken"). Aber auch private Beratung im Beratungsbereich beweist dies.

Gabriele D'Antona
quelle
1
Dies wird in Steve McConnells Code Complete behandelt , einem Buch, das Sie wahrscheinlich aus anderen Gründen in Ihrem Bücherregal haben möchten.
Robert Rossney
Dies hängt nicht mit der Testmethode zusammen, sondern damit, wann ein Fehler gemeldet wird und außerdem die Zeit besser für das Auffinden von Fehlern in den Spezifikationen aufgewendet werden sollte, da die Kosten für deren Behebung beim Auffinden bei der Entwicklung bis zu 1000-mal so hoch sind (a Faktor 10 pro Entwicklungsphase)
Rune FS
OTOH, wenn Sie nur die Probleme beheben, auf die Menschen in realen Situationen tatsächlich stoßen, müssen Sie wahrscheinlich weit weniger Fehler beheben. Mir ist auch nicht klar, dass das frühere Beheben von Fehlern wirklich billiger ist, da das Erkennen eines Fehlers in einer Spezifikation viel mehr Aufwand erfordert als das Erkennen desselben Fehlers in der Implementierung, und das Erkennen des Fehlers Teil der Kosten des Bugfixes ist. Dies ist eines dieser Dinge, an die jeder glaubt, weil es selbstverständlich klingt, aber ich habe noch nie eine fundierte Studie gesehen, die den Effekt gezeigt hat.
LKM
0

Ich habe einen Satz Datenpunkte dafür - aus einer Erfahrung, die mich bei Unit-Tests verkauft hat.

Vor vielen Monden war ich ein frisch Absolvent, der an einem großen VB6-Projekt arbeitete, und hatte Gelegenheit, einen großen Teil des Codes für gespeicherte Prozeduren zu schreiben. Von dem Subsystem, das ich geschrieben habe, machte es ungefähr 1/4 der gesamten Codebasis aus - ungefähr 13.000 LOC von ungefähr 50.000.

Ich habe eine Reihe von Unit-Tests für die gespeicherten Prozeduren geschrieben, aber Unit-Tests für VB6-UI-Code sind ohne Tools wie Rational Robot nicht wirklich möglich. Zumindest war es damals nicht so.

Die Statistiken der Qualitätssicherung zu dem Stück ergaben, dass etwa 40 oder 50 Fehler im gesamten Teilsystem aufgetreten sind, von denen zwei aus den gespeicherten Prozeduren stammten. Das ist ein Fehler pro 6.500 Codezeilen gegenüber 1 pro 1.000 bis 1.200 im gesamten Teil. Beachten Sie auch, dass etwa 2/3 des VB6-Codes ein Boilerplate-Code für die Fehlerbehandlung und -protokollierung war, der über alle Verfahren hinweg identisch war.

Ohne zu viel Handbewegung können Sie den Unit-Tests eine Verbesserung der Fehlerraten um mindestens eine Größenordnung zuschreiben.

ConcernedOfTunbridgeWells
quelle