De um arquivo de teste PERL, como faço para verificar o conteúdo de um arquivo?
Pergunta
Quero testar um script que escrevi no Perl e verifique especificamente quais saídas ele grava no arquivo. Eu escrevi há algum tempo e não quero modificá -lo na extensão de transformá -lo em um módulo, mas gostaria de testá -lo de regressão antes de adicionar algumas pequenas alterações funcionais.
Até agora eu tenho
use Test::Command tests => 10;
exit_is_num($cmd, 0);
....
Mas o comando produz alguns arquivos e eu quero verificar esses arquivos são os mesmos que espero (igual ou correspondem a algum regexp). Alguma sugestão
Solução
Não há nada de mágica em um teste. Leia os arquivos, verifique se eles têm o conteúdo certo. BOG simples.
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
Nada inovador lá. Teste :: arquivo :: conteúdo fornecerá algumas funções de utilidade para que você não precise escrever isso repetidamente.
Se você estiver testando vários arquivos, poderá fazer os dados do processo orientados.
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 o conteúdo for grande, você poderá colocar a saída esperada nos arquivos e usar o arquivo_contents_identical ().
Por fim, se você deseja garantir que o programa produzisse apenas os arquivos que você espera e não haverá Strays, faça um diretório temporário, o Chdir nisso, execute o programa a partir daí e verifique o diretório apenas os arquivos que você espera. Vou deixar isso como um exercício para o leitor.
Outras dicas
Ok, eu vou com a abordagem de DIY da força bruta (no entanto, é possível que já exista algum módulo de teste com a API de verificação de arquivos - eu nunca esbarrei em um tão flexível/genérico quanto o que precisávamos e nos escrevemos e nunca senti a necessidade atraente de Pesquise mais fundo :).
Descreverei uma configuração de testes bastante genéricos, você pode/precisar/precisar apenas de aspectos de teste de arquivos muito específicos.
O que fazemos neste caso é literalmente o que sua especificação funcional acima afirma, como parte da estrutura geral de teste:
Tenha uma biblioteca de testes com dois métodos (entre outros) -
test_file_identical()
etest_grep_file()
. Se você precisar de ajuda para escrever esses dois, deixe um comentário e eu oferecerei algumas dicas (usamos comparadores diferentes, incluindo uma combinação de-e
, comparações de váriosstat
atributos, comparando seqüências de conteúdo de arquivo testado versus arquivo de benchmark obtido viaFile::Slurp
e fazendogrep
do arquivo, linha por linha ou via conteúdo arrastado para arquivos pequenos, incluindo a comparação dos resultados do Grep massageado com um arquivo de referência.Tenha seus casos de testes organizados em subdiretos (ou tarballs), um por teste e cada teste consiste em 2 diretórios - arquivos de entrada e arquivos de saída esperados.
Tenha o loop de script de mecanismo de teste sobre casos de teste (que para nós são meta-descritos por uma Perl Dataestruture ou melhor ainda, um arquivo XML para que os analistas de negócios possam mexer com eles, se necessário).
Se um caso de teste especificar que o teste precisa corresponder (exatamente ou via Grep), o mecanismo de teste encontra arquivos apropriados (nomes codificados ou via padrão de nome especificado no caso de teste), aplique os métodos de teste de arquivo mencionados no primeiro Bullet Point