Unit-Tests für einen CSV-Parser

14

Welche Tests sollte ich verwenden, um einen CSV-Parser nach dem Unit-Test zu testen?

Ich habe einen einfachen csv-Parser in C #, und ich möchte sichergehen, dass ich eine gute Einheitentestabdeckung für alle gängigen (und seltenen) Edge-Fälle habe. Welche Tests sollte ich verwenden, um mögliche Probleme und Grenzfälle zu identifizieren?

Joel Coehoorn
quelle
5
Haben Sie generatedata.com auf die Erstellung unterschiedlicher Testdateien überprüft ?
Aaron McIver
@Aaron - gute Tests sind wiederholbar und verwenden daher keine unterschiedlichen Daten. Aber ich könnte sie vielleicht für eine einmalige Generation verwenden, die ich dann für eine Testsuite speichere. Aber selbst dann möchte ich sicherstellen, dass ich alle verschiedenen Randfälle abgedeckt habe, die nicht garantiert zufällig sind.
Joel Coehoorn
Coehorn Gute Testergebnisse sind wiederholbar. Ich würde argumentieren, dass die Verwendung von Daten, die variieren, in Ordnung ist, solange das gewünschte Ergebnis konstant bleibt. Wenn Sie sicherstellen möchten, dass Sie alle verschiedenen Randfälle abgedeckt haben (basierend auf Ihren Kommentaren scheinen Sie sicher zu sein, was diese sind), warum sollten Sie nicht mit dem Schreiben der Tests beginnen? Sie werden mehr Zeit damit verbringen, nach einer magischen Lösung zu suchen, als nur die Tests zu schreiben.
Aaron McIver
Der Autor sucht nach Testfällen, nicht nach Testdaten. Ich wünschte, ich wüsste, wo ich öffentliche Tests für verschiedene Dinge finden könnte.
ProdigySim

Antworten:

6

Ich habe gerade https://github.com/maxogden/csv-spectrum gefunden :

Eine Reihe verschiedener CSV-Dateien, die als Test für CSV-Analysebibliotheken dienen. Es gibt auch JSON-Versionen der CSVs für Überprüfungszwecke.

Das Ziel dieses Repository ist die Erfassung von Testfällen zur Darstellung des gesamten CSV-Spektrums.

Andreas Göhr
quelle
Es ist interessant, dass GitHubs eigener CSV-Parser die Tests nicht besteht, wenn er versucht, die Test-CSVs anzuzeigen ( github.com/maxogden/csv-spectrum/blob/master/csvs/… )
Ian Boyd
16

Hier sind ein paar Grenzfälle, die Sie durchdacht haben sollten und für die Sie Testfälle haben sollten.

  1. Grundfeld. ,foo,
  2. Einfaches zitiertes Feld. ,"foo",
  3. Zitiertes Feld mit eingebettetem Zeilenumbruch. ,"foo\nbar"
  4. Zitiertes Feld mit eingebettetem Komma. ,"foo,bar"
  5. Zitiertes Feld mit eingebettetem Zitat. ,"foo""bar"
  6. Unterscheiden Sie zwischen leeren Zeichenfolgen und Nullen? Wenn Sie dies tun, ,,sollten Sie eine Null sein und ,"",eine leere Zeichenfolge angeben.
  7. Versuchen Sie, Datentypen zu erkennen und das Richtige zu tun? CSV wird häufig für numerische Daten verwendet. Fügen Sie die Tests hinzu, die Sie für angemessen halten.
  8. Wenn Sie Daten schreiben, sollten Sie alle oben genannten Fälle abdecken.
  9. Was machen Sie mit Zeilen mit unterschiedlicher Anzahl von Feldern? (Probier es aus.)
  10. Was machen Sie mit Leerzeilen? (Probier es aus.)
  11. Wie ist die Leistung einer großen Datei? (Testen Sie es. Ich habe zu viele hausgemachte CSV-Parser gesehen, die Zeichenfolgen ineffizient verwenden und infolgedessen eine quadratische Zeit in Anspruch nehmen, was dazu führt, dass einfache Dinge schmerzhaft langsam werden.)
