Estou trabalhando em um projeto com alguns formatos de arquivo. Alguns formatos são especificados por .xsds, outros pela documentação em seus respectivos sites, e alguns são formatos internos personalizados que não possuem documentação. Mwahahahaha.
Qual é o problema?
Gostaria de testar meus leitores de arquivos, mas não tenho muita certeza de como fazê-lo. O fluxo do aplicativo é assim:
file.___ ===> read by FileReader.java ===> which creates a Model object
onde a FileReader
interface está
public interface FileReader {
public Model read(String filename);
}
O Model
possui vários atributos preenchidos quando o arquivo é lido. Parece algo como
public class Model {
List<String> as;
List<String> bs;
boolean isAPain = true;
// ...
}
O que eu tentei?
Minha única idéia era criar "geradores" de arquivo para cada formato de arquivo. Esses geradores são basicamente construtores que recebem algumas variáveis (por exemplo, número de comentários a serem gerados em um arquivo) e emitem um arquivo de amostra que, em seguida, leio e comparo o resultado Model
com as variáveis que usei para gerar o arquivo inicialmente.
Isso tem alguns problemas, no entanto:
- Os arquivos que ele gera não se parecem com arquivos reais. O gerador não tem nenhuma consciência do contexto.
- É difícil reconhecer se o gerador gerou casos de borda, pois sou eu quem define manualmente as variáveis. Esse método é pouco melhor do que eu criando uma dúzia de arquivos de amostra.
Existem maneiras melhores de fazer isso?
EDIT: Mudança de unidade para integração, já que é isso que eu realmente quero dizer.
EDIT2: Aqui está um exemplo dos casos extremos que mencionei.
Cada arquivo representa um gráfico composto de vértices e arestas. Esses vértices e arestas podem ser anexados de diferentes maneiras, portanto:
v1 -- e1 --> v2 <-- e2 -- v3
é diferente de
v1 -- e1 --> v2 -- e2 --> v3
em que a direção das bordas é importante. Não tenho certeza se isso está no escopo da pergunta, mas é difícil pensar em todos os casos de arestas pertinentes quando defino manualmente o número de vértices, o número de arestas e apenas giro as conexões aleatoriamente.
FileReader
implementação real )? Exemplo: considerando os casos extremos encontrados nos formatos de arquivo de imagem , para cada entrada da tabela, se a combinação de propriedades de linha / coluna for suportada, deve haver pelo menos um caso de teste (um arquivo de dados) que cubra essa combinação.Respostas:
Primeiro, vamos falar sobre quais são seus objetivos:
você obviamente não deseja testar "formatos de arquivo" - deseja testar suas diferentes
FileReader
implementaçõesvocê deseja encontrar o maior número possível de erros por testes automáticos
Para atingir esse objetivo na íntegra, IMHO você tem que combinar diferentes estratégias:
FileReader
implementações consistirão em muitas partes e funções diferentes. Escreva pequenos testes que testem cada um deles isoladamente; projete suas funções de maneira que elas não precisem realmente ler os dados de um arquivo. Esse tipo de teste ajudará você a testar a maioria dos seus casos extremos.FileReader
s, mas pode valer a pena fazer isso, pois geralmente encontra bugs não revelados pelas duas primeiras estratégias. Algumas pessoas chamam essas coisas de "testes de integração", outras preferem "testes de aceitação", mas, na verdade, o termo realmente não importa.IMHO não existe uma abordagem "atalho" que traga o benefício de todas as três estratégias "pelo preço de uma". Se você deseja detectar casos extremos, bem como falhas nos casos padrão e nos casos do mundo real, precisa investir pelo menos algum esforço - provavelmente muito -. Felizmente, todas essas abordagens podem ser usadas para criar testes automáticos e repetíveis.
Além disso, certifique-se de que seus
FileReader
s não oculte nenhum erro ao ler esses dados - crie verificações / asserções embutidas, lance exceções quando algo der errado internamente, etc. Isso oferece ao seu código de teste uma chance muito melhor de detectar erros , mesmo quando você não possui um arquivo de teste explícito ou um caso de teste para uma situação inesperada.fonte