我可以放弃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中。
至于我自己提出的测试用例,我可以把它们分成
p
,NOT 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 p
,NOT NOT (.. AND ..)
; (.. OR ..) AND (.. AND ..)
而不仅仅是列表p AND (q AND (r AND ...))
; (...) AND (p OR q OR r OR s)
。进行这些测试后,我对代码进行了一些简单的更改。显然我打破了代码,因为套件失败了。虽然这意味着我的测试对我有帮助,但令我担心的是,我的测试中只有一个能够解决问题。这只是一个测试案例,如果我没有,我会错过一个bug。有多少错误我甚至没有一个测试,那么呢?
那么,一些好的测试用例会是什么?
答案 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() + ")"