CSV解析器的单元测试


14

我应该使用哪些测试对csv解析器进行单元测试?

我在C#中有一个简单的csv解析器,并且我想确保我对所有常见(和不常见)边缘情况都具有良好的单元测试覆盖率。我应该使用哪些测试来识别潜在问题和边界案例?


5
您是否检查了generateata.com以创建各种测试文件?
亚伦·麦克弗

@Aaron-好的测试是可重复的,因此不要使用变化的数据。但是我也许可以将它们用于一次性产品,然后将其保存用于测试套件。但是即使那样,我仍要确保已涵盖所有不同的边缘情况,但不能保证随机发生。
Joel Coehoorn

Coehorn良好的测试结果是可重复的。我认为只要希望的结果保持不变,就可以使用变化的数据。如果要确保已涵盖所有不同的极端情况(根据您的评论,您会确定这些是什么),为什么不开始编写测试?您将花费更多时间寻找神奇的解决方案,然后仅编写测试。
亚伦·麦克弗

作者正在寻找测试用例,而不是测试数据。我希望我也知道在哪里可以找到针对各种事物的公开测试。
ProdigySim 2011年

Answers:



16

这是一些您应该深思熟虑并具有测试用例的边界情况。

  1. 基本领域。 ,foo,
  2. 基本引用字段。 ,"foo",
  3. 带嵌入式换行符的引用字段。 ,"foo\nbar"
  4. 带嵌入式逗号的引用字段。 ,"foo,bar"
  5. 带嵌入式报价的报价字段。 ,"foo""bar"
  6. 您是否区分空字符串和空值?如果这样做,,,则应为null并,"",提供一个空字符串。
  7. 您是否尝试检测数据类型并做正确的事?CSV通常用于数字数据。添加您认为适合的任何测试。
  8. 如果写入数据,则应涵盖上述所有情况。
  9. 您如何处理具有不同字段数的行?(测试一下。)
  10. 您如何处理空白行?(测试一下。)
  11. 大文件的性能如何?(对其进行测试。我已经看到太多本土化的CSV解析器,这些解析器无法高效地使用字符串,因此需要花费二次时间,从而导致简单的东西变得非常缓慢。)

10

CSV文件没有正式的规范。但是,请看一下RFC 4180-CSV文件的通用格式和MIME类型(尤其是第2部分),该文档记录了大多数实现似乎遵循的格式。

从第2节中的列表开始生成一些测试用例似乎相当简单,特别是:

  1. 每个记录位于单独的行上,并由换行符(CRLF)分隔。例如:

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

  2. 文件中的最后一条记录可能有也可能没有换行符。例如:

    aaa,bbb,ccc CRLF zzz,yyy,xxx

  3. 可能有一个可选的标题行出现在文件的第一行,其格式与普通记录行相同。该标头将包含与文件中的字段相对应的名称,并且应包含与文件其余部分中的记录相同的字段数(应通过此标头的可选“ header”参数指示标头行的存在或不存在) MIME类型)。例如:

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

  4. 在标题和每条记录中,可能会有一个或多个字段,以逗号分隔。每行应在整个文件中包含相同数量的字段。空格被视为字段的一部分,不应忽略。记录中的最后一个字段不得在逗号后跟。例如:

    aaa,bbb,ccc

  5. 每个字段可能会或可能不会用双引号引起来(但是,某些程序(例如Microsoft Excel)根本不使用双引号)。如果字段没有用双引号引起来,则双引号可能不会出现在字段内。例如:

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

  6. 包含换行符(CRLF),双引号和逗号的字段应用双引号引起来。例如:

    “ aaa”,“ b CRLF bb”,“ ccc” CRLF zzz,yyy,xxx

  7. 如果使用双引号将字段括起来,则必须在字段内部出现双引号,方法是在其前面加上另一个双引号来对其进行转义。例如:

    “ aaa”,“ b”,“ bb”,“ ccc”



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编写的,它们包含许多用于模块自检的测试用例,它们将在模块安装时执行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.