Auf der Suche nach Fallstudien, wie TDD die Qualität und / oder Geschwindigkeit der Entwicklung verbessert hat [geschlossen]

14

In meiner Firma versuche ich zu begründen, warum wir TDD machen sollten. Derzeit tun die meisten Entwickler einfach alles, um das Projekt fertigzustellen, und fügen anschließend Unit-Tests hinzu, um die Manager-Metriken zu erfüllen. Alle Beispiele von seriösen Unternehmen, die TDD durchführen und die Vorteile sehen, würden sehr geschätzt.

Matt West
quelle
1
Eigentlich denke ich, dass "Unit-Tests hinzufügen und hoffen, dass ihr Manager nicht merkt, dass sie Zeit verschwenden" häufiger vorkommt als "Unit-Tests hinzufügen, um Manager-Metriken zu erfüllen", aber ich denke, deshalb wären einige Fallstudien nett.
Carson63000
1
Außerdem können Sie mit TDD sehr früh im Prozess definieren, wann Sie fertig sind, da Sie alle Tests haben, die bestanden werden müssen.
@ user1249 TDD sagt nicht "Schreiben Sie alle Tests, bevor Sie Code schreiben". Er sagt : „einen Schreib einzigen Tests, und eine nicht einzelne Sache , um es Pass, wie nötig wiederholen“. Wenn Sie alle Ihre Tests zuerst schreiben, verlieren Sie die enge Rückkopplungsschleife zwischen Test- und Produktionscode, was einer der Gründe ist, TDD überhaupt erst zu verwenden.
Frank Shearar

Antworten:

8

Eine Studie von 4 Projekten in IBM und Microsoft. Veröffentlicht in der Zeitschrift Emperical Software Engineering .

Empirische Studien belegen, dass testgetriebene Entwicklung die Qualität verbessert

Ein Artikel, der erstmals in der Fachzeitschrift Empirical Software Engineering veröffentlicht wurde, berichtet: "TDD scheint in verschiedenen Bereichen anwendbar zu sein und kann die Fehlerdichte von entwickelter Software erheblich verringern, ohne die Produktivität des Entwicklungsteams wesentlich zu verringern." Die Studie verglich 4 Projekte bei Microsoft und IBM, die TDD verwendeten, mit ähnlichen Projekten, die TDD nicht verwendeten ...

Das Papier enthält 1 Fallstudie bei IBM und 3 von Microsoft. In jeder der Fallstudien werden zwei Teams verglichen, die mit denselben Entwicklungssprachen und -technologien unter demselben übergeordneten Manager an demselben Produkt arbeiten, von denen nur eines die testgetriebene Entwicklung (TDD) verwendete. Keines der Teams wusste, dass sie während ihrer Entwicklungszyklen Teil der Studie sein würden. Die IBM-Fallstudie verfolgte Teams bei der Entwicklung von Gerätetreibern. Die Microsoft-Fälle verfolgten Teams, die an Windows, MSN und Visual Studio arbeiteten.

Das Papier beschreibt die TDD-Praktiken, die von den Teams als minutengenaue Workflows sowie als Workflows auf Aufgabenebene verwendet werden.

falsch
quelle
6

In dem kürzlich erschienenen Buch "Making Software: What works and why we believe it" gibt es ein Kapitel über TDD mit einer Fallstudie. Sie können jedoch enttäuscht sein, da die Studie, wenn ich mich richtig erinnere, keine wirklichen Vorteile für TDD aufgedeckt hat. Die Fallstudie war trotzdem interessant, und das Buch im Allgemeinen ist eines der besten Software-Bücher, die ich in letzter Zeit gelesen habe. Es enthält viele Fallstudien zu Dingen wie Pair Programming, Code Review usw.

Kevin
quelle
4

Schauen Sie sich dies auf jeden Fall an: TDD Proven Effective! Oder ist es?

... als Phil Haack ankündigte, dass Forschung die Wirksamkeit von TDD unterstützt, war ich mehr als ein bisschen interessiert, was der verknüpfte Bericht tatsächlich enthielt. Phil zitiert aus dem Abstract.

Wir stellten fest, dass Schüler mit Testbeginn im Durchschnitt mehr Tests geschrieben haben und Schüler, die mehr Tests geschrieben haben, produktiver waren. Wir haben auch beobachtet, dass die minimale Qualität linear mit der Anzahl der Programmierertests anstieg, unabhängig von der verwendeten Entwicklungsstrategie.

Phil hat offensichtlich den Rest des Berichts gelesen und liefert seine Lieblingsstücke, die seinem Titel zu entsprechen scheinen. Eines der Dinge, über die ich mir Sorgen mache, wenn ich sehe, dass die neuesten und besten Praktiken der Softwareentwicklung unterstützt werden, ist jedoch eine starke Tendenz zur Bestätigungsverzerrung - nach einer Bestätigung aktueller Theorien zu suchen und Gegenindikatoren zu übersehen.

Als neugieriger Typ und da TDD etwas ist, das ich im Auge behalten möchte, um zu sehen, ob ich es eines Tages selbst adoptieren möchte, bin ich in den Bericht gegangen ...

... ohne Frage führt das Testen zuerst zu mehr Tests pro Funktionseinheit. Die Frage ist, ob das wertvoll ist. Diese Studie scheint darauf hinzudeuten, dass dies wahrscheinlich nicht der Fall ist, zumindest wenn Qualität Ihr angestrebter Gewinn ist. Aber ich bin auch nicht so überrascht, dass die Anzahl der Tests nicht der Qualität entspricht, wie ich auch nicht überrascht bin, dass die Anzahl der Codezeilen nicht der Produktivität entspricht.

