2008-08-21 8 views
5

Ich bin einem Team beigetreten, das an einem Produkt arbeitet. Dieses Produkt gibt es seit ca. 5 Jahren und verwendet ASP.NET WebForms. Seine ursprüngliche Architektur ist im Laufe der Zeit verblasst, und die Dinge sind in der gesamten Lösung relativ unorganisiert geworden. Es ist keineswegs schrecklich, aber kann definitiv etwas Arbeit gebrauchen; ihr alle wisst was ich meine.Refactoring für Testability auf einem vorhandenen System

Ich habe einige Refactorings durchgeführt, seit ich vor ungefähr 6 Monaten zum Projektteam kam. Einige dieser Refactorings sind einfach, Extract Method, Pull Method Up usw. Einige der Refactorings sind struktureller. Die letztgenannten Änderungen machen mich nervös, da es keine umfassende Suite von Komponententests für jede Komponente gibt. Das gesamte Team ist an Bord für die Notwendigkeit, strukturelle Änderungen durch Refactoring vorzunehmen, aber unser Projektmanager hat Bedenken geäußert, dass wir keine ausreichenden Tests haben, um Refactorings mit der Gewissheit durchzuführen, dass wir keine Regressionsfehler einführen in das System. Er möchte, dass wir zuerst mehr Tests (gegen die vorhandene Architektur) schreiben und dann die Refactorings durchführen. Mein Argument ist, dass die Klassenstruktur des Systems zu eng gekoppelt ist, um adäquate Tests zu schreiben, und dass die Verwendung eines mehr Test Driven-Ansatzes, während wir unsere Refactorings durchführen, besser sein kann. Was ich damit meine, ist nicht das Schreiben von Tests gegen die vorhandenen Komponenten, sondern das Schreiben von Tests für spezifische funktionale Anforderungen, dann Refactoring bestehenden Code, um diese Anforderungen zu erfüllen. Dies wird uns erlauben, Tests zu schreiben, die wahrscheinlich mehr Langlebigkeit im System haben werden, anstatt eine Menge "Wegwerf" -Tests zu schreiben.

Hat jemand irgendwelche Erfahrung, was die beste Vorgehensweise ist? Ich habe meine eigenen Gedanken, möchte aber etwas von der Community hören.

Antwort

5

Die Bedenken Ihres PM sind gültig - stellen Sie sicher, dass Sie Ihr System testen, bevor Sie größere Refactorings vornehmen.

Ich würde dringend empfehlen, eine Kopie von Michael Feders Buch Working Effectively With Legacy Code (von "Legacy Code" Feathers bedeutet jedes System, das nicht ausreichend durch Komponententests abgedeckt ist). Dies ist randvoll mit guten Ideen, wie Sie diese Kopplungen und Abhängigkeiten, von denen Sie sprechen, auf sichere Art und Weise aufschlüsseln können, ohne die Einführung von Regressionsfehlern zu riskieren.

Viel Glück mit dem Refactoring-Programm; Meiner Erfahrung nach ist es ein angenehmer und kathartischer Prozess, von dem man viel lernen kann.

2

Können Sie den Faktor parallel neu berechnen? Was ich meine, ist, die Stücke neu zu schreiben, die Sie mit TDD umgestalten möchten, aber lassen Sie die vorhandene Codebasis an Ort und Stelle. Dann stufen Sie den bestehenden Code aus, wenn Ihre neuen Tests die Bedürfnisse Ihres PM erfüllen?

0

Ich habe nur eine zweite Empfehlung für die effektive Arbeit mit Legacy Code, ein ausgezeichnetes Buch, dass meine Augen für die Tatsache geöffnet, dass fast jeder alte/crappy/untestable Code kann gezankt werden!

1

Ich möchte auch einen Vorschlag zum Besuch der Refactoring Website von Martin Fowler werfen. Er schrieb das Buch buchstäblich über dieses Zeug.

Was die Einführung von Komponententests in die Gleichung anbelangt, ist die beste Methode, die ich gefunden habe, eine Top-Level-Komponente zu finden und alle externen Abhängigkeiten zu konkreten Objekten zu identifizieren und durch Schnittstellen zu ersetzen. Sobald Sie das getan haben, wird es viel einfacher sein, Komponententests gegen Ihre Codebasis zu schreiben, und Sie können es eine Komponente gleichzeitig tun. Noch besser, Sie müssen keine Komponententests wegwerfen.

Komponententests ASP.Net kann schwierig sein, aber es gibt viele Frameworks, die es einfacher machen. ASP.Net MVC und WCSF um nur einige zu nennen.

0

Stimmen Sie völlig mit der Antwort von Ian Nelson überein. Zusätzlich würde ich beginnen, einige "high level" Tests (Funktions- oder Komponententests) zu erstellen, um das Verhalten vom Standpunkt des Benutzers aus zu erhalten. Dieser Punkt könnte das wichtigste Anliegen Ihres PM sein.