代码之家  ›  专栏  ›  技术社区  ›  Adrian Panasiuk

DNF规范化的测试用例:用你的测试用例破坏我的代码[关闭]

  •  2
  • Adrian Panasiuk  · 技术社区  · 13 年前

    一旦我能得到奖励,我会给第一个发明测试用例的海报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 , 非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。那么,有多少bug我甚至没有一个测试?

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

    1 回复  |  直到 13 年前
        1
  •  1
  •   BraveNewCurrency    13 年前

    考虑使用 Fuzz testing .

    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() + ")"