Haben Ihnen Unit-Test-Generatoren bei der Arbeit mit Legacy-Code geholfen?

10

Ich betrachte eine kleine (~ 70 kLOC einschließlich generierter) C # -Codebasis (.NET 4.0, etwas Silverlight) mit sehr geringer Testabdeckung. Der Code selbst funktioniert dahingehend, dass er die Benutzerakzeptanztests bestanden hat, aber spröde und in einigen Bereichen nicht sehr gut berücksichtigt ist. Ich möchte mit den üblichen Verdächtigen (NMock, NUnit, StatLight für die Silverlight-Bits) eine solide Unit-Test-Abdeckung um den Legacy-Code hinzufügen.

Mein normaler Ansatz ist es, das Projekt durchzuarbeiten, Unit-Tests und Refactoring durchzuführen, bis ich mit dem Status des Codes zufrieden bin. Ich habe das in der Vergangenheit schon oft gemacht und es hat gut funktioniert.

Dieses Mal denke ich jedoch darüber nach, einen Testgenerator (insbesondere Pex ) zu verwenden, um das Testframework zu erstellen und es dann manuell zu konkretisieren.

Meine Frage lautet: Haben Sie in der Vergangenheit Unit-Test-Generatoren verwendet, als Sie mit der Arbeit an einer älteren Codebasis begonnen haben, und wenn ja, würden Sie diese empfehlen?

Ich befürchte, dass die generierten Tests die semantischen Nuancen der Codebasis übersehen, was zu der gefürchteten Situation führt, Tests zum Zwecke der Abdeckungsmetrik durchzuführen, anstatt Tests, die das beabsichtigte Verhalten im Code klar ausdrücken.

Duncan Bayne
quelle
Ich habe PeX einmal ausprobiert und die Ergebnisse waren, sagen wir, nicht sehr zufriedenstellend - YMMV. Erwarten Sie nicht, dass ein solches Tool Ihren Code und seine funktionalen Anforderungen "versteht" - es fehlen nicht nur "semantische Nuancen", sondern die gesamte Semantik. Wenn Sie mit einer Legacy-Codebasis beginnen, beginnen Sie normalerweise nicht zuerst mit Komponententests, sondern mit System- oder Integrationstests. Das ist definitiv nichts, wofür PeX geschaffen wurde.
Doc Brown

Antworten:

9

Ich würde vorschlagen, die Dinge etwas anders zu betrachten. Das Hinzufügen eines neuen Komponententestcodes zu einer vorhandenen Anwendung ohne Zwischenfälle führt möglicherweise nicht zu den besten Ergebnissen. Wenn Sie dies tun, um sich mit der Codebasis vertraut zu machen, oder wirklich Zeit zum Töten haben und Testgeneratoren testen möchten, ignorieren Sie meine Kommentare.

Um pragmatisch zu sein, sollten Sie alle Fehlerlisten durchsehen. Erstellen Sie dann Unit-Tests für jeden der Fehler, um festzustellen, wie er sich verhalten soll. Im Idealfall würden Sie nur dann neuen Code für jeden Fehler hinzufügen, wenn Sie ihn erreichen.

Zeiten zum Hinzufügen eines Unit-Testcodes:

  • Neue Funktionen hinzufügen
  • Code neu faktorisiert
  • Ein Fehler wurde behoben
  • Lernen, was der Code tut
  • Beweisen Sie, dass ein Fehler vorliegt

Es ist schwierig, den Wert des Hinzufügens von Komponententests nachträglich zu quantifizieren.

Normalerweise erlaube ich mir nicht, Antworten zu schreiben, die gegen das sind, was der Fragesteller will, aber ich denke, dies ist eine gute Lektion, die ich weitergeben kann.

Andrew T Finnell
quelle
Da stimme ich Ihnen zu 100% zu - diese Frage ergab sich aus meiner Frage, wie ich am besten Ausfallzeiten verbringen kann. Meine normale Praxis besteht darin, Fehler zu beheben und zu überarbeiten, indem entweder Fehler behoben oder Funktionen hinzugefügt werden. Ich hatte gehofft, dass einige Leute in der Lage sein könnten, einige Kriegsgeschichten in dieser Gegend zu teilen ...
Duncan Bayne
1
+1, Nachträgliche Aufnahmen für die Berichterstattung sind normalerweise nicht produktiv. Tests zu behobenen Fehlern, die eine Regression verhindern, sind sehr produktiv. Die Regression eines Fehlers kann für alle Beteiligten sehr frustrierend sein. Tests sind wirklich geeignet, um Ihnen zu helfen, besseren Code zu schreiben. Das Anschrauben von Tests führt normalerweise zu minderwertigen Tests. Ich denke, die Angst des OP ist begründet und das Signal-Rausch-Verhältnis aus den generierten Tests wird nur stören. Der nicht getestete Code enthält wahrscheinlich einige sehr verzweigte Bits. Tools, die auf die Code-Gerüche hinweisen, sind wahrscheinlich nützlicher. Vielleicht FXCop und ähnliche Tools.
Kevpie