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