2

一旦我可以悬赏,我将放弃 100 分,给第一个发明测试用例的海报,打破了我将命题逻辑语句规范化为析取范式的常规。我将省略代码,因为它很长,无论如何您都可以将例程视为黑匣子。

形式是析取范式,当它是文字(p, NOT p)的析取时:实际上,这与 CNF 是对偶的。例子:

(NOT p AND q AND r) OR s OR (NOT t)
p OR q
p OR q OR r OR s OR t
p AND q
p AND q AND r
p
NOT p

尽管

p AND (q OR r)
p OR (q AND (r OR s))
NOT (p AND q)

不在DNF中。

至于我自己提出的测试用例,我可以将它们分为

  • 使用 DNF 中已有的简单公式进行冒烟测试,例如:p, NOT p, (p AND q) or r;
  • 的情况下.. AND (..OR..),与和或“交换”;例如,p AND (q OR r)的 dnf 可以是(p AND q) OR (p AND r);
  • 在树中的路径上有两次相同的运算符,即。.. OR ( .. AND ( .. OR .. ));
  • 特别是,中间没有其他运算符.. OR ( .. OR .. )
  • 在公式的不同位置有多个否定,... NOT NOT p, NOT NOT (.. AND ..);
  • 看起来更像一棵树的公式,(.. OR ..) AND (.. AND ..)而不仅仅是一个列表p AND (q AND (r AND ...))
  • 其中运算符有两个以上的操作数(...) AND (p OR q OR r OR s)

完成这些测试后,我对代码进行了一些简单的更改。显然我破坏了代码,因为套件失败了。虽然这意味着我的测试对我有帮助,但让我担心的是只有我的一项测试发现了问题。这只是一个测试用例,如果我没有,我会错过一个错误。那么有多少错误我什至没有一次测试呢?

那么,什么是一些好的测试用例呢?

4

1 回答 1

1

考虑使用模糊测试

1)生成随机语句“((A AND B)OR B)”并将它们通过您的DNF规范化器。2)遍历输入的所有可能值(AB = 00、01、11、10),在评估原始表达式和简化答案时测试答案。3) 如果发现任何不良结果,请大声抱怨。

唯一棘手的一点是生成随机语句。我会用递归来做。一个简单的第一遍看起来像这样:

gen_one: return one of "A", "B", "NOT A", "NOT B"
gen_op: return one of "AND", "OR", "NOR", "NAND"
genstatement:
  if rand < 10%
    return gen_one()
  else
    return "(" + genstatement() + gen_op + genstatement() + ")"
于 2013-05-03T14:52:19.987 回答