Agitar 和 Quickcheck 基于属性的测试有啥区别?
Posted
技术标签:
【中文标题】Agitar 和 Quickcheck 基于属性的测试有啥区别?【英文标题】:What is the difference between Agitar and Quickcheck property based testing?Agitar 和 Quickcheck 基于属性的测试有什么区别? 【发布时间】:2014-05-07 22:08:29 【问题描述】:几年前,一种名为Agitar 的Java 测试工具很流行。它似乎做了一些基于属性的测试。
现在 - 基于Haskell's Quickcheck 的基于属性的测试很流行。 Java 有许多端口,包括:
quickcheck jcheck junit-quickcheck我的问题是:基于 Agitar 和 Quickcheck 属性的测试有什么区别?
【问题讨论】:
agitar 是否使用随机测试?那里的属性是如何制定的?请告诉我们更多信息 显然 quickcheck for Java 不支持收缩。此外,AFAICT,它也不会“扩展”,我的意思是它不是从测试最简单的案例开始,然后逐渐使测试变得更加复杂。我不知道其他是否支持收缩和扩展,但这可能是一个需要检查的重要功能。 从描述上看,Agitar 是根据代码生成单元测试的; Quickcheck 不生成测试,它使用随机生成的输入测试属性。 谢谢@mhwombat,请将其扩展为答案,我会将其标记为正确。 谢谢@Cubic - 请将其扩展为答案,我会将其标记为正确。 【参考方案1】:对我来说,Haskell QuickCheck 的主要特点是:
生成随机数据进行测试
如果测试失败,它会反复“缩小”数据(例如,将数字更改为零, 减少列表的大小),直到找到仍然失败的最简单的测试用例。这非常有用,因为当您看到最简单的测试用例时,您通常会确切地知道错误在哪里以及如何修复它。
它从简单的数据开始测试,然后逐渐转向更复杂的数据。这很有用,因为这意味着测试失败得更快。此外,它还确保正确测试边缘情况(例如,空列表、零)。
Quickcheck for Java 支持 (1),但不支持 (2) 或 (3)。我不知道 Agitar 支持哪些功能,但检查一下会很有用。
此外,您还可以查看 ScalaCheck。由于 Scala 可与 Java 互操作,因此您可以使用它来测试您的 Java 代码。我没用过,所以不知道它有哪些功能,但我怀疑它的功能比Java Quickcheck更多。
【讨论】:
【参考方案2】:值得注意的是,从0.6
版本开始,junit-quickcheck
现在支持shrinking
:
http://pholser.github.io/junit-quickcheck/site/0.6-alpha-3-SNAPSHOT/usage/shrinking.html
quickcheck
自 2011 以来似乎没有任何新版本:
https://bitbucket.org/blob79/quickcheck
【讨论】:
以上是关于Agitar 和 Quickcheck 基于属性的测试有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
java 基于属性的测试Java与Quickcheck,为SoCraTes Soltau 2016的PBT会议制作的代码