在为我最喜欢的突变测试框架(NinjaTurtles)编写"Off By One"变异测试程序的过程中,我编写了以下代码,以便提供检查我的实现的正确性的机会:
public int SumTo(int max)
{
int sum = 0;
for (var i = 1; i <= max; i++)
{
sum += i;
}
return sum;
}
Run Code Online (Sandbox Code Playgroud)
现在这看起来很简单了,并没有让我觉得尝试改变IL中的所有文字整数常量会有问题.毕竟,只有3(the 0,the 1,and ++).
错误!
在第一次运行中它变得非常明显,它在这个特定的实例中永远不会起作用.为什么?因为将代码更改为
public int SumTo(int max)
{
int sum = 0;
for (var i = 0; i <= max; i++)
{
sum += i;
}
return sum;
}
Run Code Online (Sandbox Code Playgroud)
只在总和上加0(零),这显然没有效果.不同的故事,如果它是多组,但在这种情况下,它不是.
现在有一个相当简单的算法来计算整数之和
sum = max * (max + 1) / 2;
Run Code Online (Sandbox Code Playgroud)
我可以轻易地使突变失败,因为从任一常数中加1或减1会导致错误.(鉴于此max >= …