tests unitaires pour un analyseur csv

14

Quels tests dois-je utiliser pour tester un parseur csv?

J'ai un analyseur csv simple en C #, et je veux être sûr d'avoir une bonne couverture de test unitaire de tous les cas de bord communs (et rares). Quels tests dois-je utiliser pour identifier les problèmes potentiels et les cas limites?

Joel Coehoorn
la source
5
Avez-vous vérifié Generatedata.com pour la création de différents fichiers de test?
Aaron McIver
@Aaron - les bons tests sont reproductibles et n'utilisent donc pas de données qui varient. Mais je pourrais peut-être les utiliser pour une génération unique que j'économiserais ensuite pour une suite de tests. Mais même alors, je veux m'assurer d'avoir couvert tous les différents cas de bord, ce qui n'est pas garanti au hasard.
Joel Coehoorn
Coehorn Les bons résultats des tests sont reproductibles. Je dirais que l'utilisation de données qui varient est très bien tant que le résultat souhaité reste constant. Si vous voulez vous assurer que vous avez couvert tous les différents cas marginaux (sur la base de vos commentaires, vous semblez certains de ceux-ci), pourquoi ne pas commencer à écrire les tests? Vous passerez plus de temps à chercher une solution magique qu'à écrire simplement les tests.
Aaron McIver
L'auteur recherche des cas de test, pas des données de test. J'aimerais bien savoir où trouver des tests publics pour diverses choses aussi.
ProdigySim

Réponses:

6

Je viens de trouver https://github.com/maxogden/csv-spectrum :

Un tas de différents fichiers CSV pour servir de test acide pour les bibliothèques d'analyse CSV. Il existe également des versions JSON des CSV à des fins de vérification.

L'objectif de ce référentiel est de capturer des cas de test pour représenter l'ensemble du spectre CSV.

Andreas Gohr
la source
Il est intéressant de noter que le propre analyseur csv de GitHub échoue aux tests en essayant de montrer les CSV de test ( github.com/maxogden/csv-spectrum/blob/master/csvs/… )
Ian Boyd
16

Voici quelques cas limites auxquels vous auriez dû réfléchir et avoir des cas de test.

  1. Champ de base. ,foo,
  2. Champ cité de base. ,"foo",
  3. Champ cité avec une nouvelle ligne intégrée. ,"foo\nbar"
  4. Champ cité avec virgule incorporée. ,"foo,bar"
  5. Champ cité avec devis intégré. ,"foo""bar"
  6. Faites-vous la distinction entre les chaînes vides et les valeurs nulles? Si vous le faites, alors ,,devrait être nul et,"", doit donner une chaîne vide.
  7. Essayez-vous de détecter les types de données et de faire la bonne chose? CSV est souvent utilisé pour les données numériques. Ajoutez les tests que vous jugez appropriés pour cela.
  8. Si vous écrivez des données, vous devez couvrir tous les cas ci-dessus.
  9. Que faites-vous avec des lignes avec différents nombres de champs? (Essaye-le.)
  10. Que faites-vous avec les lignes vides de fin? (Essaye-le.)
  11. Comment sont les performances sur un gros fichier? (Testez-le. J'ai vu trop d'analyseurs CSV locaux qui utilisent les chaînes de manière inefficace et, par conséquent, prennent du temps quadratique, ce qui rend les choses simples devenant douloureusement lentes.)
btilly
la source
10

Il n'y a pas de spécification formelle pour les fichiers CSV. Cependant, jetez un œil à RFC 4180 - Types de formats communs et MIME pour les fichiers CSV , (en particulier la section 2) qui documente le format qui semble être suivi par la plupart des implémentations.

Il semble assez simple de commencer à générer des cas de test à partir de la liste de la section 2, en particulier:

  1. Chaque enregistrement est situé sur une ligne distincte, délimitée par un saut de ligne (CRLF). Par exemple:

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

  2. Le dernier enregistrement du fichier peut ou non avoir un saut de ligne de fin. Par exemple:

    aaa, bbb, ccc CRLF zzz, yyy, xxx

  3. Il peut y avoir une ligne d'en-tête facultative apparaissant comme la première ligne du fichier avec le même format que les lignes d'enregistrement normales. Cet en-tête contiendra des noms correspondant aux champs du fichier et devrait contenir le même nombre de champs que les enregistrements dans le reste du fichier (la présence ou l'absence de la ligne d'en-tête doit être indiquée via le paramètre optionnel «en-tête» de ce Type MIME). Par exemple:

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

  4. Dans l'en-tête et chaque enregistrement, il peut y avoir un ou plusieurs champs, séparés par des virgules. Chaque ligne doit contenir le même nombre de champs dans le fichier. Les espaces sont considérés comme faisant partie d'un champ et ne doivent pas être ignorés. Le dernier champ de l'enregistrement ne doit pas être suivi d'une virgule. Par exemple:

    aaa, bbb, ccc

  5. Chaque champ peut ou non être placé entre guillemets doubles (cependant certains programmes, tels que Microsoft Excel, n'utilisent pas du tout de guillemets doubles). Si les champs ne sont pas entourés de guillemets doubles, les guillemets doubles peuvent ne pas apparaître à l'intérieur des champs. Par exemple:

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

  6. Les champs contenant des sauts de ligne (CRLF), des guillemets doubles et des virgules doivent être placés entre guillemets doubles. Par exemple:

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

  7. Si des guillemets doubles sont utilisés pour entourer des champs, un guillemet double apparaissant à l'intérieur d'un champ doit être échappé en le précédant d'un autre guillemet double. Par exemple:

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

Paddyslacker
la source
4

Vérifiez ce répertoire et regardez le code dans les fichiers * .t:

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

(Le numéro de version -1.32 pourrait éventuellement changer afin que le lien devienne "mort". Incrémentez le numéro de version vous-même par essai et erreur, ou allez dans le répertoire parent ou cliquez ici

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

et cliquez sur "Parcourir" pour accéder au code source de la dernière version)

Text :: CSV_XS est un module Perl mature pour l'analyse des fichiers CSV. Les fichiers * .t sont écrits en Perl 5, ils contiennent de nombreux cas de test pour l'auto-test du module, ils doivent être effectués au moment de l'installation du module.

knb
la source