btilly
quelle
10

Es gibt keine formale Spezifikation für CSV-Dateien. Schauen Sie sich jedoch RFC 4180 - Allgemeines Format und MIME-Typen für CSV-Dateien an (insbesondere Abschnitt 2), in dem das Format dokumentiert ist, dem die meisten Implementierungen zu folgen scheinen.

Es scheint ziemlich einfach, einige Testfälle aus der Liste in Abschnitt 2 zu generieren, insbesondere:

  1. Jeder Datensatz befindet sich in einer separaten Zeile, die durch einen Zeilenumbruch (CRLF) begrenzt ist. Beispielsweise:

    aaa, bbb, ccc CRLF zzz, jjj, xxx CRLF

  2. Der letzte Datensatz in der Datei enthält möglicherweise einen Zeilenumbruch am Ende oder nicht. Beispielsweise:

    aaa, bbb, ccc CRLF zzz, yyy, xxx

  3. Möglicherweise wird eine optionale Kopfzeile als erste Zeile der Datei mit demselben Format wie normale Aufzeichnungszeilen angezeigt. Diese Kopfzeile enthält Namen, die den Feldern in der Datei entsprechen, und sollte die gleiche Anzahl von Feldern enthalten wie die Datensätze in der übrigen Datei (das Vorhandensein oder Fehlen der Kopfzeile sollte über den optionalen Parameter "header" angegeben werden) Mime Typ). Beispielsweise:

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

  4. Innerhalb des Headers und jedes Datensatzes können ein oder mehrere Felder vorhanden sein, die durch Kommas getrennt sind. Jede Zeile sollte die gleiche Anzahl von Feldern in der Datei enthalten. Leerzeichen werden als Teil eines Feldes betrachtet und sollten nicht ignoriert werden. Auf das letzte Feld im Datensatz darf kein Komma folgen. Beispielsweise:

    aaa, bbb, ccc

  5. Jedes Feld kann in doppelte Anführungszeichen eingeschlossen sein oder nicht (einige Programme, wie z. B. Microsoft Excel, verwenden jedoch überhaupt keine doppelten Anführungszeichen). Wenn Felder nicht in doppelte Anführungszeichen eingeschlossen sind, werden in den Feldern möglicherweise keine doppelten Anführungszeichen angezeigt. Beispielsweise:

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

  6. Felder, die Zeilenumbrüche (CRLF), doppelte Anführungszeichen und Kommas enthalten, sollten in doppelte Anführungszeichen eingeschlossen werden. Beispielsweise:

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

  7. Wenn Felder in Anführungszeichen gesetzt werden, muss ein Anführungszeichen, das in einem Feld steht, durch ein weiteres Anführungszeichen maskiert werden. Beispielsweise:

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

Paddyslacker
quelle
8

Die US-Volkszählungsdaten sind in CSV verfügbar

Ich habe eine Weile daran gearbeitet. Es ist sicherlich komisch genug, um ein guter Test zu sein, und es gibt Unmengen davon.

Satanicpuppy
quelle
Würde es Ihnen etwas ausmachen, mehr darüber zu erklären, was es tut, und warum empfehlen Sie es als Antwort auf die gestellte Frage? "Nur-Link-Antworten" sind bei Stack Exchange nicht ganz willkommen
gnat
4

Checken Sie dieses Verzeichnis aus und sehen Sie sich den Code in den * .t-Dateien an:

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

(Die Versionsnummer -1.32 kann sich eventuell ändern, sodass der Link "tot" wird. Erhöhen Sie die Versionsnummer selbst durch Ausprobieren oder wechseln Sie in das übergeordnete Verzeichnis oder klicken Sie hier

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

und klicken Sie sich über "Durchsuchen" zum Quellcode der neuesten Version durch)

Text :: CSV_XS ist ein ausgereiftes Perl-Modul zum Parsen von CSV-Dateien. Die * .t-Dateien sind in Perl 5 geschrieben und enthalten viele Testfälle zum Selbsttest des Moduls. Sie müssen bei der Installation des Moduls durchgeführt werden.

knb
quelle