我对这个问题的上下文是在 Python 中。
假设检验库(即基于属性的检验): https ://hypothesis.readthedocs.io/en/latest/
我对这个问题的上下文是在 Python 中。
假设检验库(即基于属性的检验): https ://hypothesis.readthedocs.io/en/latest/
这些是非常不同的野兽,但两者都会提高您的测试的价值和质量。这两种工具都有助于并使“我的代码覆盖率是 N%”语句更有意义。
假设将帮助您在定义的范围内为被测函数生成各种测试输入。
通常,当您需要测试一个函数时,您会提供多个示例值,试图涵盖由代码覆盖率报告驱动的所有用例和边缘情况——这就是所谓的“基于示例的测试”。另一方面,假设实现了基于属性的测试,生成大量不同的输入和输入组合,有助于捕捉不同的常见错误,如除以零、None
0、非一错误等,并帮助发现隐藏的错误。
突变测试就是在针对修改后的代码版本执行测试时动态更改被测代码。
这确实有助于查看您的测试是否真的在测试他们应该测试的内容,以了解您的测试的价值。如果您已经拥有丰富的测试代码库和良好的代码覆盖率,那么变异测试会非常出色。
帮助我了解这些概念的是这些 Python 播客:
我是作者或 mutmut,(imo)python 的最佳突变测试器。@alecxe 有一个很好的答案,但我想扩展它。在我之前阅读他的回答以了解基本背景。
还有一些很大的其他差异,例如 PBT 需要脑力劳动来为每个被测函数指定规则,而 MT 需要您证明代码中的所有行为是合理的,这需要更少的认知努力。
MT 实际上是白盒和 PBT 黑盒。
另一个区别是 MT 是对(相当小的)有限空间的探索,而 PBT 是对无限空间的探索(实际上来说)。一个实际的结果是你可以很容易地知道你什么时候完成了 MT,而你可以让 PBT 运行多年,但你不知道它是否已经搜索了空间的相关部分。出于这个原因,更好的 PBT 规则从根本上缩短了运行时间。
突变测试还强制使用最少的代码。这是一个令人惊讶的效果,但这是我一次又一次经历的事情。这对 MT 来说是一个不错的小奖励。
你也可以使用 MT 作为一个简单的清单来获得 100% 的突变覆盖率,你不需要从 100% 的覆盖率开始,根本不需要。但是使用 PBT,您可以从低于 100% 的覆盖率开始,实质上是在开始之前为 0%。
我希望这能更清楚地说明情况。