java - 使用 PIT 查找无用的单元测试

标签 java unit-testing mutation-testing pitest

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

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() 在上面的例子中(假设我的突变覆盖率很高)?

最佳答案

pitest 目前没有内置任何内容,但是您需要检测无用(就检测故障而言)测试的数据已经存在。

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

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

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

关于java - 使用 PIT 查找无用的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28764551/

相关文章:

mutation-testing - 哪些编程语言可以支持变异测试?

java - 我可以获得一个列表对象,但是如何在列表中显示值?

php - 不可测试的基类扩展 PHPUnit_Framework_TestCase

java - 是否可以创建 java RAM 磁盘以与 java.io.* API 一起使用?

java - 为什么 JUnitCore 只返回第一个结果?

C# 反射 : Replace a referenced assembly

java - Java 和 C++ 之间是否有消息传递服务,例如 JMS for Java to Java?

java - Eclipse:将旧项目一起归档到根项目/文件夹中的提示?

java - 无法在Thread中获取spring服务bean

c# - It.IsAny<Cart>()、IsAny<ShippingDetails>()、Times.Never()。他们在做什么?