Der Autor hat viele gute Argumente dafür, dass TDD nicht allzu effektiv ist (imo, obwohl es zu Tode gehypt wurde)

stijn
quelle
Ich bin mir nicht sicher, wie ich mehr als den Link posten kann, ohne den verlinkten Inhalt zu duplizieren. Das bietet, was das OP verlangt: eine Fallstudie zu TDD und eine Überprüfung dieser Studie.
Stijn
4

Überprüfen Sie, wie viel Zeit Sie und der Kunde mit dem manuellen Testen der Software verbracht haben. Vergleichen Sie dies mit einer Schätzung, wie lange automatische Tests im TDD-Stil gedauert hätten. Den Unterschied einstecken

Nach meiner Erfahrung sind die automatisierten Tests von TDD Gold wert, da sie eine Versicherung darstellen und enorme Mengen an manuellen Tests überflüssig machen

Wie Andres F betonte, können Sie diese Vorteile nur durch automatisierte Tests erzielen, nicht notwendigerweise durch TDD. TDD erfordert jedoch automatisierte Tests, anstatt nachträglich gedacht oder nett zu sein

Wenn Sie gezwungen sind, zuerst über Tests nachzudenken, müssen Sie sich auch mit qualitätsbezogenen Problemen wie Modularität, Schnittstellendesign usw. befassen, bevor Sie mit dem Schreiben von Code beginnen.

Persönlich glaube ich, dass einer der größten Vorteile von TDD darin besteht, dass das Schreiben des Tests zuerst die Spezifikation dessen, was der Code tatsächlich zu tun hat, im Kopf behält, während Sie den Code schreiben, anstatt es herauszufinden -als-du-Code.

Steven A. Lowe
quelle
2
Ich stimme zu, aber es ist auch wichtig zu beachten, dass das Bestehen der Komponententests nicht bedeutet, dass die Software korrekt ist, sondern nur, dass sie das tut, was die Komponententests ausmachen. Wenn der Komponententest fehlerhaft ist, hat die Software möglicherweise auch einen Fehler. Wenn es nicht bestanden wird, ist die Software möglicherweise sogar korrekt, wenn der Komponententest fehlerhaft ist. Aus diesem Grund sind auch manuelle Tests erforderlich.
Tamás Szelei
1
Das erklärte Ziel von TDD ist es nicht, manuelle Tests zu reduzieren, sondern das Design zu verbessern. Automatisierte Tests sind ein orthogonales Konzept für TDD. Sie können sie ohne TDD haben.
Andres F.
@AndresF. Du hast Recht; Antwort bearbeitet
Steven A. Lowe
2

Sie möchten sich dafür einsetzen: Schlagen Sie vor, dies für das nächste Projekt zu tun, und lernen Sie dann daraus. Wenn sich herausstellt, dass es für Sie gut funktioniert, werden Sie es hoffentlich weiterhin verwenden. Wenn das Projekt länger gedauert hat und / oder Sie Ihre ganze Zeit damit verbracht haben, Tests zu schreiben, anstatt zu codieren, werden Sie es mit Sicherheit als "" ausgeben ein Fehler.

Ich denke, die reale Lösung ist (wie die meisten Dinge) eine Zwischenlösung. Sie möchten Tests, aber Sie möchten nicht, dass die Tests wichtiger sind als das Projekt.

(Ich persönlich denke, TDD ist eine Modeerscheinung, hört sich theoretisch gut an, aber in der Praxis ... nicht so gut. Ich finde, Integrationstests sind viel wichtiger, aber das könnte genau die Art von komplexen Projekten sein, an denen ich arbeite.)

gbjbaanb
quelle
2

Ich arbeite seit 2 Jahren mit TDD, und wo ich zu der Zeit arbeitete, waren wir alle zurückhaltend, einschließlich der Manager. Es stellte sich jedoch bald als das Richtige heraus. Die Vorteile, die wir bald bemerkten, waren

  • Frühzeitig Fehler entdecken.
  • Besserer Code schreiben, ohne es zu merken.
  • Ihr Code kann jetzt besser gewartet werden, da Ihre Tests nur in kleinen Blöcken ausgeführt werden (wir hatten Funktionen, die 300-400 Zeilen lang waren). Jetzt maximal 30 und alle unabhängig getestet.

Die Manager würden nicht wissen, wie sie alle an einer Sache interessiert sind "Haben Sie fertig". Aber dann beschweren sie sich, wenn die Software immer wieder kaputt geht, ohne es zu merken. Mit einer guten Abdeckung und vernünftigen Tests. Es ist nicht die Menge, sondern die Qualität, die Sie wirklich sehen können, wenn jemand eine Funktionalität bricht. Leider ist es auch schwierig, wenn Sie alleine sind. Ich hatte das gleiche Problem, da Sie möglicherweise Code ändern müssen, z. B. Basisklassen usw., damit Sie Teile der Software testbar machen können.

Ich möchte Ihnen ein Beispiel geben. Ich wollte das Repository verspotten, aber es gab keine Schnittstelle, und ich musste das Repository in meine Service-Schicht einfügen und daher einen Konstruktor im gesamten Shop hinzufügen / ändern Am Ende habe ich mehr als 200 Tests nur einen Bereich des Systems getestet und sie waren beeindruckt.

Ich mache normalerweise folgendes:

  • Ich halte meine unittests sehr kurz
  • Nur 1 behaupten. Kein russisches Roulette.
  • Ich teste ein Positiv-Negativ- und Ausnahmeszenario

In Bezug auf Fallstudien fürchte ich, ich bin nicht sicher, ob ich welche gesehen habe. Sie müssen Ihr Projekt aufbauen und zu Ihren Fallstudien werden. Sie könnten auch beeindruckt sein.

Ich hoffe, es hilft

Brix
quelle