Bringen Sie den Ball auf TDD ins Rollen

10

Ich bin Teil eines Entwicklerteams, das mit vielen anderen Teams zusammenarbeitet, um eine Anwendung zu warten und zu verbessern, die seit mindestens 15 Jahren verwendet wird. Als es zum ersten Mal gebaut und entworfen wurde, war TDD unbekannt.

Die Anwendung ist ziemlich stabil, und wir stoßen selten auf einen Fehler beim Stoppen der Show, aber wir machen durchschnittlich ein oder zwei Fehler pro Woche, die die Servicequalität erheblich beeinträchtigen. Es dauert ewig, diese Fehler zu finden und zu beheben, hauptsächlich aufgrund von Fingerzeig. Die einzigen Tests, die wir haben, sind Schnittstellentests. Da viel Zeit damit verschwendet wird, nach dem Fehler zu suchen, bevor er behoben werden kann, planen ich und ein anderer Entwickler, eine testgesteuerte Entwicklung vorzuschlagen. In Kürze wird es eine neue Überarbeitung geben, und wir möchten, dass die neuen Module nahezu vollständig getestet werden. Wir planen außerdem, Testeinheiten für jeden Code zu erstellen, den wir ändern müssen, der älter ist (dh Fehlerbehebung oder Funktionsimplementierung) ), aber keine Zeit damit zu verbringen, Testfälle für Code zu entwickeln, der keine Probleme verursacht hat.

Das erscheint mir vernünftig. Diesen Monat hatten wir einen Fehler, dessen Behebung mehr als zwei Wochen dauerte, der jedoch vor der Bereitstellung hätte identifiziert werden können, wenn Unit-Tests durchgeführt worden wären. Für unsere Manager sieht es jedoch so aus, als würden sie mehr Geld ausgeben.

Wie kann ich unsere Kunden davon überzeugen, dass sie das Geld für Unit-Tests und testgetriebene Entwicklung ausgeben möchten? Gibt es Studien, die den ROI von Unit-Tests belegen?

Malfist
quelle
1
Für TDD ist es zu spät. siehe "Arbeiten mit Legacy-Code" von Michael Feathers
Steven A. Lowe
Schritt 1. Suchstapelüberlauf. Dies wurde gefragt. Und antwortete. Beispiele: stackoverflow.com/search?q=starting+tdd
S.Lott

Antworten:

6

Das direkte Einbau eines vollständigen TDD in einen Legacy-Code und ein Wartungsprojekt sind sehr schwer zu verkaufen. Ein Ansatz, den ich sehr gut gesehen habe, ist dieser. Erstellen Sie für jeden eingehenden Fehler einen automatisierten Nicht-Unit-Test, der den Fehler demonstriert. Mit "Nicht-Einheit" meine ich etwas, das viele Teile des Systems berühren, Datenbank und Dateisystem treffen usw. kann - aber mit "automatisiert" meine ich Läufe ohne menschliche Interaktion. Dies ist die Art von Test, die Sie auf jeden Fall in Ihrer Regressionssuite wünschen. Wenn Sie es schreiben, werden viele Dinge erreicht: Sie machen den Code testbar, auch wenn er sich auf dieser sehr groben Ebene befindet, und Sie sind der Konstellation von Code ausgesetzt, die möglicherweise etwas mit dem Fehler zu tun hat, sodass Sie darüber informiert und informiert werden sehr spezifisch relevantes Material.

Aber das ist noch nicht alles. Wenn dieser Test ausgeführt wird und rot ausgeführt wird (was den Fehler im Code zeigt), nehmen Sie sich Zeit, um herauszufinden, was falsch ist (Sie müssen dies auf jeden Fall tun). Aber reparieren Sie es noch nicht. Wenn Sie das Problem isoliert haben, schreiben Sie eine EinheitTest, der dieses Problem zeigt. Jetzt haben Sie etwas, mit dem Sie arbeiten können (und nicht zufällig mussten Sie möglicherweise ein bisschen mehr umgestalten, um eine noch bessere Testbarkeit zu erreichen). Beheben Sie den Fehler. Beobachten Sie den Test der Einheit. Vielleicht mit einigen Randfällen ausarbeiten; Holen Sie sich diese eine Einheit - die, die Sie nur zwei Wochen Zeit gekostet hat - solide und sauber und gut getestet. Führen Sie nun den Regressionstest aus und beobachten Sie, wie er bestanden wird (wenn dies nicht der Fall ist, müssen Sie natürlich noch mehr Forschung und Arbeit auf Einheitenebene erledigen - iterieren Sie, bis auch dieser bestanden wird). Checken Sie alles ein. Was haben Sie? Regressionstests für zuvor fehlerhaften Code. Unit-Tests für zuvor fehlerhaften Code. Arbeitscode, der fehlgeschlagen ist. Besser gestalteter Code, weil er jetzt testbarer ist als früher. Besseres Vertrauen in Ihre Codebasis,

Es ist kein "reines" TDD. Es zeigt jedoch schnell Ergebnisse und verbessert die Qualität Ihres Codes im Laufe der Zeit. Die Ergebnisse helfen Ihnen beim Management-Buy-In.

