【问题标题】:Code coverage report without running test [closed]没有运行测试的代码覆盖率报告[关闭]
【发布时间】:2013-06-26 07:32:41
【问题描述】:

我想从我的单元测试中创建报告而不运行它们。我只想分析测试源代码并检查调用了哪些方法。在我的测试中,我使用 JUnit,Arquillian。我在外部服务器上运行它们,但在使用 arquillian-jacoco 扩展时遇到了问题。检测应用程序无法正常启动后。有没有提供这种功能的工具?

【问题讨论】:

  • 没有工具可以在不运行测试用例的情况下获得代码覆盖率。这是出于合乎逻辑的原因,因为覆盖率意味着您的测试用例覆盖了多少代码。如果不运行测试用例,任何声明都会有缺陷。
  • 据我所知,没有任何工具可以在不运行的情况下为您提供代码覆盖率。
  • 听起来你真正的问题是为什么你的代码覆盖率不起作用。也许您应该重新编写您的问题,以便 this 成为焦点 - 毕竟,正确的代码覆盖率是您想要的!
  • 这是一个老问题。您当然可以检测您的代码,然后检查覆盖率。例如,使用 jacoco 只需运行 mvn jacoco:prepare-agent ,然后使用给定参数启动 jvm。在您的测试(或任何您想做的事情)之后,您可以运行 mvn jacoco:report 并获得一份不错的覆盖率报告。

标签: java unit-testing testing code-coverage emma


【解决方案1】:

代码覆盖率不仅仅与调用哪些方法有关。它更深入一层,并检查方法中的哪些行在您的测试用例中被覆盖(实际执行)。

因此,与其说只是将方法调用作为代码的一部分,不如说是任何执行流程是否实际调用了该方法。而且,执行流程主要取决于测试用例的输入。因此,除非您运行它们,否则代码覆盖工具在这里几乎毫无头绪。

假设,你有一些类似的代码

if (size > 0) {
    this.array = new Integer[size];
} else {
    String msg = "Input size must be > 0";
    logAndThrow(msg, new IllegalArgumentException(msg));
}

现在,您实际上所说的是将logAndThrow() 视为已覆盖,除非您有一些使用size <= 0 测试此类的测试用例,否则肯定不是这种情况。

【讨论】:

    【解决方案2】:

    虽然已经有了很好的答案,但我想补充一点,很多事情不能简单地在编译时确定,因此只能在运行时确定。多态性就是一个很好的例子。

    【讨论】:

      【解决方案3】:

      一个可以在不执行代码的情况下通过静态分析获得代码覆盖率,基本上是通过每个单元测试中的slicing your code。请参阅技术论文Static Estimation of Test Coverage

      话虽如此,我认为目前没有任何生产工具可以实现这个想法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-23
        • 2021-07-23
        • 2014-05-27
        • 2019-01-29
        • 2017-09-03
        • 2019-09-19
        • 2019-09-02
        • 1970-01-01
        相关资源
        最近更新 更多