unit test per un parser CSV


14

Quali test devo usare per testare un'unità un parser CSV?

Ho un semplice parser CSV in C # e voglio essere sicuro di avere una buona copertura del test unitario di tutti i casi limite comuni (e non comuni). Quali test devo usare per identificare potenziali problemi e casi limite?


5
Hai verificato generateata.com per la creazione di vari file di test?
Aaron McIver,

@Aaron: buoni test sono ripetibili e quindi non usano dati che variano. Ma potrei forse usarli per una generazione unica che poi risparmierò per una suite di test. Ma anche allora, voglio essere sicuro di aver coperto tutti i diversi casi limite, cosa che non è garantita casualmente.
Joel Coehoorn,

Coehorn I buoni risultati dei test sono ripetibili. Direi che usare i dati che variano va bene finché il risultato desiderato rimane costante. Se vuoi assicurarti di aver coperto tutti i diversi casi limite (in base ai tuoi commenti sembri certo quali siano) perché non iniziare a scrivere i test? Trascorrerai più tempo a cercare una soluzione magica e poi a scrivere semplicemente i test.
Aaron McIver,

L'autore sta cercando casi di test, non dati di test. Vorrei sapere anche dove trovare test pubblici per varie cose.
ProdigySim

Risposte:


6

Ho appena trovato https://github.com/maxogden/csv-spectrum :

Un sacco di diversi file CSV da utilizzare come test acido per le librerie di analisi CSV. Esistono anche versioni JSON dei CSV a scopo di verifica.

L'obiettivo di questo repository è acquisire casi di test per rappresentare l'intero spettro CSV.


È interessante che il proprio parser csv di GitHub fallisca i test quando prova a mostrare i test CSV ( github.com/maxogden/csv-spectrum/blob/master/csvs/… )
Ian Boyd,

16

Ecco alcuni casi limite che dovresti aver pensato e per cui avere dei casi di prova.

  1. Campo di base. ,foo,
  2. Campo citato di base. ,"foo",
  3. Campo tra virgolette con newline incorporato. ,"foo\nbar"
  4. Campo tra virgolette con virgola incorporata. ,"foo,bar"
  5. Campo tra virgolette con citazione incorporata. ,"foo""bar"
  6. Distingui tra stringhe vuote e null? Se lo fai, allora ,,dovrebbe essere nullo e ,"",dovrebbe dare una stringa vuota.
  7. Cerchi di rilevare i tipi di dati e fai la cosa giusta? CSV è spesso usato per dati numerici. Aggiungi i test che ritieni appropriati.
  8. Se si scrivono dati, è necessario coprire tutti i casi di cui sopra.
  9. Cosa fai con le linee con diversi numeri di campi? (Provalo.)
  10. Cosa fai con le righe vuote finali? (Provalo.)
  11. Come sono le prestazioni su un file di grandi dimensioni? (Provalo. Ho visto troppi parser CSV nostrani che usano le stringhe in modo inefficiente e di conseguenza impiegano un tempo quadratico, portando a cose semplici che diventano dolorosamente lente.)

10

Non esiste una specifica formale per i file CSV. Tuttavia, dai un'occhiata a RFC 4180 - Tipi comuni e tipi MIME per i file CSV , (in particolare la Sezione 2) che documenta il formato che sembra essere seguito dalla maggior parte delle implementazioni.

Sembra abbastanza semplice iniziare a generare alcuni casi di test dall'elenco nella sezione 2, in particolare:

  1. Ogni record si trova su una riga separata, delimitata da un'interruzione di riga (CRLF). Per esempio:

    aaa, bbb, ccc CRLF zzz, yyy, xxx CRLF

  2. L'ultimo record nel file potrebbe avere o meno un'interruzione di riga finale. Per esempio:

    aaa, bbb, ccc CRLF zzz, yyy, xxx

  3. C'è forse una riga di intestazione opzionale che appare come la prima riga del file con lo stesso formato delle normali righe di record. Questa intestazione conterrà i nomi corrispondenti ai campi nel file e dovrebbe contenere lo stesso numero di campi dei record nel resto del file (la presenza o l'assenza della riga di intestazione deve essere indicata tramite il parametro facoltativo "header" di questo Tipo MIME). Per esempio:

    field_name, field_name, field_name CRLF aaa, bbb, ccc CRLF zzz, yyy, xxx CRLF

  4. All'interno dell'intestazione e di ogni record, possono esserci uno o più campi, separati da virgole. Ogni riga deve contenere lo stesso numero di campi in tutto il file. Gli spazi sono considerati parte di un campo e non devono essere ignorati. L'ultimo campo nel record non deve essere seguito da una virgola. Per esempio:

    aaa, bbb, ccc

  5. Ciascun campo può essere racchiuso tra virgolette doppie (tuttavia alcuni programmi, come Microsoft Excel, non utilizzano affatto doppie virgolette). Se i campi non sono racchiusi tra virgolette doppie, le virgolette doppie potrebbero non apparire all'interno dei campi. Per esempio:

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

  6. I campi che contengono interruzioni di riga (CRLF), virgolette doppie e virgole devono essere racchiusi tra virgolette doppie. Per esempio:

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

  7. Se le virgolette doppie vengono utilizzate per racchiudere i campi, è necessario evitare una virgoletta doppia che appare all'interno di un campo precedendola con un'altra virgoletta doppia. Per esempio:

    "Aaa", "b" "BB", "CCC"



4

Dai un'occhiata a questa directory e guarda il codice nei file * .t .:

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

(Il numero di versione -1.32 potrebbe cambiare alla fine, quindi il collegamento potrebbe diventare "morto". Aumenta tu stesso il numero di versione per tentativi ed errori, oppure vai alla directory principale o fai clic qui

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

e fai clic su "Sfoglia" per trovare il codice sorgente della versione più recente)

Text :: CSV_XS è un modulo perl maturo per l'analisi dei file CSV. I file * .t sono scritti in Perl 5, contengono molti casi di test per l'autotest del modulo e devono essere eseguiti al momento dell'installazione del modulo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.