Os dados de teste devem ser verificados no controle de versão?


40

Estou escrevendo um código de teste para um recurso que processa arquivos PDF. A idéia básica por trás dos testes é que eu os apontei para alguns PDFs selecionados especialmente, eles os processam e eu verifico se a saída é o que eu espero.

Minha pergunta é: onde devo armazenar esses PDFs grandes? Devo verificá-los no controle de versão junto com o código? Ou colocá-los em outro lugar? Obviamente, o código de teste é inútil sem os PDFs (ou mesmo com PDFs diferentes), mas ainda assim, colocá-los em nosso repositório parece errado.



19
@ MichaelKjörling:Tests != Test Data
Robert Harvey

4
@RobertHarvey True, mas se os dados de teste forem necessários para o teste funcionar, acho que eles devem ser considerados parte do teste. Essa é também a abordagem adotada pelas três respostas até agora, como eu as entendo.
um CVn

Respostas:


84

Seu sistema de controle de versão deve conter tudo o que é necessário para criar, compilar, testar e empacotar um aplicativo para distribuição (por exemplo, MSI, RPM). Eu também argumentaria que as configurações de compilação e outros scripts também deveriam estar no controle de versão.

Deveria poder verificar um projeto e ter um ambiente completo de compilação, compilação e teste.

Existem duas abordagens para verificar dados de teste. Primeiro, você pode verificar os próprios dados de teste (neste caso, PDFs). Segundo, você pode verificar os dados de origem que podem ser usados ​​para gerar dados de teste (se aplicável). Pode ser um script SQL carregado em um banco de dados em branco contendo dados de teste ou talvez um arquivo baseado em texto que possa ser compilado em um PDF ou outro arquivo.

Outros podem discordar em verificar tudo no controle de versão, mas, na minha experiência profissional, descobri que é fundamental garantir que um ambiente completo possa ser reconstruído do zero.


20
Sim. Absolutamente sim. Em 2014, não há justificativa alguma para o uso do controle de revisão que não lida com arquivos binários sem problemas.
Kilian Foth

4
Concordo, mas você definitivamente deseja evitar a situação em que está verificando itens indesejados também. Por exemplo, se os dados de teste incluírem uma pasta "output" que contém todos os arquivos pdf gerados pelos testes, convém não incluí-los no repositório. Mas eu concordo que os testes em si devem fazer parte do repositório, bem como quaisquer pacotes necessários para executá-lo.
23937 Kenneth Garza #

11
@KennethGarza Não é difícil, realmente. Como regra geral, qualquer conteúdo original (código-fonte, código-fonte de teste, dados de teste, mídia, documentação [real], bibliotecas de terceiros, scripts de criação, scripts de ferramentas, scripts de conversão etc.) deve ser incluído, enquanto todos os dados que pode ser gerado em tempo razoável a partir dos dados originais não deve ser. Além disso, dadas as saídas de teste, elas provavelmente só fazem sentido após a execução dos testes, caso contrário você não está testando seu programa, está testando a capacidade do software VCS de preservar a integridade de seus arquivos :)
Thomas

11
@ MarnenLaibow-Koser: um projeto em que trabalhei para detectar falhas elétricas em cabos de marcapasso implantados tinha um conjunto de testes de mais de 40 GB. Não existe um VCS em que lidar com isso não seja desagradável. Ter dois repositórios é um aborrecimento administrativo próprio, mas às vezes pode ser a melhor escolha.
Whatsisname 18/05/19

11
@ MarnenLaibow-Koser você conseguiu. Os testes de integração estão em repositório separado e, se o usuário quiser executá-lo localmente, o gerenciamento de dependências buscará o arquivo zip e o descompactará. Geralmente, o servidor / farm de integração contínua tem a tarefa de realizar o teste de integração e evitará a ramificação do recurso de mesclagem até que os testes de integração sejam aprovados.
user482745

15

Se os testes são inúteis sem os arquivos de instalação que você preparou, faz sentido incluir os arquivos no seu VCS junto com o código do teste.

Embora os arquivos usados ​​no teste não sejam código, você pode visualizá-los como uma dependência em que o código depende. Portanto, há mérito em manter tudo junto.


Por outro lado, alguns VCSs não lidam bem com arquivos binários grandes e outros têm forte oposição a incluir qualquer tipo de arquivo binário em um VCS. Se um desses casos se aplicar a você, o armazenamento dos arquivos de teste em um local conhecido e de fácil acesso também faria sentido.

Eu também consideraria colocar um comentário no código de teste que diz "depende da foo.pdfexecução de todos os testes".


Não vejo nada de errado em fazer os testes verificarem os dados, se não forem encontrados, tentar obtê-los (por exemplo, a partir de um URL) e falhar se nenhum deles funcionar. Confiar na rede é uma péssima idéia, pois torna os testes mais lentos e mais frágeis; mas tentar é menos frágil do que não e obter (e armazenar em cache localmente) automaticamente os dados corretos é mais rápido do que ler manualmente documentos / comentários, obtê-los e implementá-los.
Warbo

7

Se forem dados estáticos, sim, coloque-os no controle de versão. Na verdade, esses arquivos não são alterados após o check-in; eles serão removidos se essa funcionalidade não for mais necessária ou novos arquivos de teste serão adicionados ao lado. De qualquer forma, você não precisa se preocupar com diferenças binárias ruins ocupando espaço.

Se você estiver gerando dados de teste, por exemplo. aleatoriamente, salve-o automaticamente quando um teste falhar, mas descarte-o de outra forma. Todos os dados salvos dessa maneira devem ser transformados em testes de regressão regulares, para que esses casos extremos sejam definitivamente testados no futuro, em vez de depender da sorte do sorteio.


2
Se você está gerando dados de teste aleatoriamente, deve comprar um livro sobre como escrever testes automatizados reproduzíveis.
Dawood diz que restabelece Monica

5
@DavidWallace Então você está dizendo que campos inteiros, como teste de fuzz, verificação de propriedades e teste estatístico de software, não são apenas errados, mas prejudiciais?
Warbo

5
@DavidWallace random! = Não reproduzível.
congusbongus

5
@DavidWallace, você pode chamá-lo como quiser, então. Dados de teste aleatórios, registro de entradas, reciclagem, se necessário, e portanto reproduzíveis. Não leva a um mundo de mágoa.
congusbongus

2
@DavidWallace "em vez de parar para pensar em quais casos de teste são realmente necessários" não significa "nenhum teste aleatório", significa "não apenas testes aleatórios". Quanto a "você não pode reproduzir os dados que encontraram o bug", você realmente leu a resposta que está comentando? ;)
Warbo

0

Definitivamente, inclua esses dados nos seus testes e no código principal do aplicativo. Ajuda a ter um conjunto de testes muito bem organizado - portanto, se você estiver testando a extração de pdf (e tiver esse código bem encapsulado), poderá criar um caminho para os dados de teste, com base no caminho para o código do aplicativo - isso sempre funcionou para mim.

Com o git, você pode configurar um .gitignore para impedir que qualquer saída temporária ou registro de teste polua seu repositório.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.