首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pitest以似乎不可能的方式变异Java源代码

Pitest以似乎不可能的方式变异Java源代码
EN

Stack Overflow用户
提问于 2021-11-04 17:16:28
回答 1查看 193关注 0票数 1

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

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

我的问题是,最可怜的基因突变,我不明白,因此不知道如何杀死。

以下是节目:

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

下面是测试用例:

代码语言:javascript
复制
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 && ab == bc){ return "equilateral";}

不等于SURVIVED

  • incremented (
  • ,a++)的整数局部变量3 ->存活

如果代码中没有不相等的值,那么它怎么会变的不等于呢?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-05 08:21:19

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

这些突变看起来是由“rv”突变体产生的。这些产品的质量一般低于标准规定,不能用于一般用途。除非你有特别的理由,否则不要使用它们。

“递增局部变量”应真正读为“递增局部变量或参数”。操作员需要做额外的分析才能计算出哪一个。

不等于大于突变的字符将在字节码中突变IFNE指令。在最简单的情况下,如突变描述所示,这将映射到一个!= check,但编译器在生成其他逻辑结构时可以选择使用该指令(在本例中,等式检查与an &&)相结合。这种描述无疑是误导的,但是,更新mutator以使其更加准确将涉及到编写反编译器的大部分内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69843291

复制
相关文章

相似问题

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