Frage

In letzter Zeit musste ich einige code auf älteren Systemen, in denen nicht alle code unit tests.
Bevor Sie die änderungen vornehmen ich möchte tests schreiben, aber jede Klasse erstellt eine Menge von Abhängigkeiten und anderen anti-Muster, die Prüfung ganz schwierig.
Natürlich wollte ich überarbeiten Sie den code, um es einfacher zu testen, schreiben Sie die tests, und klicken Sie dann auf ändern.
Ist dies die Art, wie Sie es tun würde?Oder würden Sie verbringen eine Menge Zeit mit dem schreiben der hard-zu-schreiben Sie tests, die würden meist entfernt werden, nachdem das refactoring abgeschlossen sein wird?

War es hilfreich?

Lösung

Erste von alle, hier ist ein großartiger Artikel mit Tipps für unit-Tests.Zweitens fand ich eine großartige Möglichkeit, um zu vermeiden, dass Tonnen von änderungen in den alte code ist einfach umgestalten Sie es ein wenig, bis Sie es testen kann.Eine einfache Möglichkeit, dies zu tun ist, um private Mitglieder geschützt, und überschreiben dann den geschützten Bereich.

Zum Beispiel, sagen wir, Sie haben eine Klasse, lädt ein paar Sachen aus der Datenbank, während der Konstruktor.In diesem Fall, können Sie nicht einfach überschreiben, eine protected-Methode, aber Sie können extrahieren Sie die DB-Logik in einem geschützten Bereich und dann überschreiben Sie im test.

public class MyClass {
    public MyClass() {
        // undesirable DB logic
    }
}

wird

public class MyClass {
    public MyClass() {
        loadFromDB();
    }

    protected void loadFromDB() {
        // undesirable DB logic
    }
}

und dann wird Ihr test sieht ungefähr so aus:

public class MyClassTest {
    public void testSomething() {
        MyClass myClass = new MyClassWrapper();
        // test it
    }

    private static class MyClassWrapper extends MyClass {
        @Override
        protected void loadFromDB() {
            // some mock logic
        }
    }
}

Dies ist irgendwie ein etwas schlechtes Beispiel, denn Sie verwenden könnten, DBUnit in diesem Fall, aber ich habe tatsächlich diese in einem ähnlichen Fall vor kurzem, weil ich wollte, um zu testen, einige Funktionen sind völlig unabhängig von den Daten, die geladen werden, so dass es sehr effektiv war.Ich habe auch festgestellt, eine solche Freilegung der Mitglieder, um nützlich zu sein, die in anderen ähnlichen Fällen, wo ich brauche, um loszuwerden, einige der Abhängigkeit wurde in einer Klasse für eine lange Zeit.

Ich würde empfehlen, sich gegen diese Lösung, wenn Sie schreiben einen Rahmen, obwohl, es sei denn, Sie wirklich don ' T mind exposing der Mitglieder die Benutzer der Rahmen.

Es ist ein bisschen ein hack, aber ich fand es sehr nützlich.

Andere Tipps

@valters

Ich Stimme mit Ihrer Aussage, dass die tests brechen sollte nicht die build.Die Prüfungen sollten ein Indiz dafür, dass die Anwendung nicht über neue bugs eingeführt, die für die Funktionalität getestet wird (und einen gefunden, der Fehler ist ein Indiz für eine fehlende test).

Wenn die tests nicht gegen das bauen, dann können Sie leicht in die situation, in der neue code bricht der build und es ist nicht bekannt, obwohl ein test belegt.Ein Versagen test sollte eine rote fahne, die entweder test-oder code behoben werden.

Darüber hinaus, so dass die tests nicht gegen das bauen, die werden verursachen die Ausfall-rate, langsam zu kriechen, bis zu dem Punkt, wo Sie nicht mehr haben eine zuverlässige regression tests.

Wenn es ein problem mit tests brechen zu oft, es kann ein Indiz sein, dass die tests geschrieben zu fragil ist eine Weise (die Abhängigkeit von Ressourcen, die sich ändern könnte, wie die Datenbank ohne Verwendung der Unit DB richtig, oder einen externen web-Dienst, der sollte verspottet werden), oder es kann ein Indiz sein, dass es die Entwickler im team, die geben nicht die tests, die angemessene Aufmerksamkeit.

Ich glaube fest daran, dass ein Mangel test sollte sofort behoben werden, so als würden Sie fix code, der nicht kompiliert werden so schnell wie möglich.

Ich bin nicht sicher, warum würden Sie sagen, dass unit-tests entfernt werden, sobald das refactoring abgeschlossen ist.Eigentlich Ihre unit-test-suite ausgeführt werden soll, nachdem main build (erstellen Sie eine separate "tests" erstellen, das nur ausgeführt wird die unit-tests nach dem Haupt-Produkt ist gebaut).Dann sehen Sie sofort, wenn änderungen in einem Stück brechen die tests in anderen Teilsystem.Hinweis: es ist ein bisschen anders als das ausführen von tests während des builds (wie manche Verfechter) - einige begrenzte Tests nützlich beim bauen, aber es ist in der Regel unproduktiv "crash" die bauen, nur weil einige unit-test geschieht, zu Versagen.

Wenn Sie schreiben von Java (Chancen), check out http://www.easymock.org/ - kann nützlich sein für die Reduzierung Kupplung für test Zwecke.

Ich habe gelesen, Sie Arbeiten Effektiv Mit Legacy-Code, und ich Stimme zu, es ist sehr nützlich für den Umgang mit "nicht testbar" code.

Einige Techniken gelten nur für kompilierte Sprachen (ich bin auf "alte" PHP apps), aber ich würde sagen, die meisten des Buches ist für jede Sprache.

Refactoring-Bücher manchmal annehmen, der code ist in halb-idealen oder "Wartung bewusst" Zustand vor der Umgestaltung, aber die Systeme, die ich arbeiten, sind weniger als ideal sind, und wurden entwickelt, wie "lernen Sie die" apps, oder wie die ersten apps für einige Technologien verwendet (und ich habe nicht die Schuld der ursprünglichen Entwickler an, denn ich bin einer von Ihnen), so gibt es keine tests in allen, und der code ist manchmal chaotisch.Dieses Buch richtet sich an diese Art von situation, in der Erwägung, dass andere refactoring-Bücher in der Regel nicht (naja, nicht in diesem Ausmaß).

Ich sollte erwähnen, dass ich noch nicht erhalten kein Geld von der Herausgeber noch der Autor dieses Buches ;), aber ich fand es sehr interessant, da die Ressourcen fehlen, sind im Bereich der legacy-code (und besonders in meiner Sprache, Französisch, aber das ist eine andere Geschichte).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top