2010-07-08 4 views
12

Die Situation: Millionen von Codezeilen, mehr als einhundert Entwickler und häufige Fehler. Wir wollen vermeiden Fehler vermeiden und wir wollen Code-Design zu verbessern (wer nicht?).Wie können Sie eine testgetriebene Entwicklung mit Legacy-Code implementieren?

Testgetriebene Entwicklung (erster Komponententest, dann Code) klingt ideal: Schreiben Sie einen Testfall für jede Funktion.

Aber, mit so viel Code geschrieben, wie kann TDD implementiert werden? Wo fangen Sie an - mit Low-Level-Funktionen?

Oder sind wir zu spät, um TDD zu starten?

Antwort

21

Beginnen Sie mit Working Effectively with Legacy Code.

Es ist nicht wirklich TDD, wenn Sie mit Legacy-Code beginnen - aber all Ihre Codierung kann TDD sein. Wenn Sie ein neues Problem lösen, schreiben Sie einen Test dafür. Wenn das nicht möglich ist, weil die Legacy-Klassen zu schwierig zu testen sind, dann beginnen Sie damit, Tests für sie zu schreiben, Bits abzutrennen und die Bits mit Tests abzudecken.

Refactor the Low-Hanging Fruit.

Um Wiederholungsfehler zu vermeiden: Geben Sie einen Beispielfehler ein und schreiben Sie einen Test, der es zeigt. Es könnte ein relativ breiter Test sein, der nur Benutzeraktivität simuliert; noch kein Unit Test. Stellen Sie sicher, dass der Test fehlschlägt. Recherchiere. herauszufinden, warum der Test fehlschlägt. Nun - das ist wichtig - bevor Sie den Fehler beheben, schreiben Sie einen Komponententest, der den Fehler zeigt. Beheben Sie den Fehler, und jetzt haben Sie zwei Tests, mindestens eine davon, die Sie vor Regressionen schützen.

+2

+1: Der Schlüssel hier ist, * nicht * versuchen und Unit-Tests umfassend nachrüsten. – Richard

+1

@Carl - schöne Zusammenfassung. Ich mag besonders, wie Sie einen Komponententest und einen Systemtext aus dem Defekt haben. – Wikis

+0

@Richard - Ich bin verwirrt - ist das nicht das Gegenteil von dem, was Carl sagt? – Wikis

2

Da Carl ein Buch vorgeschlagen hat, werde ich ein anderes vorschlagen: Roy Osheroves Art of Unit Testing hat ein ganzes Kapitel über "Arbeiten mit Legacy-Code". Ich habe dieses Kapitel noch nicht gelesen, aber die ersten 5 Kapitel sind ausgezeichnet und ich freue mich darauf.

+0

FYI Ich genoss Osherove's Vergleich von Definitionen für Legacy-Code: "Quellcode, bezieht sich auf nicht länger unterstützte Technologie" "jede ältere Anwendung unter Wartung" "Code, der funktioniert" "Code, der keine Tests hat" (aus Feathers Buch) – orbfish

+0

@Carl danke für die C2-Verbindung, das ist urkomisch. – orbfish

+0

@Orbfish - Danke für den Tipp. Vielleicht werden Sie, wenn Sie es gelesen haben, zurückkommen und einige Einsichten teilen? – Wikis

Verwandte Themen