【问题标题】:What is the difference between Property Based Testing and Mutation testing?基于属性的测试和突变测试有什么区别?
【发布时间】:2016-12-06 20:09:57
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

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


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

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

Mutation testing 是关于在针对修改后的代码版本执行测试时动态更改被测代码。

这确实有助于了解您的测试是否真的在测试他们应该测试的内容,以了解您的测试的价值。如果您已经拥有丰富的测试代码库和良好的代码覆盖率,那么变异测试会非常出色。


帮助我掌握这些概念的是这些 Python 播客:

【讨论】:

  • 好答案。基于属性的测试改变输入,变异测试改变代码。 “如果您已经拥有丰富的测试代码库和良好的代码覆盖率,那么突变测试会非常出色。” ...您可能会使用基于属性的测试来获得!
【解决方案2】:

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

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

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

另一个区别是,MT 是对(相当小的)有限空间的探索,而 PBT 是对无限空间的探索(实际上来说)。一个实际的结果是,您可以微不足道地知道您何时完成 MT,而您可以进行多年的 PBT 运行,但您无法知道它是否搜索了空间的相关部分。出于这个原因,更好的 PBT 规则从根本上缩短了运行时间。

变异测试还强制使用最少的代码。这是一个令人惊讶的效果,但这是我一次又一次经历的事情。这对 MT 来说是一个不错的小奖励。

您还可以使用 MT 作为一个简单的清单来获得 100% 的突变覆盖率,您不需要从 100% 的覆盖率开始,根本不需要。但是使用 PBT,您可以从低于 100% 的覆盖率开始,本质上是在开始之前为 0%。

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

【讨论】:

    猜你喜欢
    • 2014-05-07
    • 2012-03-29
    • 1970-01-01
    • 2015-04-20
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多