Unit testing 突变测试在实践中有用吗?

Unit testing 突变测试在实践中有用吗?,unit-testing,testing,code-coverage,mutation-testing,Unit Testing,Testing,Code Coverage,Mutation Testing,你有突变测试在现实生活中应用的例子吗?它是否比简单的测试覆盖率工具工作得更好?还是没用 在现实世界中,突变测试的优点/缺点是什么?不久前,我将突变测试作为检查自动回归测试脚本有效性的一种方法。基本上,这些脚本中有许多缺少检查点,因此,当它们正确运行被测试的应用程序时,它们没有根据基线数据验证结果。我发现,比更改代码简单得多的方法是编写另一个应用程序,对基线的副本进行修改,然后根据修改后的基线重新运行测试。在这个场景中,任何通过的测试要么是错误的,要么是不完整的 这不是真正的突变测试,而是一种使用

你有突变测试在现实生活中应用的例子吗?它是否比简单的测试覆盖率工具工作得更好?还是没用


在现实世界中,突变测试的优点/缺点是什么?

不久前,我将突变测试作为检查自动回归测试脚本有效性的一种方法。基本上,这些脚本中有许多缺少检查点,因此,当它们正确运行被测试的应用程序时,它们没有根据基线数据验证结果。我发现,比更改代码简单得多的方法是编写另一个应用程序,对基线的副本进行修改,然后根据修改后的基线重新运行测试。在这个场景中,任何通过的测试要么是错误的,要么是不完整的


这不是真正的突变测试,而是一种使用类似范例来测试测试脚本有效性的方法。它的实现非常简单,IMO做得很好。

我最近做了一些关于突变测试的调查。结果如下:


简而言之:变异测试可以提供一些关于源代码和测试质量的信息,但它并不是很好用的

不再讨论单元测试的有用性。它们在质量应用程序的概念中是必不可少的。但是,我们如何评估它们的相关性呢? 高达100%的代码覆盖率指标并不意味着代码是100%测试的。这只是单元测试执行期间已执行代码的视图。 突变测试将让你对测试更有信心

这是一个分为两步的过程:

  • 产生突变体
  • 检查测试是否发现了突变

  • 我写了一篇关于这个过程的完整文章,包括一些具体案例。

    我已经为一个小而精心设计的应用程序使用了pitest:

    它是一个java工具,可以自动生成变种。您可以对您的测试套件运行它,它将为您生成HTML报告,指示有多少突变体被杀死。似乎相当有效,不需要太多的努力来建立。事实上,Java世界中有很多很好的工具用于这类事情。另见:

    为了保险


    我认为变异测试背后的概念是正确的。这只是一个工具支持和意识的问题。在传统代码覆盖率指标的简单性和这种技术的额外复杂性之间,您正在进行折衷——它实际上只是归结为工具。如果您能够生成突变体,那么它将有助于暴露测试用例中的弱点。与您已经进行的测试相比,您是否值得付出更多的努力?在pitest中,我确实发现它出现了看起来不明显的测试用例

    突变测试是一个与单元/功能/集成测试方法截然不同的视角

  • 你测试你的测试套件——它是你整个测试程序的元测试
  • 它激发了您可能从未考虑过的其他测试用例

  • 我知道这是一个老问题,但最近Bob叔叔写了一篇关于变异测试的博客文章,这篇文章非常有趣,可以帮助理解这类测试的有用性:


    突变测试帮助我识别测试用例断言的问题

    例如,当您收到一份报告说“没有突变体被测试用例x杀死”时,您看了一眼,发现断言已经被注释掉了

    据介绍,谷歌的开发人员使用变异测试作为代码审查和请求检查的补充。他们似乎对结果感到高兴:

    开发人员决定重新设计大块代码,使其可测试,这样就可以杀死突变体,他们在复杂的逻辑表达式中发现了缺陷,查看突变体,他们决定删除具有等效突变体的代码,因为他们认为这是一种过早的优化,他们声称,由于没有测试用例正确地覆盖了变异下的逻辑,变异为他们节省了数小时的调试甚至生产中断时间。变异测试被称为近年来代码审查验证中最好的改进之一。虽然这种反馈很难量化,但加上数以千计的开发人员愿意检查代码更改中出现的变体,这就形成了一种说法


    覆盖率与变异测试。这是一个老问题,但我最近遇到了一个关于这个话题的博客。相当固执己见。但是,覆盖率和突变测试之间的区别是明确的


    我自己的经验表明,Pitest非常有用,但由于运行时爆炸,它只能运行一个非常快的测试集。实际上,这限制了我应用突变测试的范围。

    由于上述突变,第一个测试用例的行为不同,现在出现了一个异常。因此它不会返回预期的{6,3}数组。然而,我们的第二个测试用例保持不变,因为它也包含正数。所以,它也给出了正数的例外。现在,如果我们必须编写一个成功的测试用例,那么 输入={6,-6,-7,-3,-4}
    Expected={-6,-3}

    我不明白这是如何偏离传统的测试驱动开发的。根本没有办法涵盖所有的数学可能性,我认为这根本不值得。是的,这是我的问题,在现实世界中是否值得付出努力。我知道这方面有一些理论工作。但它在现实中有效吗?难道突变测试实际上不是在测试测试吗?我的意思是,如果你能改变源代码的逻辑并且仍然通过测试,那么测试肯定不是很正确吗?如果我遗漏了什么,请原谅……是的,像代码覆盖率这样的变异测试会检查你的测试是否足够。@Jon Limjap:1)关于区别:传统的测试驱动开发