基于属性的测试和变异测试有什么区别?

时间:2016-08-01 16:45:35

标签: python testing mutation-testing hypothesis-test property-based-testing

我在这个问题的上下文是在Python中。

假设检验库(即基于财产的检验): https://hypothesis.readthedocs.io/en/latest/

突变检测库: https://github.com/sixty-north/cosmic-ray

2 个答案:

答案 0 :(得分:8)

这些是非常不同的野兽,但两者都会提高测试的价值和质量。这两个工具都有助于使“我的代码覆盖率为N%”语句更有意义。

Hypothesis可帮助您在已测试的函数的已定义范围内生成各种测试输入。

通常,当您需要测试函数时,您提供了多个示例值,试图涵盖由代码覆盖率报告驱动的所有用例和边缘情况 - 这就是所谓的“基于示例的测试”。另一方面,假设实现了基于属性的测试,生成了大量不同的输入和输入组合,有助于捕获不同的常见错误,例如除以零,standalone.xml,0,逐个错误等,并帮助找到隐藏的错误。

Mutation testing就是在针对修改后的代码版本执行测试时,即时更改您的测试代码。

这确实有助于查看您的测试是否实际测试了他们应该测试的内容,以了解测试的价值。如果您已经拥有丰富的测试代码库和良好的代码覆盖率,那么变异测试将会真正发挥作用。

这些Python播客是什么帮助我了解这些概念:

答案 1 :(得分:1)

我是mutmut的作者,或者是mutmut,它是python的(imo)最佳突变测试器。 @alecxe有一个很好的答案,但我想扩展一下。在了解我的基本背景之前,请先阅读他的答案。

还有一些其他很大的差异,例如PBT需要脑力劳动来为每个测试功能指定规则,而MT则需要您证明代码中的所有行为都是合理的,而这需要更少的认知工作。

MT实际上是白盒和PBT黑盒。

另一个差异是MT是对(相当小的)有限空间的探索,而PBT是对无限空间的探索(实际上是)。一个实际的结果是,您可以轻易地知道何时使用MT完成了 ,而PBT运行了数年之久,而且您不知道它是否搜索了空间的相关部分。因此,更好的PBT规则从根本上减少了运行时间。

突变测试还可以强制执行最少的代码。这是一个令人惊讶的效果,但这是我一次又一次的经历。对于MT来说,这是一个不错的小奖励。

您还可以将MT用作简单的清单,以达到100%的突变覆盖率,而无需从100%的覆盖率开始,根本不需要。但是使用PBT,您可以在覆盖率低于100%的情况下开始,实质上是在开始覆盖之前为0%。

我希望这可以进一步澄清这种情况。