6

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

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“入口”单元是一个包含测试方法的类(不是单独的测试方法本身),所以在上述情况下,PIT 不仅会显示 100% 的行覆盖率,还会显示 100% 的变异覆盖率。

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

4

2 回答 2

6

目前没有任何东西内置到 pest 中,但是您需要检测无用(就检测故障而言)测试的数据就在那里。

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

当然,由于其他原因,例如描述一个单元的作用,不杀死突变的测试可能仍然有价值。

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

于 2015-02-27T22:49:17.603 回答
1

我开发了一种手动方法 https://www.codeproject.com/Articles/4051293/Unit-Test-Suite-Quality-Estimation PIT 可以给你一些提示。

于 2021-01-22T21:13:02.793 回答