突变检测在实践中是否有用?

你有任何实际应用突变检测的例子吗? 它比简单的testing覆盖工具更好吗? 还是没用?

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

unit testing的用处不再讨论。 它们在质量应用的概念中是必不可less的。 但是,我们如何评估它们的相关性呢? 代码覆盖率指标达到100%并不意味着代码被100%testing。 这只是unit testing执行过程中执行代码的一个视图。 突变testing将使您对testing更有信心。

这是一个两步过程:

  1. 生成突变体。
  2. 检查突变是否被testing发现。

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

我前段时间看过突变testing,作为检查自动化回归testing脚本功效的一种方法。 基本上,这些脚本中有许多缺less检查点,所以当他们正在对正在testing的应用程序进行正确的testing时,他们没有根据基线数据来validation结果。 我发现一个比改变代码简单得多的方法是编写另一个应用程序来引入对基线副本的修改,并根据修改后的基准重新运行testing。 在这种情况下,任何通过的testing都是错误的或不完整的。

这不是真正的变异testing,而是一种使用类似的范例来testingtesting脚本功效的方法。 实施起来很简单,国际海事组织做得很好。

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

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

简而言之:突变testing可以给出关于源代码和testing质量的一些信息,但是这不是直接使用的。

我已经玩了一个小小的,人为的应用程序:

http://pitest.org/

这是一个自动化突变生成的java工具。 你可以运行它对你的testing套件,它会为你生成HTML报告,指出有多less变种被杀死。 看起来相当有效,不需要太多的努力来build立。 在Java世界中,实际上有很多好的工具可以用于这种事情。 也可以看看:

http://www.eclemma.org/

为了报道。


我认为突变检测背后的概念是正确的。 这只是工具支持和意识的问题。 您正在打破传统代码覆盖指标的简单性和这种技术的额外复杂性之间的权衡 – 这实际上只是归结为工具。 如果你能产生突变体,那么它将有助于揭露testing用例中的弱点。 你已经做的testing的努力值得吗? 最后,我确实发现它似乎并不明显的testing用例。

突变检测是一种与单元/function/集成testing方法大不相同的攻击angular度。

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

我最近开始在C ++中进行变异testing,它远远优于代码覆盖率。 在极端情况下,可能有100%的代码覆盖率和0%的潜在错误(在我的案例中,它揭示了大约80%的错误) – 当然,这取决于你如何生成错误。

主要的问题是要find一种有效的方法来自动生成大量的不等价的突变体,并且testing套件必须快速运行。

您的报告还应该包含testing未检测到的变化/差异。 那么你可以修复testing。

我知道这是一个老问题,但是最近Bob叔叔写了一篇关于变异testing的博客文章,可以帮助理解这种types的testing的有用之处:

鲍勃叔叔突变testing博客post