De um arquivo de teste PERL, como faço para verificar o conteúdo de um arquivo?

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

  •  23-09-2019
  •  | 
  •  

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

Foi útil?

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() e test_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ários stat atributos, comparando seqüências de conteúdo de arquivo testado versus arquivo de benchmark obtido via File::Slurp e fazendo grep 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top