Ich habe kürzlich ein Black-Box-Refactoring abgeschlossen. Ich kann es nicht einchecken, da ich nicht weiß, wie ich es testen soll.
Auf einer hohen Ebene habe ich eine Klasse, deren Initialisierung das Abrufen von Werten aus einer Klasse B umfasst. Wenn Klasse B "leer" ist, werden einige sinnvolle Standardwerte generiert. Ich habe diesen Teil in eine Methode extrahiert, die Klasse B mit denselben Standardwerten initialisiert.
Ich habe noch nicht herausgefunden, wozu / in welchem Kontext eine Klasse dient oder wie sie verwendet wird. Daher kann ich das Objekt nicht aus einer leeren Klasse B initialisieren und überprüfen, ob es die richtigen Werte hat / das Richtige tut.
Meine beste Idee ist, den Originalcode, den Hardcode in den Ergebnissen öffentlicher Methoden, abhängig von den initialisierten Mitgliedern, auszuführen und den neuen Code dagegen zu testen. Ich kann nicht genau sagen, warum ich mich mit dieser Idee irgendwie unwohl fühle.
Gibt es hier einen besseren Angriff?
quelle
Antworten:
Du machst das gut!
Das Erstellen automatisierter Regressionstests ist häufig das Beste, was Sie tun können, um eine Komponente überarbeitbar zu machen. Es mag überraschen, aber solche Tests können oft geschrieben werden, ohne zu verstehen, was die Komponente intern tut, solange Sie die Eingabe- und Ausgabe- "Schnittstellen" (in der allgemeinen Bedeutung dieses Wortes) verstehen. Wir haben dies in der Vergangenheit mehrmals für ausgereifte Legacy-Anwendungen durchgeführt, nicht nur für Klassen, und es hat uns oft geholfen, zu vermeiden, dass Dinge beschädigt werden, die wir nicht vollständig verstanden haben.
Sie sollten jedoch über genügend Testdaten verfügen und sicher sein, dass Sie genau wissen, was die Software aus der Sicht eines Benutzers dieser Komponente tut, da Sie sonst das Risiko eingehen, wichtige Testfälle auszulassen.
Es ist meiner Meinung nach eine gute Idee, Ihre automatisierten Tests vor dem Refactoring und nicht danach zu implementieren , damit Sie das Refactoring in kleinen Schritten durchführen und jeden Schritt überprüfen können. Das Refactoring selbst sollte den Code besser lesbar machen, damit Sie die Interna Stück für Stück besser verstehen. So ist die Reihenfolge Schritte in diesem Prozess
quelle
Ein wichtiger Grund für das Schreiben von Komponententests ist, dass sie die Komponenten-API irgendwie dokumentieren. Hier ist es wirklich ein Problem, den Zweck des zu testenden Codes nicht zu verstehen. Die Codeabdeckung ist ein weiteres wichtiges Ziel, das schwer zu erreichen ist, ohne zu wissen, welche Ausführungszweige existieren und wie sie ausgelöst werden.
Wenn es jedoch möglich ist, den Status sauber zurückzusetzen (oder das neue Testobjekt jedes Mal zu erstellen), kann man einen "Papierkorb-in-Papierkorb-out" -Test schreiben, der dem System nur meist zufällige Eingaben zuführt und die Ausgabe beobachtet.
Solche Tests sind schwierig aufrechtzuerhalten, da es schwierig sein kann, zu sagen, warum und wie schwerwiegend sie sind, wenn sie fehlschlagen. Die Abdeckung kann fraglich sein. Sie sind jedoch immer noch viel besser als nichts. Wenn ein solcher Test fehlschlägt, kann der Entwickler die letzten Änderungen mit größerer Aufmerksamkeit überarbeiten und den Fehler hoffentlich dort finden.
quelle