变异测试在实践中有用吗?

Mne*_*nth 44 testing unit-testing code-coverage mutation-testing

你有变异测试的现实应用的例子吗?它比简单的测试覆盖工具更好吗?还是没用?

在现实世界中,突变测试有哪些优点/缺点?

小智 18

不再讨论单元测试的有用性.它们对于高质量应用的构思至关重要.但是,我们如何评估其相关性?代码覆盖率指标高达100%并不意味着代码经过100%测试.这只是在单元测试执行期间执行代码的视图.变异测试将使您对测试更有信心.

这是一个两步过程:

  1. 生成突变体.
  2. 检查测试是否发现了突变.

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


Sma*_*acL 10

我前段时间看过变异测试作为检查自动回归测试脚本功效的方法.基本上,许多这些脚本都缺少检查点,因此在他们正在运行正确测试的应用程序时,他们没有根据基线数据验证结果.我发现比更改代码更简单的方法是编写另一个应用程序来引入对基线副本的修改,并针对修改后的基线重新运行测试.在这种情况下,任何传递的测试都是错误的或不完整的.

这不是真正的突变测试,而是使用类似范例来测试测试脚本功效的方法.它很容易实现,IMO做得很好.


Koo*_*obz 5

我为最细小的人为应用而苦苦挣扎:

http://pitest.org/

这是一个Java工具,可以自动生成突变体。您可以针对您的测试套件运行它,它将为您生成HTML报告,指示杀死了多少个突变体。看起来很有效,不需要太多的努力来设置。实际上,Java世界中有很多不错的工具可用于此类事情。也可以看看:

http://www.eclemma.org/

为覆盖。


我认为突变测试背后的概念是合理的。这只是工具支持和意识的问题。您正在权衡传统代码覆盖率指标的简单性和该技术的额外复杂性之间的权衡-实际上,这只能归结为工具。如果你能产生突变体,那么它将会帮助暴露在你的测试用例的弱点。在您已经进行的测试上付出一点点努力值得吗?怀着深深的兴趣,我的确发现它带来了似乎不太明显的测试用例。

变异测试是一个与单元/功能/集成测试方法完全不同的攻角。

  1. 您测试您的测试套件-这是整个测试程序的元测试。
  2. 它激发了您可能没有考虑的其他测试用例。


mig*_*eia 5

我知道这是一个古老的问题,但是最近Bob叔叔(Uncle Bob)写了一篇关于变异测试非常有趣的博文,可以帮助您了解这种测试的有用之处:

Bob叔叔变异测试博客文章


小智 5

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

\n\n

例如,当您收到一份报告说“测试用例 x 没有杀死任何突变体”时,您看一下,结果发现该断言已被注释掉。

\n\n

根据这篇论文,谷歌的开发人员使用变异测试作为代码审查和拉取请求检查的补充。他们似乎对结果很满意:

\n\n
\n

开发人员决定重新设计大块代码以使它们可测试,以便杀死突变体,他们在查看突变体的复杂逻辑表达式中发现了错误,他们决定删除具有等效突变体的代码,因为他们认为这是不成熟的优化,他们\xe2\x80\x99ve声称突变体为他们节省了数小时的调试时间,甚至生产中断,因为没有测试用例正确覆盖突变下的逻辑。变异测试被称为多年来代码审查验证中最好的改进之一。虽然这种反馈很难量化,但考虑到成千上万的开发人员愿意检查其代码更改中出现的突变,这一点就足以说明问题。

\n
\n