【问题标题】:How to measure test density in a java code base?如何测量 Java 代码库中的测试密度?
【发布时间】:2019-12-18 10:06:20
【问题描述】:

我们正在使用 SonarQube 和 JaCoco maven 插件来提取测试度量,例如代码覆盖率。

但是,我发现我们得到的测量结果是缺乏的,我想找到一种方法来测量每个公共方法的测试数量。

这样做的背景是,我注意到通过对存根方法的单个测试,很有可能获得 100% 的方法、类和行覆盖率。

被测方法

public Integer parseString(String value) {
       return null;
}

测试

public void parseStringShouldReturnNullWhenNullIsProvided() {
       Integer result = parseString(null);
       Assert.assertNull(result);
}

上面的示例提供了 100% 的覆盖率,但根本没有提供任何价值。

但是,如果我们能够测量每个公共方法的测试,这将给出 1 的测量值,这应该被视为一个糟糕的结果。通过为此方法添加另一个测试,测量值将增加到 2,新测试将失败,但覆盖率仍为 100%

有没有人知道从 Java 应用程序中提取这种测量值的工具?最好是可以作为插件连接到 maven 的东西。

【问题讨论】:

  • 实际上,您的示例表明“每个方法存在多少测试”与代码覆盖率一样毫无意义。两者均未表明已测试的内容,并且 1,000 次质量差的测试并不比一项合理的测试好。
  • @Holger - 你是完全正确的。不能以任何有意义的方式真正衡量测试的质量。我首先认为,如果每种方法的测试比例很高,那么您更有可能进行提供某种价值的测试,但这种假设不一定是正确的。它只是与代码/测试覆盖率相同的测量。您的评论让我开始思考什么是单元测试以及什么是足够的测试。我现在有一些想法,但超出了这个问题的范围。

标签: java maven testing plugins code-coverage


【解决方案1】:

线路覆盖或方法覆盖不能帮助您评估测试质量,而这正是您所追求的。测试质量不能通过查看每个方法或所涵盖的行的测试数量来轻松确定,因为它在很大程度上取决于断言的质量。

有一些工具可以进行这样的测量。许多人进行突变测试,更改内存中的生产代码并检查是否存在测试失败。如果没有任何测试失败,则更改的操作根本没有经过真正的测试。

我之前已经成功使用过pitest,但请注意,即使启用了历史记录选项,这也会对测试执行时间产生巨大影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多