【问题标题】:How could I get code coverage for individual tests in Java如何获得 Java 中单个测试的代码覆盖率
【发布时间】:2015-09-05 17:34:48
【问题描述】:

我有一个测试类,里面有一堆测试用例。

我想测量班级中个别测试用例的覆盖率。

有什么方法可以让我得到一份映射测试用例和覆盖率的报告。

【问题讨论】:

  • 您想测量什么,究竟是什么?每个单独的测试覆盖的整个生产代码库的百分比? (但是,这样做有什么意义?)还是别的什么?
  • 我想知道 prod 代码库中单个测试用例所涵盖的类或方法。我的目的不是衡量覆盖率。
  • 您始终可以运行单个测试用例,然后检查由此产生的覆盖率报告。但是您可能希望一次运行整个测试套件。据我所知,现有的 Java 代码覆盖工具都没有提供这种开箱即用的功能(来自 Ira 的答案的解决方案似乎需要用户进行一些编码,所以我没有计算在内)。我不太了解这种需求,所以我不知道这个功能是否值得在一个工具中使用。
  • @Rogério:我同意,我们的解决方案并不是开箱即用的。那是因为我们的测试覆盖率收集工具独立于测试执行框架。我想我们建议的更改很容易进行;一个好的框架枚举然后执行测试,这些更改只需要在枚举的(可能是单个)点进行。通过该更改,所有测试都可以运行,但覆盖率收集是按照 OP 的要求在每个测试的基础上完成的。
  • @IraBaxter 是的。对于 JUnit,必须在每个测试类上创建和指定自定义 Runner;对于 TestNG,必须创建和配置 ITestNGListener 实现。这两种情况应该覆盖 99% 的用户群(只是猜测)。尽管如此,这仍需要一些不小的努力。但我怀疑这不是一个“真正的”需要。就个人而言,我没有看到该功能的明确用途(需要时,我只需运行一个测试,然后检查覆盖率报告)。

标签: java code-coverage cobertura jacoco emma


【解决方案1】:

我们的SD Java Test Coverage 工具可以为您提供这些数据。

这个工具为被测程序添加了一个带有方法的特殊类TCV:

    TCV.reset();  // resets the test coverage vector
    TCV.dump(); // writes vector to file
    TCV.setBaseName(String); // record vector file name prefix

如果应用程序调用转储函数,则测试覆盖向量将转储到以当前时间戳和提供的 BaseName 命名的文件中。

您可以通过修改您的测试执行框架(无论它是什么)来使用这些来获得特定于测试的向量,只需稍微修改一下即可。无论何时调用第 N 个测试用例,都添加对 dump 的调用:

    TCV.reset(); // marks everything as "not executed"
    tests.nthTestCase();
    TCV.setBaseName("nthTestCase");
    TCV.dump();

这将生成一个时间戳矢量,该矢量仅涵盖 nTestCase 执行的代码。

可以通过工具的 UI 组件找到并显示单个测试用例结果。 UI 组件还可以将所有这些单独的测试用例覆盖结果组合成一个整体测试覆盖结果,以给出传统的“所有测试用例执行的一切”结果。或者,您可以比较测试用例覆盖率结果,看看哪些测试用例覆盖了相同的代码,以帮助消除冗余测试用例等。

UI 组件还可以生成测试覆盖的行的报告;这可以编写脚本,因此可以为单独收集的所有测试覆盖向量生成一个覆盖行的报告。

【讨论】:

  • 谢谢,但我不在 Windows 上
  • 嗯。好吧,您可以在 Wine 上运行该工具的仪器部分(这是经过充分测试的);您可以使用产品提供的 shell 脚本来执行此操作。该工具的其余部分基于 Java,将在 Linux 上本地运行。
【解决方案2】:

你试过三叶草Clover

我知道它不是免费的,但它应该可以满足您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 2020-01-13
    • 2017-02-13
    相关资源
    最近更新 更多