Testing DNF规范化测试用例:用测试用例打断我的代码

Testing DNF规范化测试用例:用测试用例打断我的代码,testing,boolean-logic,Testing,Boolean Logic,一旦我能拿到赏金,我就放弃100分,因为第一张海报发明了一个测试用例,打破了我将命题逻辑语句规范化为析取范式的常规。我将省略代码,因为它相当长,并且您可以将例程视为一个黑盒 一个形式是析取范式,当它是文字连接的析取(p,不是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 当 不在DNF中 至于我自己设计的测试用例,

一旦我能拿到赏金,我就放弃100分,因为第一张海报发明了一个测试用例,打破了我将命题逻辑语句规范化为析取范式的常规。我将省略代码,因为它相当长,并且您可以将例程视为一个黑盒

一个形式是析取范式,当它是文字连接的析取(
p
不是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

不在DNF中

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

  • 使用DNF中已有的简单公式进行烟雾测试,例如:
    p
    非p
    (p和q)或r
  • 。。和(…或…)
    ,带有和或“交换”;例如,
    p和(q或r)
    的dnf可以是
    (p和q)或(p和r)
  • 在树中的路径上有两次相同的操作符,即
    。。或(…和(…或…)
  • 特别是,在
    之间没有其他运算符。。或(…或…)
  • 在公式中的不同位置有多个否定,
    。。。不是p,不是(…和…)
  • 更像树、
    (…或…)和(…和…)
    的公式,而不仅仅是一个列表
    p和(q和(r和…)
  • 其中运算符有两个以上的操作数
    (…)和(p或q或r或s)
通过这些测试,我对代码做了一些简单的更改。显然是我破坏了密码,因为套件失败了。虽然这意味着我的测试帮助了我,但让我担心的是,只有一个测试发现了这个问题。这只是一个测试用例,如果我没有,我会错过一个bug。那么,有多少bug我连一个测试都没有呢

那么,有什么好的测试用例呢?

考虑使用一个

1) 生成随机语句“((A和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() + ")"
gen_one:返回“A”、“B”、“NOT A”、“NOT B”中的一个
gen_op:返回“AND”、“OR”、“NOR”、“NAND”之一
一般陈述:
如果兰特<10%
返回gen_one()
其他的
返回“(“+genstatement()+gen_op+genstatement()+”)

这是个好主意!我来试一试,不太离题。如果没有附带的测试,代码很少会被编写出来。
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() + ")"