我刚刚重温了经典的C教科书K& R.并阅读练习1-11:
您如何测试字数统计程序?如果存在错误,哪种输入最有可能发现错误?
实际上,我只有一个基本的想法是手动计算现有段落以获得确切的单词编号,并将其与结果字计数程序计算进行比较。
有什么我错过的吗?测试的诀窍是什么?
修改
答案摘要:
单词的语义定义,一些特殊情况:
边界条件:
答案 0 :(得分:2)
嗯,这取决于你在语义上定义为单词的内容。 由于你谁正在编写单词计数程序,你应该知道单词是什么。
因此,为了测试这个程序,你必须考虑角落的情况:“链接词”算作一两个单词吗?你认为“我”是一两个吗?等。
至于K& R练习,我猜他们自愿忘记了一些这些角落的情况,他们建议你分析他们的代码,找到这些警告。
答案 1 :(得分:2)
以下是一些可以发现错误的文本示例:
答案 2 :(得分:1)
我没有重新阅读练习1-11这个答案......(我的书是60公里之外)
可能编码错误的事情
"a b c d"
有4个字"a fooooooooo<40MILLIONLETTERS>ooooooo a"
有3个字",.!? ...
可能尚未理解的定义
"cat-walk"
1个字? 2个字?"under-\nstood"
换行符(带连字符)在单词中间答案 3 :(得分:1)
要测试算法,您应该使用众所周知的结果创建一组测试用例。
此测试用例应涵盖:
"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的错误报告。