首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与测试单元和原始代码的变异测试关系

与测试单元和原始代码的变异测试关系
EN

Software Engineering用户
提问于 2018-12-12 16:32:08
回答 1查看 56关注 0票数 3

我读过一些关于突变测试的书,尽管它的内部功能或如何做对我来说是很清楚的;我在理解一个想要被测试的程序和突变测试之间的关系时遇到了一些麻烦。我一直在阅读关于这个题目的资料,但对我来说还是不太清楚。

例如,假设我制作了一个使用二进制搜索来查找值的程序。所以我有这样的东西:

代码语言:javascript
复制
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;
}

因此,我有一组测试来证明这个程序;例如:

代码语言:javascript
复制
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

但是,当我应用突变测试时,我可以生成改变程序原始行为的突变体,例如:

代码语言:javascript
复制
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;

诸若此类。据我所知,如果测试用例检测到突变体(从突变程序中提供的答案与测试中所述的答案不同),那么突变体就会被杀死;在其他情况下,突变体会存活下来。关于我所读到的,以防有很多变种人幸存下来,这表明我们的测试用例需要改进;下面是我的问题:

  • 一个突变测试点能检测出我最初的程序可能存在的缺陷吗?如果是这样的话,怎么做?因为变种人是一个被迫执行原程序不打算执行的动作的程序。
    • 突变测试可以用于测试或生成将充当单元测试的小程序?

总之,原始程序和突变测试之间的关系是什么?或者这种技术对测试程序有什么用处。也许这个问题看起来很傻,因为这是一个已经被研究过的领域,但是我在网上找不到能帮助我解决这些疑问的好例子。

谢谢

EN

回答 1

Software Engineering用户

发布于 2018-12-12 17:37:35

变异测试不会暴露程序中的缺陷,而会暴露测试套件中的缺陷。

其思想是,测试套件应该足够详细,以便能够检测到任何偏离预期行为的行为。一个代码覆盖率高的测试套件是必要的,但不足以实现这个目标。例如,一个高覆盖率的测试套件可能会失败,以防止错误。

突变测试以微妙的方式改变程序,例如将小于<的比较更改为小于或等于<=。一个好的测试套件应该包含边缘案例,以澄清我们对这里应该发生什么的期望。但是,如果这种突变不会导致测试失败,那么就我们的测试套件而言,任何一个操作符都可能是正确的。也许原来的是正确的,也许变异的代码是正确的!但其中一个一定是错的。所以我们也许需要澄清一下测试。

在实践中,突变测试是非常罕见的,很少有工具可供使用。它也容易出现错误,因为并不是所有的代码都是为正确而存在的。代码还受非功能需求的影响,这些需求通常不会反映在测试套件中,例如,它会产生一些日志记录输出。因此,突变测试不太适合于发现特定的缺陷,而更适合于寻找具有低质量测试的代码区域(即该区域的突变不太可能被杀死)。

相关技术包括:

  • 错误注入,其中我们触发软件中的一个错误,以测试软件的错误处理
  • 模糊化,这就像软件输入的突变测试。模糊测试对于确保程序能够安全地处理损坏的输入非常有用。这往往适用于安全敏感的软件,如文件格式解析器或web服务器。
票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/382895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档