модульные тесты для парсера csv

14

Какие тесты я должен использовать для модульного тестирования парсера CSV?

У меня есть простой синтаксический анализатор csv в C #, и я хочу быть уверенным, что у меня есть хороший охват модульных тестов для всех распространенных (и необычных) краевых случаев. Какие тесты я должен использовать для выявления потенциальных проблем и граничных случаев?

Джоэл Коухорн
источник
5
Вы проверили generatedata.com для создания варьирования тестовых файлов?
Аарон Макивер
@ Аарон - хорошие тесты повторяемы и поэтому не используют данные, которые меняются. Но я мог бы использовать их для одноразового поколения, которое затем сохраню для набора тестов. Но даже тогда я хочу убедиться, что я охватил все различные крайние случаи, что случайным не гарантируется.
Джоэл Коухорн
Coehorn Хорошие результаты теста можно повторить. Я бы сказал, что использование данных, которые варьируются, прекрасно, если желаемый результат остается постоянным. Если вы хотите убедиться, что вы охватили все различные крайние случаи (основываясь на ваших комментариях, вы, кажется, уверены, что это такое), почему бы не начать писать тесты? Вы будете тратить больше времени на поиски волшебного решения, чем просто написание тестов.
Аарон Макивер
Автор ищет тестовые случаи, а не тестовые данные. Хотелось бы знать, где можно найти публичные тесты для разных вещей.
ProdigySim

Ответы:

6

Я только что нашел https://github.com/maxogden/csv-spectrum :

Куча разных CSV-файлов, которые служат кислотным тестом для библиотек разбора CSV. Существуют также версии CSV в формате JSON для проверки.

Цель этого репозитория - собрать контрольные примеры для представления всего спектра CSV.

Андреас Гур
источник
Интересно, что собственный синтаксический анализатор GitHub не проходит тесты при попытке показать тестовые CSV ( github.com/maxogden/csv-spectrum/blob/master/csvs/… )
Ян Бойд
16

Вот несколько граничных случаев, которые вы должны были продумать и подготовить для них.

  1. Основное поле. ,foo,
  2. Основное цитируемое поле. ,"foo",
  3. Кавычка со встроенной новой строкой. ,"foo\nbar"
  4. Поле в кавычках со встроенной запятой. ,"foo,bar"
  5. Цитируемое поле со встроенной цитатой. ,"foo""bar"
  6. Вы различаете пустые строки и нули? Если вы это сделаете, то ,,должно быть нулевым и ,"",должно давать пустую строку.
  7. Вы пытаетесь определить типы данных и поступаете правильно? CSV часто используется для числовых данных. Добавьте любые тесты, которые вы считаете подходящими для этого.
  8. Если вы пишете данные, вы должны охватить все вышеперечисленные случаи.
  9. Что вы делаете со строками с разным количеством полей? (Проверь это.)
  10. Что вы делаете с конечными пустыми строками? (Проверь это.)
  11. Как производительность на большом файле? (Проверьте это. Я видел слишком много доморощенных парсеров CSV, которые неэффективно используют строки и в результате занимают квадратичное время, в результате чего простые вещи становятся мучительно медленными.)
btilly
источник
10

Не существует формальной спецификации для файлов CSV. Однако взгляните на RFC 4180 - Common Format и MIME-типы для CSV-файлов (в частности, раздел 2), в котором документирован формат, которому следует большинство реализаций.

Кажется довольно простым начать создавать тестовые примеры из списка в разделе 2, а именно:

  1. Каждая запись расположена на отдельной строке, разделенной разрывом строки (CRLF). Например:

    ааа, bbb, ccc CRLF zzz, гггг, xxx CRLF

  2. Последняя запись в файле может иметь или не иметь разрыв конца строки. Например:

    ааа, bbb, ccc CRLF zzz, гггг, ххх

  3. Там может быть необязательная строка заголовка, появляющаяся как первая строка файла в том же формате, что и обычные строки записи. Этот заголовок будет содержать имена, соответствующие полям в файле, и должен содержать то же количество полей, что и записи в остальной части файла (наличие или отсутствие строки заголовка должно указываться с помощью необязательного параметра header MIME тип) Например:

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

  4. В заголовке и каждой записи может быть одно или несколько полей, разделенных запятыми. Каждая строка должна содержать одинаковое количество полей в файле. Пробелы считаются частью поля и не должны игнорироваться. Последнее поле в записи не должно сопровождаться запятой. Например:

    ааа, ГЭБ, ссс

  5. Каждое поле может быть или не быть заключено в двойные кавычки (однако некоторые программы, такие как Microsoft Excel, вообще не используют двойные кавычки). Если поля не заключены в двойные кавычки, то двойные кавычки могут не появляться внутри полей. Например:

    "ааа", "bbb", "ccc" CRLF zzz, гггг, ххх

  6. Поля, содержащие разрывы строк (CRLF), двойные кавычки и запятые, должны быть заключены в двойные кавычки. Например:

    "ааа", "b CRLF bb", "ccc" CRLF zzz, гггг, ххх

  7. Если двойные кавычки используются для включения полей, то двойная кавычка, появляющаяся внутри поля, должна быть экранирована, предшествуя другой двойной кавычке. Например:

    «Ааа», «б», «бб», «ссс»

Paddyslacker
источник
8

Данные переписи населения США доступны в формате CSV

Я работал над этим некоторое время. Это, конечно, достаточно странно, чтобы быть хорошим тестом, и есть тонны и тонны этого.

Satanicpuppy
источник
Вы не могли бы объяснить больше о том, что он делает, и почему вы рекомендуете ответить на заданный вопрос? «Ответы только на ссылки» не очень приветствуются на Stack Exchange
комнат
4

Проверьте этот каталог и посмотрите код в файлах * .t .:

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

(Номер версии -1.32 может со временем измениться, поэтому ссылка может стать «мертвой». Увеличьте номер версии самостоятельно методом проб и ошибок, либо перейдите в родительский каталог или нажмите здесь

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

и нажмите через «Обзор» к исходному коду последней версии)

Text :: CSV_XS - это зрелый Perl-модуль для анализа CSV-файлов. Файлы * .t написаны на Perl 5, они содержат множество тестовых примеров для самотестирования модуля, они должны быть выполнены во время установки модуля.

KNB
источник