假设我们有一个我们想要测试的代码:
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"进入" unit是一个包含测试方法的类(不是单独的测试metod本身), 所以在上述情况下,PIT不仅会显示100%的线覆盖率,还会显示100%的突变覆盖率。
好的,我很高兴知道我有100%的突变覆盖率,
但是如何确定无用的测试 - testDoSmth2()
在上述情况下(假设我的变异覆盖率很高)?
答案 0 :(得分:5)
目前还没有内置任何内容,但是您需要检测无用(在检测故障方面)测试所需的数据。
XML报告输出每个突变的查杀(通常在测试方法的级别)。任何不会杀死突变的测试都可以在不影响突变分数的情况下被删除。
当然,不杀死突变的测试仍可能因其他原因而有价值,例如:描述单位的作用。
然而,静态分析可以更有效地检测到您的示例中显示的极端情况 - 测试显然不会运行任何代码,因此无法检测到其中的错误
答案 1 :(得分:1)
我开发了一个手动方法 https://www.codeproject.com/Articles/4051293/Unit-Test-Suite-Quality-Estimation 不过,PIT 可以给你一些提示。