我读过一些关于突变测试的书,尽管它的内部功能或如何做对我来说是很清楚的;我在理解一个想要被测试的程序和突变测试之间的关系时遇到了一些麻烦。我一直在阅读关于这个题目的资料,但对我来说还是不太清楚。
例如,假设我制作了一个使用二进制搜索来查找值的程序。所以我有这样的东西:
public int runBinarySearchIteratively(
int[] sortedArray, int key, int low, int high) {
int index = Integer.MAX_VALUE;
while (low <= high) {
int mid = (low + high) / 2;
if (sortedArray[mid] < key) {
low = mid + 1;
} else if (sortedArray[mid] > key) {
high = mid - 1;
} else if (sortedArray[mid] == key) {
index = mid;
break;
}
}
return index;
}因此,我有一组测试来证明这个程序;例如:
arrayToTest={1,2,3,4,5,6}
key=3
will return 2
arrayToTest={10,20,30,40,50,60}
key=60
will return 5
arrayToTest={10,20,30,40,50,60}
key=100
will return Max_VAlue但是,当我应用突变测试时,我可以生成改变程序原始行为的突变体,例如:
mutant 1:
while (low > high) {
int mid = (low + high) / 2;
if (sortedArray[mid] < key) {
low = mid + 1;
} else if (sortedArray[mid] > key) {
mutant 2:
if (sortedArray[mid] > key) {
low = mid + 1;
} else if (sortedArray[mid] > key) {
high = mid - 1;诸若此类。据我所知,如果测试用例检测到突变体(从突变程序中提供的答案与测试中所述的答案不同),那么突变体就会被杀死;在其他情况下,突变体会存活下来。关于我所读到的,以防有很多变种人幸存下来,这表明我们的测试用例需要改进;下面是我的问题:
总之,原始程序和突变测试之间的关系是什么?或者这种技术对测试程序有什么用处。也许这个问题看起来很傻,因为这是一个已经被研究过的领域,但是我在网上找不到能帮助我解决这些疑问的好例子。
谢谢
发布于 2018-12-12 17:37:35
变异测试不会暴露程序中的缺陷,而会暴露测试套件中的缺陷。
其思想是,测试套件应该足够详细,以便能够检测到任何偏离预期行为的行为。一个代码覆盖率高的测试套件是必要的,但不足以实现这个目标。例如,一个高覆盖率的测试套件可能会失败,以防止错误。
突变测试以微妙的方式改变程序,例如将小于<的比较更改为小于或等于<=。一个好的测试套件应该包含边缘案例,以澄清我们对这里应该发生什么的期望。但是,如果这种突变不会导致测试失败,那么就我们的测试套件而言,任何一个操作符都可能是正确的。也许原来的是正确的,也许变异的代码是正确的!但其中一个一定是错的。所以我们也许需要澄清一下测试。
在实践中,突变测试是非常罕见的,很少有工具可供使用。它也容易出现错误,因为并不是所有的代码都是为正确而存在的。代码还受非功能需求的影响,这些需求通常不会反映在测试套件中,例如,它会产生一些日志记录输出。因此,突变测试不太适合于发现特定的缺陷,而更适合于寻找具有低质量测试的代码区域(即该区域的突变不太可能被杀死)。
相关技术包括:
https://softwareengineering.stackexchange.com/questions/382895
复制相似问题