5 Stimmen

Überschreiben von Variablen beim Testen eines eigenständigen Perl-Skripts

In unserer Umgebung gibt es ein Perl-Skript, das ich jetzt pflegen muss. Es ist voll von schlechten Praktiken, einschließlich der Verwendung (und Wiederverwendung) von globalen Variablen im gesamten Skript. Bevor ich Änderungen an dem Skript vornehme, wollte ich versuchen, einige Testskripte zu schreiben, um eine gute Regressionsbasis zu haben. Dazu wollte ich eine Methode verwenden, die in diesem Artikel beschrieben wird Seite .

Ich begann mit dem Schreiben von Tests für ein einziges Unterprogramm. Ich setze diese Zeile etwas weiter oben in das Skript, das ich teste:

return 1 if ( caller() );

Auf diese Weise kann ich in meinem Testskript

require 'script_to_test.pl';

und es wird nicht das ganze Skript ausgeführt.

Das erste Unterprogramm, das ich testen wollte, macht viel Gebrauch von globalen Variablen, die im gesamten Skript gesetzt werden. Mein Gedanke war, diese Variablen in meinem Testskript außer Kraft zu setzen, etwa so:

require_ok('script_to_test.pl');
$var_from_other_script = 'Override Value';
ok( sub_from_other_script() );

Leider (für mich) hat das Skript, das ich teste, einen großen "my"-Block am Anfang, in dem alle im Skript verwendeten Variablen deklariert werden. Dadurch kann mein Testskript die Variablen in dem Skript, gegen das ich die Tests durchführe, nicht sehen/ändern.

Ich habe mit Exporter, Test::Mock... und einigen anderen Modulen gespielt, aber es sieht so aus, wenn ich in der Lage sein möchte, alle Variablen zu ändern, muss ich das andere Skript in irgendeiner Weise ändern.

Mein Ziel ist es, das andere Skript nicht zu ändern, sondern einige gute Tests durchzuführen, damit ich, wenn ich das andere Skript ändere, sicherstellen kann, dass ich nichts kaputt gemacht habe. Das Skript umfasst etwa 10.000 Zeilen (davon 3.000 im Hauptblock), so dass ich befürchte, dass sich Änderungen auf andere Teile des Codes auswirken könnten, wenn ich sie vornehme.

Ist dies möglich? Kann ein aufrufendes Skript Variablen in einem anderen Skript ändern, die mit "my" deklariert sind?


Und bitte kommen Sie mir nicht mit Antworten wie "Schreiben Sie das Skript einfach von Grund auf neu", usw. Das mag die beste Lösung sein, beantwortet aber nicht meine Frage, und wir haben nicht die Zeit/Ressourcen für eine Neuschreibung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X