你在实际项目中使用过Quickcheck吗[关闭]
-
05-09-2019 - |
解决方案
是,很好。其实也没什么,但我谁最初开发快速检查的人门下,他是一个非常有趣的家伙。
早在2004年,我们被迫使用快速检查来测试我们的Haskell程序,这是好的和坏的组合。大多是不好的,因为哈斯克尔是一个有点令人生畏本身,但从来没有少妙,当你得到它的工作。
约翰从那时起完善的是他写的。几年前,其实是帮Ericssion测试其复杂的电信硬件,他发现在20个百万错误或代码行左右减少到通过他的方法只有三个步骤。他是一个伟大的演说所以它总是一个欢乐听他介绍他做什么这么好,但所有的一切,他的所作所为与快速检查是新的我。于是我问他,他有什么感兴趣的是把这个市场。他是开放的想法,但当时他的业务(根据各地快速检查)是相对较新,所以有他将专注于其他领域。这是现在2007年我的意思是,你可以从快速检查学习,即使你不会最终使用它。
但什么是快速检查?这是一个组合测试框架和测试方案的一个有趣的方式。在微软研究院的人在已建成 Pex公司这是有点类似。 PEX通过检查你的IL自动生成测试。然而,约翰会写一个函数的可能的输入和测试性能发电机。属性是一些东西,可以很容易地进行测试,这是一个很多更正式。例如倒车列表?那么,倒车列表,是同样的事情在分裂成两半的列表,它们反转各自单独然后连接两个倒半部以相反的顺序。
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公司是好的,但并不像酷快速检查,PEX简化的东西,快速检查确实给但它需要花费大量的精力编写了一个很好的规范。
快速检查的功率是,当它运行到故障它会降低造成测试失败,到最小的可能的形式输入。留给你的什么状态的恶化导致测试失败的详细描述。相较于其它测试框架,这将只是试图打破你的代码在蛮力方式。
这是由于你如何编写测试规范成为可能。快速检查依赖于伪随机性发明的输入,它是因为这一点,它能够回溯,找到真正的小投入,其不通过测试的。
这是一个很大更多的工作来写快速检查属性,但最终的结果是更好的测试。正如约翰自己说,臭虫的70%是由单元测试抓住了,但它是另外30%这会导致你的程序崩溃。快速检查被测试这些最后30%。
其他提示
我做这涉及一个离散事件仿真一个真正的Haskell的问题。所以我写了一个DES库基础上,延续单子,用等同MVars与渠道一起。我需要检查这个工作正常,所以我写了一堆快速检查性质的证明,例如,写入通道将是正确的并发数据的两个流合并不失任何东西。
在我的经验,快速检查有时是巨大的。如果你可以总结出以简洁的方式一个重要的特性,但它所提供的属性是毛茸茸的算法,然后快速检查是一个巨大的胜利。在另一方面,我经常发现,该算法相当于我想验证的财产。在这种情况下,我找简单的特性。例如,假设“foo”函数应该是不严格单调。然后可以写
prop_fooMonotonic x y = (x > y) ==> (foo x >= foo y)
我使用 QuickCheck 处理很多个人事务。过去六个月内:
运行 QuickCheck 来测试图像压缩器中的颜色变换和离散余弦变换。
运行 QuickCheck 来测试我为一些数值优化而创建的符号微分模块。
运行 QuickCheck 来测试 Bentley 和 Sedgewick 风格的三元搜索树。
QuickCheck很少见面 全部 我的单元测试需求,但这是一个很好的开始方式——并且 QuickCheck 法则可以提供很好的文档。
我已经使用了相当多,主要是在简单明了的方式,主要是为了测试协议和解析器实现。
然而,这是从我个人的经验较少的琐碎位: http://www.haskell.org/ haskellwiki / QuickCheck_as_a_test_set_generator
AFAIK XMonad与快速检查广泛测试
我只用哈斯克尔在生产环境中的小帮手工具的开发。主要是因为我是唯一的开发者,我知道读哈斯克尔。我用快速检查,虽然广泛,并得到了真正恼火,类似的东西是不是在C#中可用。所以我决定尝试写我自己一>。我看着太Pex公司,却发现被用来寻找最小的投入比快速检查做的方式不感兴趣的节目勘探技术。
我用快速检查测试的用任何语言编写的命令行的程序的行为。
这是特别有用的发现的输入上的低电平或动态类型的程序崩溃。
为了方便起见,我写 http://hackage.haskell.org/package/proctest ,其中包括快速检查的一些例子是与hspec和HUnit一起用于测试命令行程序这种方式。
我们使用 FsCheck 来检查我们的OCaml的对F#的翻译是正确的,我们的优化版本的工作相同未优化的版本。我还打算用它来测试,因为 NHol的词法和语法分析器项目使用的解析器组合子。
我们也有辅助功能,使我们能够运行(为的xUnit .NET)内 NUnit的测试。请参阅 assertProp 。
我已经使用快速检查用于测试SMS PDU编码器和解码器在LG Linux的移动平台。一块我当时开发的软件的(旧)版本可供下载 HTTP:/ /hackage.haskell.org/package/GenSmsPdu-0.1
这不是我的项目,但containers
包使用快速检查相当广泛。就个人而言,我试着用它来比较愚蠢的小黄金筛我arithmoi
写了一个,害得我发现一个在arithmoi
有时段错误。