【发布时间】:2012-05-10 02:53:32
【问题描述】:
在为我最喜欢的突变测试框架 (NinjaTurtles) 编写“Off By One”突变测试器的过程中,我编写了以下代码来检查我的实现的正确性:
public int SumTo(int max)
{
int sum = 0;
for (var i = 1; i <= max; i++)
{
sum += i;
}
return sum;
}
现在这看起来很简单,我并没有想到尝试改变 IL 中的所有文字整数常量会出现问题。毕竟,只有 3 个(0、1 和 ++)。
错了!
在第一次运行时很明显,它永远不会在这个特定的实例中工作。为什么?因为把代码改成
public int SumTo(int max)
{
int sum = 0;
for (var i = 0; i <= max; i++)
{
sum += i;
}
return sum;
}
只在总和上加0(零),这显然没有效果。如果它是多重集合,情况就不同了,但在这种情况下它不是。
现在有一个相当简单的算法来计算整数的总和
sum = max * (max + 1) / 2;
我很容易使突变失败,因为从其中的任何一个常数中加或减 1 都会导致错误。 (鉴于max >= 0)
所以,这个特殊情况的问题解决了。虽然它没有做我想要的突变测试,即检查当我丢失 ++ 时会发生什么 - 实际上是一个无限循环。但这是另一个问题。
所以 - 我的问题: 是否存在任何从 0 或 1 开始的循环可能导致无法重构的“突变关闭”测试失败(代码正在测试或测试)以类似的方式? (请举例)
注意:当测试套件在应用突变后通过时,突变测试失败。
更新:一个不那么琐碎的例子,但仍然可以重构测试以使其失败的例子如下
public int SumArray(int[] array)
{
int sum = 0;
for (var i = 0; i < array.Length; i++)
{
sum += array[i];
}
return sum;
}
如果您提供的测试输入是new[] {0,1,2,3,4,5,6,7,8,9},则将var i=0 更改为var i=1 时,针对此代码的突变测试将失败。但是将测试输入更改为new[] {9,8,7,6,5,4,3,2,1,0},变异测试将失败。因此,成功的重构证明了测试。
【问题讨论】:
标签: c# algorithm il mutation-testing ninja-turtles