48

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

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

4

9 回答 9

19

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

这是一个两步过程:

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

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

于 2012-03-09T13:29:50.737 回答
10

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

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

于 2008-10-28T12:11:43.233 回答
6

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

鲍勃叔叔变异测试博客文章

于 2016-06-22T13:37:28.007 回答
5

我已经为一个小的、做作的应用程序玩了 Pitest:

http://pitest.org/

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

http://www.eclemma.org/

为了覆盖。


我认为突变测试背后的概念是合理的。这只是工具支持和意识的问题。您正在努力在传统代码覆盖率指标的简单性和该技术的额外复杂性之间进行权衡 - 它实际上只是归结为工具。如果您可以生成突变体,那么它将有助于暴露您的测试用例中的弱点。与您已经进行的测试相比,是否值得稍微增加努力?使用pitest,我确实发现它出现了似乎不明显的测试用例。

突变测试是一种攻击角度,与单元/功能/集成测试方法完全不同。

  1. 你测试你的测试套件——它是你整个测试程序的元测试。
  2. 它激发了您可能没有考虑过的其他测试用例。
于 2012-12-10T09:04:34.847 回答
3

变异测试帮助我发现了测试用例断言的问题。

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

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

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

于 2018-12-01T15:57:59.537 回答
2

我最近对突变测试做了一些调查。结果在这里:

http://abeletsky.blogspot.com/2010/07/using-of-mutation-testing-in-real.html

简而言之:突变测试可以提供一些关于源代码和测试质量的信息,但它并不是直接使用的东西。

于 2010-07-11T17:24:58.077 回答
0

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

于 2020-12-17T09:46:10.690 回答
0

覆盖率与突变测试。一个老问题,但我最近遇到了有关该主题的最新博客。很有主见。但是覆盖率和突变测试之间的区别是明确的。

https://pedrorijo.com/blog/intro-mutation/

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

于 2019-07-17T22:07:11.713 回答
0

我使用https://stryker-mutator.io/docs/stryker-js/guides/angular/在 Angular 上设置突变测试只是为了进行实验,并且花了 2 个小时来获得单个代码文件的报告。也就是说,我对在 .NET 中使用 Stryker 的体验非常满意。我必须承认我对突变测试相当陌生,可能有更好的工具可以与 Angular/karma 一起使用,但性能是需要牢记的,特别是如果你打算将它与 TDD 结合使用。

于 2021-09-22T05:26:26.007 回答