使用PIT查找无用的单元测试
作者:互联网
假设我们有一个我们想要测试的代码:
class C {
int doSmth() {
return 1;
}
}
现在假设我们在一个类中放置了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);
}
}
这是一个IRL示例:通过用一些无用的代码替换测试内容,我看到了几十个“修复”的测试,
因为被测试的代码合同会随着时间而变化.
现在,PIT“entry”单元是一个包含测试方法的类(不是单独的测试metod本身),
所以在上述情况下,PIT不仅会显示100%的线覆盖率,还会显示100%的突变覆盖率.
好的,我很高兴知道我有100%的突变覆盖率,
但是如何在上述情况下识别无用的测试 – testDoSmth2()(假设我的变异覆盖率很高)?
解决方法:
目前没有任何内置功能,但是您需要检测无用(在检测故障方面)测试所需的数据.
XML报告输出每个突变的查杀(通常在测试方法的级别).任何不杀死突变的测试都可以在不影响突变评分的情况下被删除.
当然,不杀死突变的测试仍可能因其他原因而有价值,例如:描述单位的作用.
然而,通过静态分析可以更有效地检测到示例中显示的极端情况 – 测试显然不会运行任何代码,因此无法检测到其中的错误
标签:java,unit-testing,mutation-testing,pitest 来源: https://codeday.me/bug/20190519/1138087.html