Carl Manaster
quelle
Großartiger Vorschlag, aber ich denke, das OP sucht nach einem überzeugenderen Argument, das die zusätzliche Zeit rechtfertigt, die für die Umsetzung dieses Ansatzes erforderlich ist.
Bernard
Vielleicht muss ich es dann umformulieren. Ich habe versucht auszudrücken, dass der größte Teil des beschriebenen Aufwands ohnehin notwendig ist - die zusätzliche Zeit ist sehr bescheiden, um erhebliche Vorteile zu erzielen. Es tut mir leid, wenn das nicht klar war.
Carl Manaster
Mir als Entwickler ist klar, aber ich weiß, dass das Management normalerweise ein sehr überzeugendes Argument benötigt (dh die Kosten zu rechtfertigen).
Bernard
Das habe ich in meinem zweiten Absatz der Frage vorgeschlagen. Wir würden TDD für "neuen Code" schreiben und Testfälle für jeden Legacy-Code schreiben, den wir entweder durch Bugfix oder Feature-Anfrage geändert haben.
Malfist
3

In meiner Firma habe ich mich nur für die "nur ein Grunzen" -Methode von JoelOnSoftware entschieden und angefangen, Komponententests zu schreiben, wenn ich normalerweise einfach eine Art Wegwerfkonsolenanwendung zusammen gehackt hätte. Ich fing an, Dinge mit stabileren Releases viel schneller zu erledigen, und wurde dafür bemerkt. Auf die Frage, was ich mache, erklärte ich, dass ich angefangen habe, TDD zu verwenden und Unit-Tests zu schreiben, wenn ich alten Code geändert oder neuen Code geschrieben habe. Meine Entwicklerkollegen wurden neugierig und verwendeten selbst integrierte Komponententests. Ich glaube nicht, dass es ein gutes Argument dafür gibt, Tests für funktionierenden Legacy-Code zu schreiben, aber wenn Sie behaupten können, dass das Schreiben automatisierter Tests schneller und bequemer ist als das Schreiben von Konsolen-Hack-Spaghetti, werden intelligente Entwickler mitmachen.Die anderen Vorteile, die zu einer qualitativ hochwertigeren Software führen, werden ebenfalls vorhanden sein, aber der Schlüssel zur Anmeldung von Entwicklern liegt darin, zu zeigen, dass dies ihr Leben erleichtert. Was die Anmeldung von Unternehmen angeht, sollte die Tatsache, dass dies zu einer besseren Software führt und wahrscheinlich weniger Zeit für den Versand benötigt als zuvor, mehr als genug sein, um sie zu überzeugen.

Morgan Herlocker
quelle
0

Zunächst einmal sollten Sie Ihre Einstellung und Ihr Gefühl der Aufrichtigkeit für einen hochwertigen Mehrwert schätzen, der zum Geld des Kunden beiträgt. Und hier sind meine Gedanken darüber, wie Sie Ihren Manager und Kunden überzeugen können:

  • Sammeln Sie die Metriken der Fehler, die Sie in den letzten 6 Monaten behoben haben, sowie die minimale, durchschnittliche und maximale Zeit, die Sie zur Behebung eines Fehlers benötigt haben.
  • Versuchen Sie, für alle Fehler, die Sie behoben haben oder deren Kontext Sie haben, Komponententests zu schreiben, die diese Bereiche abdecken.
  • Versuchen Sie für die Fehler, an denen Sie arbeiten, und für die, an denen Sie arbeiten, Unit-Tests in diesen Bereichen zu schreiben, bevor Sie Änderungen vornehmen. Schreiben Sie dann Code, um die Ursache herauszufinden und zu beheben. Überprüfen Sie, ob ein bestehender Testfall dadurch beschädigt wird. Wenn ja, erklären Sie Ihren Kollegen und helfen Sie ihnen, die Bedeutung von Unit-Tests zu verstehen.
  • Wenn alle Entwickler die Bedeutung von Unit-Tests verstanden haben, bitten Sie sie, das zu tun, was Sie seit so vielen Tagen / Wochen tun.
  • Mit der Zeit sollte sich die Produktivität des Teams in dem Maße verbessern, dass sowohl Ihr Manager als auch Ihre Kunden von der Geschwindigkeit der Produktivitätsverbesserung und der Codequalität überrascht sind. Es ist etwas zeitaufwändig, aber einen Versuch wert.

Es gibt noch einen anderen Weg, und versuchen Sie, gemeinsam mit Ihrem Manager an agilen Konferenzen teilzunehmen, die in der Umgebung stattfinden. Es sollte sich auf jeden Fall lohnen, daran teilzunehmen.

Wenn Sie der Meinung sind, dass nichts funktioniert, fahren Sie fort ... schließen Sie sich dem Ort an, der zu Ihnen passt. Ehrlich gesagt, das habe ich getan. Als alles fehlschlug, ging ich weiter;)

Und wissen, welche Unit-Tests nach dem Schreiben des Codes nicht wirklich TDD sind, aber das kann immer der erste Schritt sein. Zumindest hier passt es so gut.

Wünsche dir viel Glück und Erfolg!

karthiks
quelle