2

我开始深入研究代码分析和突变体。我在我的 Eclipse 项目中使用 PITest 作为插件。我遇到了这个我无法杀死的变种人。假设我有以下代码。

class Mutation{
        public static void main(String [] args){
            int i=0;
            String SPECIAL_CHARS = "?!$@";
            String password = "Something";
            for (int pos = 0; pos < password.length(); pos++) {
                char c = password.charAt(pos);
                if(SPECIAL_CHARS.indexOf(c) < 0) {
                 i++;
                }
            }
    }
}

据我了解,如果有一个不属于SPECIAL_CHARS(比如说()的字符,变量i会增加。PITest 报告了两个突变体。

在此处输入图像描述

与以下信息。

在此处输入图像描述

在此处输入图像描述

我试图编写几个可能会在没有任何运气的情况下杀死这个突变体的 Junit 测试。有人可以解释一下如何杀死它吗?

我现在知道,如果我的密码?作为字符串password的第一个字符,则条件边界检查可能会被终止。增量呢?这是什么意思?

4

1 回答 1

2

不可能编写测试来杀死您提供的代码中的任何可能的突变体,因为代码没有做任何事情。该方法返回 void 并且代码不会执行任何副作用。

Pitest 可以从该方法中删除所有代码,并且该程序在功能上是等效的。

如果修改了代码以产生某种输出(也许是特殊字符的计数?)并且输入密码没有硬编码,那么就有可能编写测试来区分变异程序和未变异程序。

条件边界突变产生的代码相当于

if (SPECIAL_CHARS.indexOf(c) <= 0 )

这可以通过在密码的 0 索引处具有特殊字符的测试用例检测到,该测试用例检查了在计数中检测到这一点。

增量变异算子将增量转换为减量,即从

i++

i--

这是一个非常不稳定的突变,任何提供密码的测试用例都会检测到该密码包含一个特殊字符,该特殊字符在结果计数上断言。

于 2018-01-01T16:42:25.290 回答