Nach vorne
Ich habe viele Dinge gelesen, bevor ich diese Frage gestellt habe, einschließlich vieler relevanter Fragen hier auf SE:
- (Software Engineering SE) Schreiben von Tests für Code, dessen Zweck ich nicht verstehe
- (Software Engineering SE) Unit-Test-Neuling-Team muss Unit-Test durchführen
- (Software Engineering SE) Best Practices für die Nachrüstung von Legacy-Code mit automatisierten Tests
- (Software Engineering SE) Wie teste ich große Legacy-Systeme?
- (Blog-Beitrag) So verspotten Sie Ihre Unit-Test-Umgebung
Ich kann jedoch nicht anders, als das Gefühl zu haben, dass der Juckreiz noch nicht zerkratzt wurde, nachdem ich um Hilfe gelesen habe.
TL; DR
Wie schreibe ich Komponententests für Legacy-Code, den ich nicht ausführen, simulieren, lesen oder leicht verstehen kann? Welche Regressionstests sind für eine Komponente nützlich, die vermutlich wie beabsichtigt funktioniert?
Das ganze Bild
Ich bin wieder ein zurückkehrender Sommerpraktikant, als ich in die Graduiertenschule übergehe. Meine Aufgabe beinhaltet folgende Anforderungen:
- Bewerten Sie für ein bestimmtes Produkt, ob unser Softwareteam die IDE- und JUnit-Version aktualisieren kann, ohne die Kompatibilität mit den vorhandenen Projekten zu verlieren.
- Entwickeln Sie Komponententests für eine Komponente im vorhandenen Java-Code (es handelt sich größtenteils nicht um Java). Wir möchten das Software-Team davon überzeugen, dass Unit-Tests und TDD unschätzbare Werkzeuge sind, die sie verwenden sollten. (Derzeit besteht eine Codeabdeckung von 0%.)
- Beenden Sie irgendwie die Tage der Cowboy-Codierung für ein kritisches System.
Nachdem ich eine Kopie des Quellcodes erhalten hatte, habe ich versucht, ihn zu erstellen und auszuführen, damit ich verstehe, was dieses Produkt tut und wie es funktioniert. Ich konnte nicht. Ich habe meine Vorgesetzten gefragt, wie es mir geht, und mir wurde ein neuer eigenständiger Computer ausgestellt, der in der Lage ist, ihn zu erstellen, einschließlich der tatsächlich erstellten Build-Skripte. Das hat auch nicht funktioniert, da der Produktionscode erwartungsgemäß nur auf dem eingebetteten System ausgeführt wird, für das er entwickelt wurde. Da sie jedoch einen Simulator für diesen Zweck haben, haben sie den Simulator erhalten und ihn für mich auf diese Maschine gestellt. Der Simulator funktionierte auch nicht. Stattdessen erhielt ich endlich einen Ausdruck einer GUI für einen bestimmten Bildschirm. Sie haben auch keine Codekommentare innerhalb des über 700.000 Java LOC, was das Erfassen noch schwieriger macht. Außerdem, Es gab Probleme bei der Bewertung, ob ihre Projekte mit neueren IDEs kompatibel waren oder nicht. Insbesondere wurde ihr Code nicht richtig in die von ihnen verwendete IDE-Version geladen.
Mein Inventar sieht folgendermaßen aus:
- NetBeans 8, 9, 10, 11
- Einheit 4, 5
- Ihr Quellcode für ein bestimmtes Produkt (enthält mehr als 700.000 Java LOC)
- Praktisch keine Codekommentare (gelegentlich eine Signatur)
- Keine vorhandenen Tests
- Ein physisches Foto eines GUI-Fensters
- Ein Software-Design-Dokument (109 S.), in dem die Komponente im Bild nicht behandelt wird
Ich habe zumindest genug, um theoretisch Tests zu schreiben, die ausgeführt werden können. Also habe ich einen grundlegenden Unit-Test für diese Komponente versucht. Ich konnte jedoch die Objekte, die es als Abhängigkeiten gab, nicht initialisieren, einschließlich Modelle, Manager und DB-Verbindungen. Ich habe nicht viel Erfahrung mit JUnit, abgesehen von grundlegenden Unit-Tests. Folgen Sie mir also zum nächsten Abschnitt.
Was ich aus meiner Lektüre gelernt habe
- Verspotten: Wenn ich einen Komponententest schreibe, müssen wahrscheinlich Scheinvariablen für Produktionsabhängigkeiten vorhanden sein, in denen ich nicht einfach initialisieren kann
setUp
. - Jeder hier schlägt großzügig das Buch "Effektiv mit Legacy-Code arbeiten" von Michael Feathers vor.
- Regressionstests sind wahrscheinlich ein guter Anfang. Ich glaube nicht, dass ich genug Waffen habe, um Integrationstests durchzuführen, und Regressionstests würden unser Softwareteam sofort befriedigen. Ich habe jedoch keinen Zugriff auf die bekannten Fehler. aber ich könnte möglicherweise fragen.
Und jetzt ein Versuch, die Unsicherheit, die ich noch habe, als Frage zu artikulieren. Im Wesentlichen verstehe ich nicht, wie das Schreiben dieser Tests funktioniert . Vorausgesetzt, ich erhalte (wahrscheinlich) keine weitere Anleitung von meinen Vorgesetzten, liegt es in meinem Umfeld, nicht nur zu lernen, was diese Komponente tut, sondern zu entscheiden, welche Tests tatsächlich als Regressionstests nützlich sind.
Können Sie als Fachleute, die länger als ich mit solchen Projekten gearbeitet haben, Anleitungen zum Schreiben von Komponententests in solchen Situationen geben?
How do I write unit tests for legacy code that I can't build, run, simulate, read about, or otherwise understand?
- Das kannst du nicht. Sie müssen zumindest wissen, wie hoch die erwartete Ausgabe für eine bestimmte Eingabe ist.