testy jednostkowe dla parsera csv

14

Jakich testów należy użyć do testowania jednostkowego analizatora składni csv?

Mam prosty parser csv w języku C # i chcę mieć pewność, że mam dobry zasięg testu wszystkich wspólnych (i nietypowych) przypadków krawędzi. Jakie testy należy zastosować, aby zidentyfikować potencjalne problemy i przypadki graniczne?

Joel Coehoorn
źródło
5
Czy sprawdziłeś wygenerowane.com.com w celu utworzenia różnych plików testowych?
Aaron McIver
@Aaron - dobre testy są powtarzalne i dlatego nie używaj danych, które się różnią. Ale może mógłbym użyć ich do jednorazowego pokolenia, które następnie zapisałem na zestaw testów. Ale nawet wtedy chcę się upewnić, że omówiłem wszystkie różne przypadki brzegowe, co nie jest gwarantowane przez przypadek.
Joel Coehoorn
Coehorn Dobre wyniki testu są powtarzalne. Twierdziłbym, że używanie różnych danych jest w porządku, o ile pożądany wynik pozostaje stały. Jeśli chcesz się upewnić, że omówiłeś wszystkie różne przypadki brzegowe (na podstawie twoich komentarzy wydaje się pewne, jakie to są), dlaczego nie zacząć pisać testów? Spędzisz więcej czasu szukając magicznego rozwiązania, niż po prostu pisząc testy.
Aaron McIver
Autor szuka przypadków testowych, a nie danych testowych. Chciałbym też wiedzieć, gdzie znaleźć publiczne testy dla różnych rzeczy.
ProdigySim

Odpowiedzi:

6

Właśnie znalazłem https://github.com/maxogden/csv-spectrum :

Kilka różnych plików CSV, które mają służyć jako test kwasowy dla bibliotek parsujących CSV. Istnieją również wersje CSS CSS do celów weryfikacji.

Celem tego repozytorium jest przechwytywanie przypadków testowych reprezentujących całe spektrum CSV.

Andreas Gohr
źródło
Interesujące jest to, że własny parser csv GitHub nie przejdzie testów podczas próby pokazania testowych plików CSV ( github.com/maxogden/csv-spectrum/blob/master/csvs/… )
Ian Boyd
16

Oto kilka przypadków granicznych, które powinieneś przemyśleć i mieć przypadki testowe.

  1. Pole podstawowe. ,foo,
  2. Podstawowe pole cytowane. ,"foo",
  3. Cytowane pole z osadzonym znakiem nowej linii. ,"foo\nbar"
  4. Cytowane pole z osadzonym przecinkiem. ,"foo,bar"
  5. Cytowane pole z osadzonym cytatem. ,"foo""bar"
  6. Czy rozróżniasz puste ciągi i wartości null? Jeśli tak, to ,,powinno być zerowe i ,"",powinno dać pusty ciąg.
  7. Czy próbujesz wykryć typy danych i postępujesz właściwie? CSV jest często używany do danych liczbowych. Dodaj testy, które uważasz za odpowiednie.
  8. Jeśli zapisujesz dane, powinieneś objąć wszystkie powyższe przypadki.
  9. Co robisz z liniami o różnej liczbie pól? (Sprawdź to.)
  10. Co robisz z końcowymi pustymi liniami? (Sprawdź to.)
  11. Jaka jest wydajność dużego pliku? (Przetestuj. Widziałem zbyt wiele domowych parserów CSV, które używają ciągów nieefektywnie, w wyniku czego zajmują kwadratowy czas, co powoduje, że proste rzeczy stają się boleśnie powolne).
btilly
źródło
10

Nie ma formalnej specyfikacji plików CSV. Jednak spójrz na RFC 4180 - Typowe formaty i typy MIME dla plików CSV (szczególnie sekcja 2), które dokumentują format, który wydaje się być przestrzegany przez większość implementacji.

Generowanie niektórych przypadków testowych z listy w sekcji 2 wydaje się dość proste, a konkretnie:

  1. Każdy rekord znajduje się w osobnej linii, oddzielonej linią podziału (CRLF). Na przykład:

    aaa, bbb, ccc CRLF zzz, rrr, xxx CRLF

  2. Ostatni rekord w pliku może, ale nie musi, mieć kres końca linii. Na przykład:

    aaa, bbb, ccc CRLF zzz, rrr, xxx

  3. Może być opcjonalna linia nagłówka pojawiająca się jako pierwsza linia pliku w tym samym formacie, co normalne linie zapisu. Nagłówek ten będzie zawierać nazwy odpowiadające polom w pliku i powinien zawierać taką samą liczbę pól, jak rekordy w pozostałej części pliku (obecność lub brak wiersza nagłówka należy wskazać za pomocą opcjonalnego parametru „nagłówek” tego Typ MIME). Na przykład:

    nazwa_pola, nazwa_pola, nazwa_pola CRLF aaa, bbb, ccc CRLF zzz, rrr, xxx CRLF

  4. W nagłówku i każdym rekordzie może znajdować się jedno lub więcej pól oddzielonych przecinkami. Każda linia powinna zawierać tę samą liczbę pól w całym pliku. Spacje są uważane za część pola i nie należy ich ignorować. Po ostatnim polu w rekordzie nie może występować przecinek. Na przykład:

    aaa, bbb, ccc

  5. Każde pole może być lub może nie być ujęte w podwójny cudzysłów (jednak niektóre programy, takie jak Microsoft Excel, w ogóle nie używają podwójnych cudzysłowów). Jeśli pola nie są ujęte w podwójne cudzysłowy, wówczas podwójne pola mogą nie pojawiać się w polach. Na przykład:

    „aaa”, „bbb”, „ccc” CRLF zzz, rrr, xxx

  6. Pola zawierające podział wiersza (CRLF), podwójne cudzysłowy i przecinki powinny być ujęte w cudzysłowy. Na przykład:

    „aaa”, „b CRLF bb”, „ccc” CRLF zzz, rrr, xxx

  7. Jeśli cudzysłowy są używane do zamykania pól, to podwójne cudzysłowy pojawiające się w polu muszą być poprzedzone innym podwójnym cudzysłowem. Na przykład:

    „aaa”, „b” „bb”, „ccc”

Paddyslacker
źródło
8

Dane ze spisu powszechnego w USA są dostępne w CSV

Pracowałem nad tym przez jakiś czas. To z pewnością wystarczająco dziwne, aby być dobrym testem, a jest ich mnóstwo.

Satanicpuppy
źródło
czy mógłbyś wyjaśnić więcej na temat tego, co robi i dlaczego polecasz to jako odpowiedź na zadane pytanie? „Tylko odpowiedzi” nie są mile widziane na Stack Exchange
gnat
4

Sprawdź ten katalog i spójrz na kod w plikach * .t .:

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

(Numer wersji -1.32 może w końcu ulec zmianie, więc link może stać się „martwy”. Zwiększ liczbę wersji samodzielnie metodą prób i błędów lub przejdź do katalogu nadrzędnego lub kliknij tutaj

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

i kliknij „Przeglądaj” do kodu źródłowego najnowszej wersji)

Text :: CSV_XS to dojrzały moduł perla do analizowania plików csv. Pliki * .t są napisane w Perlu 5, zawierają wiele przypadków testowych do autotestowania modułu, należy je wykonać podczas instalacji modułu.

knb
źródło