执行变异杀死率这个指令一定要求所有的测试都是通过的,但是我用mvn clean test代码执行了以后,我发现我的测试用例都是通过的,这个时候我就很奇怪的。

然后,调BUG最好的方法之一——消融法!!!就发挥了很大的作用了

我发现,我只执行一部分的测试方法是可以跑出来的,我就知道应该是没有被执行的代码有一些问题,后面我发现

执行这个代码的mvn clean test-compile org.pitest:pitest-maven:mutationCoverage的过程里面代码的编译或者是执行过程,和我们执行测试指令的过程是不一样的。

所以说有一一些下标,或者是一些硬编码的部分会导致不用,这样就会导致后面的测试用例不通过!!!

所以说要避免代码中代码的执行过程改变从而会导致执行结果不同的部分!!!

特别是在面对一些类变量这一类所有的测试用例共享的数据时,一定要让每一次都独立,如果不能独立(比如说我的类变量是private,不能每一次都重置和清空,就要对一些执行过程改变从而会导致执行结果不同的部分加以控制!!!)

/**
     * 对所有商品进行排序后输出信息
     */
    public String getAllProductsInfo(){
        String info = "";
        String sep = System.getProperty("line.separator");
        Collections.sort(products, (p1, p2) -> {
            if(p1.getPaymentPrice()>p2.getPaymentPrice())
                return 1;
            else if (p1.getPaymentPrice()<p2.getPaymentPrice())
                return -1;
            else{
                return p1.name.compareTo(p2.name);
            }
        });
        for (int i = 0; i<products.size(); i++){
            info += ("No."+(i+1)+sep+products.get(i).getInfo()+sep);
        }
        return info;
    }

对products中的物品的顺序造成了影响!!!

到时后面的代码是执行错误的!!!

GPT给出的解释

原因分析

  1. 代码中的可变状态(共享静态变量 products

    • getAllProductsInfo() 方法对 products 列表进行了排序操作,而 productsShop 类中的一个静态变量。这种操作可能会导致多个测试用例之间相互影响。
    • 当一个测试对 products 列表进行了排序后,列表的顺序会改变,而其他测试可能期望 products 保持原始顺序,这就导致状态不一致的问题。
  2. 排序操作的副作用

    • 代码中直接对静态 products 列表进行排序操作,这会改变 products 的原始顺序。因为 Collections.sort() 是就地排序,意味着 products 的内容会被改变。因此,其他测试用例在依赖原始顺序进行操作时可能会出现问题。
    • 在变异测试中,PIT 可能对这部分代码产生变异(例如改变比较逻辑),这可能会导致测试用例和期望结果不一致。
  3. 非线程安全性

    • 如果变异测试以多线程方式运行,那么多个线程对同一个静态 products 列表进行排序可能会导致并发问题。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