2 Stimmen

Wie prüfe ich den Inhalt einer Datei anhand einer Perl-Testdatei?

Ich möchte ein Skript testen, das ich in Perl geschrieben habe, und insbesondere prüfen, welche Ausgabe es in eine Datei schreibt. Ich habe es vor einiger Zeit geschrieben und möchte es nicht so weit verändern, dass es zu einem Modul wird, aber ich möchte es einem Regressionstest unterziehen, bevor ich einige kleine funktionale Änderungen vornehme.

Bislang habe ich

use Test::Command tests => 10;

exit_is_num($cmd, 0);
....

Der Befehl erzeugt jedoch einige Dateien, und ich möchte überprüfen, ob diese Dateien mit den erwarteten übereinstimmen (entweder gleich oder mit einem Regexp). Irgendwelche Vorschläge

2voto

DVK Punkte 123218

OK, ich werde mit der Brute-Force-DIY-Ansatz gehen (jedoch ist es möglich, es gibt bereits einige Testmodul mit Datei-Überprüfung-API - ich habe nur nie stieß auf eine so flexibel/generisch wie was wir brauchten und schrieb uns und fühlte nie die zwingende Notwendigkeit, tiefer zu suchen :).

Ich beschreibe einen ziemlich allgemeinen Testaufbau, vielleicht wollen/brauchen Sie nur ganz bestimmte Aspekte des Dateitests.

Was wir in diesem Fall tun, ist buchstäblich das, was in Ihrer funktionalen Spezifikation oben steht, als Teil des allgemeinen Testrahmens:

  • Eine Testbibliothek mit zwei Methoden (neben anderen) - test_file_identical() y test_grep_file() . Wenn Sie Hilfe beim Schreiben der beiden benötigen, hinterlassen Sie bitte einen Kommentar und ich werde Ihnen einige Tipps geben (wir verwenden verschiedene Komparatoren, einschließlich einer Kombination aus -e Vergleiche von verschiedenen stat Attribute und vergleicht die Inhaltszeichenfolgen der getesteten Datei mit denen der Vergleichsdatei, die über File::Slurp und tun grep der Datei, Zeile für Zeile oder über den geschlürften Inhalt bei kleinen Dateien, einschließlich des Vergleichs der massierten grep-Ergebnisse mit einer Benchmark-Datei.

  • Organisieren Sie Ihre Testfälle in Unterverzeichnissen (oder Tarballs), eines pro Test, und jeder Test besteht aus 2 Verzeichnissen - Eingabedateien und erwartete Ausgabedateien.

  • Lassen Sie das Skript der Test-Engine in einer Schleife über die Testfälle laufen (die bei uns entweder durch eine Perl-Datenstruktur oder besser noch durch eine XML-Datei metabeschrieben werden, so dass Geschäftsanalysten bei Bedarf mit ihnen herumspielen können).

  • Wenn ein Testfall angibt, dass der Test (genau oder über grep) übereinstimmen muss, findet das Testsystem die entsprechenden Dateien (entweder über fest kodierte Namen oder über ein im Testfall angegebenes Namensmuster) und wendet die im ersten Aufzählungspunkt genannten Dateitestmethoden an.

1voto

Schwern Punkte 138322

Ein Test hat nichts Magisches an sich. Lesen Sie die Dateien ein und prüfen Sie, ob sie den richtigen Inhalt haben. Bog einfach.

open my $fh, $file;
my $have = join '', <$fh>;

is $have, <<'WANT', "contents of $file";
The quick brown fox
jumped over the lazy grey dog.
WANT

Das ist nichts Bahnbrechendes. Test::Datei::Inhalt wird Ihnen einige Hilfsfunktionen zur Verfügung stellen, damit Sie diese nicht immer wieder schreiben müssen.

Wenn Sie eine Reihe von Dateien testen, können Sie den Prozess datengesteuert gestalten.

my %file_tests;
$file_tests{"expected_filename"} = <<'WANT';
Expected content
WANT
... and so on ...

for my $file (keys %file_tests) {
    my $want = $file_tests{$file};

    file_contents_is($file, $want, "contents of $file");
}

Wenn der Inhalt sehr umfangreich ist, sollten Sie die erwartete Ausgabe in Dateien speichern und files_contents_identical() verwenden.

Wenn Sie schließlich sichergehen wollen, dass das Programm NUR die erwarteten Dateien erzeugt hat und es keine Ausreißer gibt, legen Sie ein temporäres Verzeichnis an, wechseln Sie mit chdir dorthin, führen Sie das Programm von dort aus und überprüfen Sie, ob das Verzeichnis nur die erwarteten Dateien enthält. Ich überlasse das als Übung für den Leser.

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