代码之家  ›  专栏  ›  技术社区  ›  amit

您是否在实际项目中使用过Quickcheck[已关闭]

  •  36
  • amit  · 技术社区  · 16 年前

    Quickcheck 以及它的变体(即使在 Java ),似乎很有趣。然而,除了学术兴趣之外,它在实际应用程序测试中真的有用吗(例如GUI应用程序或客户机/服务器,甚至是StackOverflow本身)?非常感谢您使用类似测试生成器的任何经验。

    11 回复  |  直到 10 年前
        1
  •  48
  •   John Leidegren    16 年前

    早在2004年,我们就被迫使用QuickCheck来测试Haskell程序,这是好与坏的结合。主要是因为Haskell本身有点让人畏缩,但当你让它工作的时候,它从未如此美妙。

    从那以后,约翰完善了他多年前写的东西,实际上帮助Ericsion测试了他们复杂的电信硬件,他在大约2000万行代码中发现了错误,通过他的方法,将其减少到了仅仅三个步骤。他是一个伟大的演说家,所以听他讲他做得这么好总是一种乐趣,但总的来说,他用QuickCheck做的事情对我来说是新的。所以我问他,他有什么兴趣把这个带到市场上。他对这个想法持开放态度,但当时他的业务(以快速检查为基础)相对较新,因此他会专注于其他领域。现在是2007年。我的观点是,你可以从快速检查中学习,即使你最终不会使用它。

    Pex 这有点类似。Pex通过检查IL自动生成测试。然而,John会为函数的可能输入和测试属性编写一个生成器。属性是很容易测试的东西,它更正式。e、 g.撤销清单?嗯,反转列表,与将列表分成两半是一样的,分别反转,然后以相反的顺序连接两个反转的部分。

    1,2,3,4 // original
    1,2 3,4 // split into A and B
    2,1 4,3 // reverse A and B
    4,3,2,1 // concat B and A
    

    Pex很好,但没有QuickCheck那么酷,Pex简化了事情,QuickCheck确实做到了这一点,但编写一个好的规范需要付出很多努力。

    QuickCheck的威力在于,当它遇到故障时,它会将导致测试失败的输入减少到尽可能小的程度。给你留下一个详细的描述是什么状态的发展导致了你的测试失败。与其他测试框架相比,这些框架只是试图以暴力的方式破坏代码。

    由于您编写测试规范的方式,这是可能的。QuickCheck依靠伪随机性来发明输入,正因为如此,它能够回溯并找到真正小的输入,而这些输入无法通过测试。

        2
  •  8
  •   Paul Johnson    16 年前

    我做了一个真正的Haskell问题,涉及离散事件模拟。因此,我基于延续monad编写了一个DES库,以及mvar和Channels的等价物。我需要检查它是否正常工作,因此我编写了一组QuickCheck属性来演示,例如,写入通道的两个并发数据流将正确合并,而不会删除任何内容。

    我还使用QuickCheck来记录和验证我的 Ranged Sets Decimal

    根据我的经验,快速检查有时很棒。如果你能以简洁的方式总结一个重要的属性,尽管传递该属性的算法很复杂,那么QuickCheck是一个巨大的胜利。另一方面,我经常发现算法与我想要验证的属性是等价的。在这种情况下,我寻找更简单的属性。例如,假设函数“foo”是非严格单调的。然后你就可以写了

    prop_fooMonotonic x y = (x > y) ==> (foo x >= foo y)
    
        3
  •  7
  •   Norman Ramsey    16 年前

    我用QuickCheck检查很多个人资料。在过去六个月内:

    • 运行QuickCheck测试图像压缩器中的颜色变换和离散余弦变换。

    快速检查很少遇到问题 全部的 我的单元测试需要,但这是一个很好的开始方式——快速检查法则是很好的文档。

        4
  •  5
  •   ADEpt    16 年前

    然而,从我个人的经验来看,这里有一点不那么琐碎: http://www.haskell.org/haskellwiki/QuickCheck_as_a_test_set_generator

        5
  •  5
  •   Apocalisp    16 年前

    ScalaCheck (Scala的快速检查)用于测试 Functional Java ,一个实现 a QuickCheck for Java .

        6
  •  3
  •   Masse    13 年前

    AFAIK XMonad通过QuickCheck进行了广泛的测试

        7
  •  2
  •   kilfour kilfour    15 年前

    我只在生产环境中使用Haskell来开发小助手工具。主要是因为我是我所知道的唯一一个读Haskell的开发者。不过,我广泛使用QuickCheck,并对C#中没有类似的东西感到非常恼火。所以我决定试着 write it myself . 我也看过Pex,但发现用于查找最小输入的程序探索技术不如QuickCheck那样有趣。

        8
  •  2
  •   nh2    12 年前

    我使用QuickCheck测试用任何语言编写的命令行程序的行为。

    查找低级或动态类型程序崩溃的输入尤其有用。

    http://hackage.haskell.org/package/proctest ,其中包括一些QuickCheck与hspec和HUnit一起使用以这种方式测试命令行程序的示例。

        9
  •  1
  •   Guy Coder    11 年前

    我们使用 FsCheck 检查我们的OCaml到F#的翻译是否正确,以及我们的优化版本与未优化版本的工作方式是否相同。我还计划使用它来测试lexer和解析器,因为 NHol 项目使用 parser 组合器。

    我们也有助手函数,允许我们在其中运行测试 NUnit (XUnit代表.Net)。看见 assertProp .

        10
  •  0
  •   user3509406    10 年前

    我使用QuickCheck在LG Linux移动平台上测试了SMS PDU编码器和解码器。我当时开发的一款软件的(旧)版本可以在 http://hackage.haskell.org/package/GenSmsPdu-0.1

        11
  •  0
  •   dfeuer    10 年前

    这不是我的项目,而是 containers 包相当广泛地使用QuickCheck。就我个人而言,我试着用它来比较我写的一个愚蠢的小素筛和一个普通的素筛 arithmoi ,这让我发现了 算术 有时会出现错误。