如果有任何未发现的错误,如何测试字数统计程序?

时间:2011-04-19 13:50:32

标签: c testing word-count

我刚刚重温了经典的C教科书K& R.并阅读练习1-11:

您如何测试字数统计程序?如果存在错误,哪种输入最有可能发现错误?

实际上,我只有一个基本的想法是手动计算现有段落以获得确切的单词编号,并将其与结果字计数程序计算进行比较。

有什么我错过的吗?测试的诀窍是什么?

修改

答案摘要:

单词的语义定义,一些特殊情况:

  • 链接词:“cat-walk”
  • 小词:a,b,c
  • biiiiiig words:“a fooooooooo< 40MILLIONLETTERS> ooooooo a”有3个字

边界条件:

  • 文字之间有多个空格。
  • 大于2GB的文字
  • 包含破折号但没有空格的单词。
  • 非ascii字样。
  • 采用不同编码的文件(如果您的程序支持)
  • 被空格包围但不包含任何单词字符的字符(例如“hello - world”)
  • 没有任何文字的文字
  • 在一行中包含所有单词的文本

5 个答案:

答案 0 :(得分:2)

嗯,这取决于在语义上定义为单词的内容。 由于谁正在编写单词计数程序,你应该知道单词是什么。

因此,为了测试这个程序,你必须考虑角落的情况:“链接词”算作一两个单词吗?你认为“”是一两个吗?等。

至于K& R练习,我猜他们自愿忘记了一些这些角落的情况,他们建议你分析他们的代码,找到这些警告。

答案 1 :(得分:2)

以下是一些可以发现错误的文本示例:

  • 文字之间有多个空格。
  • 大于2GB的文字
  • 包含破折号但没有空格的单词。
  • 非ascii字样。
  • 采用不同编码的文件(如果您的程序支持)
  • 被空格包围但不包含任何单词字符的字符(例如“hello - world”)
  • 没有任何文字的文字
  • 在一行中包含所有单词的文本

答案 2 :(得分:1)

我没有重新阅读练习1-11这个答案......(我的书是60公里之外)

可能编码错误的事情

  • 小词:"a b c d"有4个字
  • biiiiiig words:"a fooooooooo<40MILLIONLETTERS>ooooooo a"有3个字
  • 使用多个符号:",.!? ...

可能尚未理解的定义

  • "cat-walk" 1个字? 2个字?
  • "under-\nstood"换行符(带连字符)在单词中间

答案 3 :(得分:1)

要测试算法,您应该使用众所周知的结果创建一组测试用例。

此测试用例应涵盖:

  • 输入的大多数可能组合;
  • “边境”案件。在你的情况下,它可能是:一个单词,2个单词,有很多分隔符,短文本开始,以分隔符结束,等等;
  • 一些奇怪的文字。只要看看算法,就会想到可以打破它的奇怪输入。通常它是一个非常小的文本(3-4)单词,但它们之间有一些奇怪的分隔符,如"hello,word", "hello ,word", "hello word,,,,"

答案 4 :(得分:0)

其他人已经提出了一些很好的实用建议。让我添加两件事:

首先,K&amp; R不希望您发现其代码的所有缺陷。练习的目的是让你意识到这样一个事实,即经常存在虚假输入,并且你可能有一天会在类似的情况下以某种方式以某种方式处理它。你怎么做完全取决于你。请记住,一些看似简单的问题有时需要进行艰苦的思考。

以防万一:当我的愚蠢的iPhone收到一条消息“foo is bad.it闻起来。”时,它会将“bad.it”识别为URL。看起来很有趣,但到目前为止,您无法修改此错误而无需更改消息内容本身。


第二,你的头衔是误导性的。你无法通过测试找到程序中的所有错误。或者像Edsger Dijkstra曾经说过的那样:

  

测试显示存在,而不是缺席的错误。

这是理论计算机科学的基本结果,实际上可以证明。如果您有兴趣,请参阅Rice's theorem



编辑:在写这篇文章时,我发现了一个与我们的主题有某种关系的错误:StackOverflow解析器不会将“http://en.wikipedia.org/wiki/Rice's_theorem”识别为URL。 : - )

EDIT2:提交了关于元here的错误报告。