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

quickcheck2011 以来似乎没有任何新版本:

https://bitbucket.org/blob79/quickcheck

【讨论】:

以上是关于Agitar 和 Quickcheck 基于属性的测试有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

java 基于属性的测试Java与Quickcheck,为SoCraTes Soltau 2016的PBT会议制作的代码

如何使用 QuickCheck 测试数据库相关功能?

用 Python 为接口测试自动生成用例

Swift函数式编程五(QuickCheck)

Swift函数式编程五(QuickCheck)

QuickCheck:生成平衡样本的嵌套数据结构的任意实例