【问题标题】:Pitest mutates Java source code in ways that seem not possiblePitest 以看似不可能的方式改变 Java 源代码
【发布时间】:2021-12-18 22:06:32
【问题描述】:

我写了一个简单的程序,给定三个表示三角形边长的整数,输出它是哪种类型的三角形。 然后我编写了一组测试用例,并使用 ptest 运行了变异覆盖。

我的目标是获得 100% 的突变覆盖率,我认为这是可行的,因为它是一个非常简单的程序。

我的问题是 Pitest 引入了我不理解的突变,因此不知道如何杀死。

这是程序:

public class TriangleType {
    
    public String triangleType(int ab, int ac, int bc) {
        
        if(ab <= 0 || ac <= 0 || bc <= 0) {
            return "sign fail";
        }
        
        if(ab + ac <= bc || ab + bc <= ac || ac + bc <= ab) {
            return "triangle inequality fail";
        }
        
        
        if(ab == ac && ab == bc) {
            return "equilateral";
        }
        
        if(ab == ac || ab == bc || ac == bc) {
            return "isoceles";
        }
        
        return "scalene";
        
    }
}

这里是测试用例:

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;

class TriangleTypeTestMutation extends TriangleTypeTest{
    
    protected TriangleType triangleType;
    
    @BeforeEach
    void setUp() {
        triangleType = new TriangleType();
    }
    
    @Test
    void testEquilateral() {
        assertEquals("equilateral", triangleType.triangleType(1,1,1));
        assertEquals("equilateral", triangleType.triangleType(7, 7, 7));
    }
    
    @Test
    void testIsoceles() {
        assertEquals("isoceles", triangleType.triangleType(5, 5, 2));
        assertEquals("isoceles", triangleType.triangleType(2, 5, 5));
        assertEquals("isoceles", triangleType.triangleType(5, 2, 5));
    }   
    
    @Test
    void testScalene() {
        assertEquals("scalene", triangleType.triangleType(3, 5, 7));
        assertEquals("scalene", triangleType.triangleType(10, 4, 7));
    }
    
    @Test
    void testTriangleInequalityFail() {
        
        //Should not answer scalene
        assertEquals("triangle inequality fail", triangleType.triangleType(100, 3, 4));
        assertEquals("triangle inequality fail", triangleType.triangleType(2, 50, 3));
        assertEquals("triangle inequality fail", triangleType.triangleType(1, 2, 33));
        
        //Should not answer isoceles
        assertEquals("triangle inequality fail", triangleType.triangleType(100, 3, 3));
        assertEquals("triangle inequality fail", triangleType.triangleType(2, 50, 2));
        assertEquals("triangle inequality fail", triangleType.triangleType(1, 1, 33));      
    }

    @Test
    public void testKillConditionalBoundaryMutation() {
        
        assertEquals("sign fail", triangleType.triangleType(0, 1, 2));
        assertEquals("sign fail", triangleType.triangleType(1, 0, 2));
        assertEquals("sign fail", triangleType.triangleType(1, 1, 0));
                
        assertEquals("triangle inequality fail", triangleType.triangleType(1, 1, 2));
        assertEquals("triangle inequality fail", triangleType.triangleType(2, 1, 1));
        assertEquals("triangle inequality fail", triangleType.triangleType(1, 2, 1));
        
    }
    
    @Test
    public void testKillLessOrEqualToEqual() {
        assertEquals("sign fail", triangleType.triangleType(-1, 1, 5));
        assertEquals("sign fail", triangleType.triangleType(1, -1, 5));
        assertEquals("sign fail", triangleType.triangleType(1, 1, -5));
        
    }

}

这里有一些我不明白的突变:

例如关于if(ab == ac &amp;&amp; ab == bc){ return "equilateral";}这一行

  • 不等于大于 -> SURVIVED
  • 递增 (a++) 整数局部变量号 3 -> SURVIVED

如果我的代码中没有不等于,它如何变异不等于大于?

另外,我没有局部变量。它是否将方法的参数视为局部变量?

【问题讨论】:

  • 参数通常被认为是局部变量(它们具有基本相同的范围和行为),所以我猜 Pitest 也是如此。

标签: java mutation pitest


【解决方案1】:

Pitest 改变字节码而不是源代码。 mutators 试图描述源文件中的等效更改,但有时这并不简单。

这些突变看起来是由“rv”突变器生成的。这些通常质量低于标准集,不推荐用于一般用途。除非您有特殊原因,否则不要使用它们。

“增加一个局部变量”实际上应该读作“增加一个局部变量或参数”。操作员需要进行额外的分析才能确定是哪一个。

不等于大于突变将突变字节码中的 IFNE 指令。在最简单的情况下,这将映射到一个 != 检查,正如突变描述所暗示的那样,但编译器可能会在生成其他逻辑构造时选择使用此指令(在这种情况下,相等性检查与 && 结合使用)。该描述肯定会产生误导,但更新 mutator 以使其更准确将涉及编写反编译器的大部分内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多