DNF规范化的测试用例:用你的测试用例打破我的代码

时间:2013-04-25 19:37:16

标签: testing boolean-logic

我可以放弃100分,一旦我可以获得赏金,就会发明第一张海报,它发明了一个测试用例,打破了将命题逻辑语句归一化为析取范式的例程。我会省略代码,因为它很长,你可以把例程视为一个黑盒子。

表单处于析取正常形式,当它是文字结合(pNOT 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中的简单公式进行烟雾测试,例如:pNOT p(p AND q) or r;
  • .. AND (..OR..)的情况,AND和OR“交换”;例如,p AND (q OR r)的dnf可以是(p AND q) OR (p AND r);
  • 在树中的路径上具有相同的运算符两次,即。 .. OR ( .. AND ( .. OR .. ));
  • 特别是
  • .. OR ( .. OR .. );
  • 之间没有其他运算符
  • 在公式... NOT NOT pNOT NOT (.. AND ..);
  • 中的不同位置有多个否定
  • 看起来更像树的公式,(.. OR ..) AND (.. AND ..)而不仅仅是列表p AND (q AND (r AND ...));
  • 其中运算符具有两个以上的操作数(...) AND (p OR q OR r OR s)

进行这些测试后,我对代码进行了一些简单的更改。显然我打破了代码,因为套件失败了。虽然这意味着我的测试对我有帮助,但令我担心的是,我的测试中只有一个能够解决问题。这只是一个测试案例,如果我没有,我会错过一个bug。有多少错误我甚至没有一个测试,那么呢?

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

1 个答案:

答案 0 :(得分:1)

考虑使用Fuzz testing

1)生成随机语句“((A AND B)或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() + ")"