Da un file di prova Perl, come faccio a controllare il contenuto di un file?

StackOverflow https://stackoverflow.com/questions/2543325

  •  23-09-2019
  •  | 
  •  

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

È stato utile?

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() e test_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 attributi stat, confrontando stringhe contenuto del file di testata contro il file di riferimento ottenuta tramite File::Slurp e facendo grep 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top