用PIT找到无用的单元测试

Bas*_*ass 6 java unit-testing mutation-testing pitest

假设我们有一个我们想要测试的代码:

class C {
    int doSmth() {
        return 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在假设我们在一个类中放置了2个单元测试.第一个"测试一切",而第二个"无所事事":

@RunWith(JUnit4.class)
public final class CTest {

    @Test
    @SuppressWarnings("static-method")
    public void testDoSmth() {
        assertEquals(1, new C().doSmth());
    }

    @Test
    @SuppressWarnings("static-method")
    public void testDoSmth2() throws Exception {
        Thread.sleep(1000);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个IRL示例:我已经看到通过用一些无用的代码替换测试内容来"修复"了几十个测试,因为测试的代码合同随着时间的推移而变化.

现在,PIT"入口"单元是一个包含测试方法的类(不是单独的测试方法本身),因此在上述情况下,PIT不仅会显示100%的线覆盖率,还会显示100%的突变覆盖率.

好的,我很高兴知道我有100%的突变覆盖率,但是如何识别无用的测试 - testDoSmth2()在上述情况下(假设我的突变覆盖率很高)?

hen*_*nry 6

目前没有任何内置功能,但是您需要检测无用(在检测故障方面)测试所需的数据.

XML报告输出每个突变的查杀(通常在测试方法的级别).任何不杀死突变的测试都可以在不影响突变评分的情况下被删除.

当然,不杀死突变的测试可能仍然有其他原因,例如描述一个单位的作用.

然而,通过静态分析可以更有效地检测到示例中显示的极端情况 - 测试显然不会运行任何代码,因此无法检测到其中的错误