testes de unidade para um analisador csv

14

Quais testes devo usar para testar em unidade um analisador csv?

Eu tenho um analisador csv simples em c # e quero ter certeza de que tenho uma boa cobertura de teste de unidade de todos os casos comuns (e incomuns) de borda. Quais testes devo usar para identificar possíveis problemas e casos de fronteira?

Joel Coehoorn
fonte
5
Você verificou generateata.com para a criação de arquivos de teste variados?
Aaron McIver
@ Aaron - bons testes são repetíveis e, portanto, não usam dados que variam. Mas talvez eu possa usá-los para uma geração única que, em seguida, guardo para um conjunto de testes. Mas, mesmo assim, quero ter certeza de que cobri todos os diferentes casos extremos, o que aleatoriamente não é garantido.
Joel Coehoorn
Coehorn Os bons resultados dos testes são repetíveis. Eu diria que o uso de dados que variam é bom, desde que o resultado desejado permaneça constante. Se você deseja ter certeza de que cobriu todos os diferentes casos extremos (com base nos seus comentários, parece certo o que são), por que não começar a escrever os testes? Você passará mais tempo procurando uma solução mágica do que simplesmente escrevendo os testes.
Aaron McIver
O autor está procurando casos de teste, não dados de teste. Eu gostaria de saber onde encontrar testes públicos para várias coisas também.
ProdigySim

Respostas:

6

Acabei de encontrar https://github.com/maxogden/csv-spectrum :

Um monte de arquivos CSV diferentes para servir como um teste de ácido para bibliotecas de análise de CSV. Também existem versões JSON dos CSVs para fins de verificação.

O objetivo deste repositório é capturar casos de teste para representar todo o espectro CSV.

Andreas Gohr
fonte
É interessante que o próprio analisador CSV do GitHub falhar os testes ao tentar mostrar os CSVs teste ( github.com/maxogden/csv-spectrum/blob/master/csvs/... )
Ian Boyd
16

Aqui estão alguns casos de limite nos quais você deveria ter pensado e ter casos de teste.

  1. Campo básico. ,foo,
  2. Campo citado básico. ,"foo",
  3. Campo entre aspas com nova linha incorporada. ,"foo\nbar"
  4. Campo entre aspas com vírgula incorporada. ,"foo,bar"
  5. Campo citado com aspas incorporadas. ,"foo""bar"
  6. Você distingue entre cadeias vazias e nulos? Se você o fizer, ,,deve ser um nulo e ,"",fornecer uma string vazia.
  7. Você tenta detectar tipos de dados e faz a coisa certa? O CSV é frequentemente usado para dados numéricos. Adicione os testes que julgar apropriados para isso.
  8. Se você gravar dados, deverá cobrir todos os casos acima.
  9. O que você faz com linhas com diferentes números de campos? (Teste-o.)
  10. O que você faz com as linhas em branco à direita? (Teste-o.)
  11. Como está o desempenho em um arquivo grande? (Teste. Já vi muitos analisadores de CSV caseiros que usam seqüências de caracteres de maneira ineficiente e, como resultado, levam tempo quadrático, fazendo com que coisas simples se tornem dolorosamente lentas.)
btilly
fonte
10

Não há especificação formal para arquivos CSV. No entanto, dê uma olhada no RFC 4180 - Tipos de formato comum e MIME para arquivos CSV , (particularmente a Seção 2), que documenta o formato que parece ser seguido pela maioria das implementações.

Parece bastante simples começar a gerar alguns casos de teste a partir da lista na seção 2, especificamente:

  1. Cada registro está localizado em uma linha separada, delimitada por uma quebra de linha (CRLF). Por exemplo:

    aaa, bbb, CRLF CCCF zzz, aaaa, xxx CRLF

  2. O último registro no arquivo pode ou não ter uma quebra de linha final. Por exemplo:

    aaa, bbb, ccc CRLF zzz, aaaa, xxx

  3. Talvez haja uma linha de cabeçalho opcional aparecendo como a primeira linha do arquivo com o mesmo formato das linhas de registro normais. Este cabeçalho conterá nomes correspondentes aos campos no arquivo e deve conter o mesmo número de campos que os registros no restante do arquivo (a presença ou ausência da linha do cabeçalho deve ser indicada através do parâmetro opcional "header" deste Tipo MIME). Por exemplo:

    nome_campo, nome_campo, nome_campo CRLF aaa, bbb, CRLF ccc zzz, aaaa, xxx CRLF

  4. Dentro do cabeçalho e de cada registro, pode haver um ou mais campos, separados por vírgulas. Cada linha deve conter o mesmo número de campos em todo o arquivo. Os espaços são considerados parte de um campo e não devem ser ignorados. O último campo no registro não deve ser seguido por vírgula. Por exemplo:

    aaa, bbb, ccc

  5. Cada campo pode ou não estar entre aspas duplas (no entanto, alguns programas, como o Microsoft Excel, não usam aspas duplas). Se os campos não estiverem entre aspas duplas, as aspas duplas poderão não aparecer dentro dos campos. Por exemplo:

    "aaa", "bbb", "ccc" CRLF zzz, aaaa, xxx

  6. Os campos que contêm quebras de linha (CRLF), aspas duplas e vírgulas devem ser colocados entre aspas duplas. Por exemplo:

    "aaa", "b CRLF bb", "ccc" CRLF zzz, aaaa, xxx

  7. Se aspas duplas forem usadas para delimitar campos, uma aspas dupla aparecendo dentro de um campo deverá ser escapada precedendo-a com outra aspas dupla. Por exemplo:

    "aaa", "b" "bb", "ccc"

Paddyslacker
fonte
8

Os dados do censo dos EUA estão disponíveis em CSV

Estou trabalhando nisso há um tempo. Certamente é estranho o suficiente para ser um bom teste, e há toneladas e toneladas disso.

Satanicpuppy
fonte
você se importaria de explicar mais sobre o que faz e por que o recomenda como resposta à pergunta? "Link-só responde" não são muito bem-vindos no Stack Câmbio
mosquito
4

Verifique este diretório e veja o código nos arquivos * .t .:

http://cpansearch.perl.org/src/MAKAMAKA/Text-CSV-1.32/t/

(O número da versão -1.32 pode mudar eventualmente, para que o link fique "inoperante". Aumente o número da versão por tentativa e erro, ou acesse o diretório pai ou clique aqui

https://metacpan.org/pod/Text::CSV

e clique em "Browse" para o código fonte da versão mais recente)

O Text :: CSV_XS é um módulo perl maduro para analisar arquivos csv. Os arquivos * .t são escritos em Perl 5, contêm muitos casos de teste para autoteste do módulo e devem ser executados no momento da instalação do módulo.

knb
fonte