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()在上述情况下(假设我的突变覆盖率很高)?
目前没有任何内置功能,但是您需要检测无用(在检测故障方面)测试所需的数据.
XML报告输出每个突变的查杀(通常在测试方法的级别).任何不杀死突变的测试都可以在不影响突变评分的情况下被删除.
当然,不杀死突变的测试可能仍然有其他原因,例如描述一个单位的作用.
然而,通过静态分析可以更有效地检测到示例中显示的极端情况 - 测试显然不会运行任何代码,因此无法检测到其中的错误