Da un file di prova Perl, come faccio a controllare il contenuto di un file?
Domanda
Voglio testare uno script che ho scritto in Perl e in particolare controllare che l'uscita si scrive in un file. L'ho scritto qualche tempo fa e non voglio modificarlo fino al punto di trasformarla in un modulo, ma vorrei regressione testarlo prima di aggiungere alcune piccole modifiche funzionali.
Finora ho
use Test::Command tests => 10;
exit_is_num($cmd, 0);
....
Ma il comando produce alcuni file e voglio controllare i file sono gli stessi che mi aspetto (sia uguale o partita qualche regexp). Eventuali suggerimenti
Soluzione
Non c'è nulla di magico un test. Leggere i file, controllare che hanno i contenuti giusti. Bog semplice.
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
Niente motivo di rottura lì. Test :: File :: Contenuto vi fornirà alcune funzioni di utilità in modo da non dover scrivere che più e più volte.
Se si sta testando un gruppo di file, è possibile effettuare guidato i dati di processo.
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");
}
Se i contenuti sono di grandi dimensioni si può decidere di attaccare i risultati attesi in file e utilizzare files_contents_identical ().
Infine, se si vuole fare in modo il programma solo prodotto i file che ci si aspetta e non ci sono randagi, creare una directory temp, chdir in quella, eseguire il programma da lì, e controllare la directory contiene solo i file che ci si aspetta . Lascio come esercizio per il lettore.
Altri suggerimenti
OK, vado con l'approccio forza bruta fai da te (per quanto è possibile ci sia già un certo modulo di test con il file API controllo - non ho mai imbattuto in uno flessibile / generico come quello che ci serviva e ci ha scritto e mai sentito il impellente necessità di cercare :) più profondo.
descriverò una messa a punto di test abbastanza generica, si consiglia / bisogno aspetti test file solo molto specifici di esso.
Quello che facciamo in questo caso è letteralmente ciò che la vostra spec funzionali sopra degli Stati, come parte del framework di test complessivo:
-
Avere una libreria di test con due metodi (tra gli altri) -
test_file_identical()
etest_grep_file()
. Se hai bisogno di aiuto per scrivere quei due, si prega di rilasciare un commento e io vi offro alcuni suggerimenti (usiamo differenti comparatori, tra cui una combinazione di-e
, i confronti di vari attributistat
, confrontando stringhe contenuto del file di testata contro il file di riferimento ottenuta tramiteFile::Slurp
e facendogrep
del file, riga per riga o tramite contenuti slurped per file di piccole dimensioni, tra cui il confronto dei risultati grep massaggiato in un file di riferimento. -
Avere vostri casi prove organizzate in sotto-directory (o tarball), uno per ogni prova e ogni test si compone di 2 directory -. I file di input e file di output attesi
-
Avere il ciclo motore di prova di script su casi di test (che per noi sono meta-descritto sia da un datastructure Perl o, meglio ancora, un file XML in modo da analisti di business possono giocherellare con loro, se necessario).
-
Se un banco di prova specifica che il test deve corrispondere (esattamente o tramite grep), il motore di prova trova i file appropriato (i nomi di hard-coded, o tramite modello di nome specificato nel caso di test), si applicano quelle del file metodi di prova di cui al primo punto dell'elenco