【问题标题】:Jacoco: Find code coverage for external testsJacoco:查找外部测试的代码覆盖率
【发布时间】:2018-10-12 11:43:05
【问题描述】:

我最近在 Eclipse 中使用 EclEmma 插件来查找我的应用程序中 JUnits 的代码覆盖率,效果很好。

在下一步中,我希望能够找到从外部在我们的应用程序上调用的端到端测试/功能测试的代码覆盖率(它们驻留在单独的服务器上)。

基本上,我们将应用程序打包为 jar(我们使用 maven)并将其部署在服务器上。我们可以在这个位置触发功能测试。

在这种情况下有没有办法找到代码覆盖率?

我对代码覆盖工具工作原理的理解(原始语言)是它加载类并根据已命中的代码部分生成报告。因此,根据这种理解,我不需要访问测试代码。我只需要将代码覆盖工具插入到我的应用程序 jar 中,只要调用此 jar 中的任何代码,就会更新报告。 我的理解正确吗?

注意: 如果可以使用其他工具,我愿意使用其他代码覆盖率工具。

【问题讨论】:

  • 我相信您对“外部”测试的理解是有缺陷的。代码覆盖率是开发人员测试覆盖率指标。 QA 测试应该根据需求测试代码;基本上“此输入在软件中生成此活动,如此输出所示”。
  • 重点是我们要确保在交付给客户之前,无论测试的性质如何,我们的代码的最大部分已经被测试触及。
  • 然后执行单元测试覆盖代码。
  • @DwB 来自更高级别测试的代码覆盖率报告——甚至来自手动测试或什至来自实际使用的一段时间——是信息丰富且有用的。您不应将覆盖率百分比用作指标。但是您可以查看报告并查看“嘿,为什么该方法永远不会执行?”的内容; “啊,看,我们的功能开关正在工作”,“嗯,那个位不应该触发”等等。
  • @slim 这几乎概括了我的意图

标签: java maven jenkins code-coverage jacoco


【解决方案1】:

我有同样的问题。这就是我在本地修复它的方式。通过在 vm args 中添加 jacoco 代理。此外,在 jacoco 版本 6.1 之后,exec 文件在开始时创建(空白),然后在服务器正常关闭后填充,显然 eclipse 没有这样做。所以我们得到一个空的 .exec 文件。关键是添加 output=tcpserver 然后导入代码覆盖率。

-javaagent:C:\Users\JohnDoe\Downloads\jacoco-0.8.5\lib\jacocoagent.jar=output=tcpserver。

将结果导入 Eclipse。这是通过文件 -> 导入 -> 覆盖会话 -> 选择代理地址单选按钮但保留默认值 -> 输入一些名称并选择正在测试的代码来完成的。 默认应为 127.0.0.1,端口为 6300。

【讨论】:

    【解决方案2】:

    这就是我在詹金斯管道中使用 maven 的方式

    mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent test -Dmaven.test.failure.ignore=true 
    

    这将创建一个包含代码覆盖率数据的target/jacoco.exec

    显然我们无法解释输出,但是像 SonarQube 这样的工具和插件可以做到这一点。(在我的例子中,我使用了 sonarqube)

    但是,您可以使用以下内容生成 html/csv 格式,该格式将位于 target/site/jacoco/index.htmltarget/site/jacoco/jacoco.csv

    mvn org.jacoco:jacoco-maven-plugin:report

    java -jar jacococli.jar report jacoco.exec [options]

    或者,您可以参考tutorial,它在pom.xml 中完成了所有这些操作

    【讨论】:

    • 我猜你正在从 maven 运行测试。我的测试位于外部,无需 maven 即可独立运行。
    • @tryingToLearn 你实现了你的目标吗?
    【解决方案3】:

    您可以在服务器上运行您的代码,并在运行时由 JaCoCo 代理进行检测,方法是将代理添加到 Java 命令行。例如,如果您的进程当前是通过以下方式启动的:

    java -jar myApp.jar
    

    你可以改成

    java -jar myApp.jar -javaagent:/some/path/jacocoagent.jar
    

    默认情况下,这将在 VM 终止时将覆盖数据写入文件 jacoco.exec,但您可以使用选项覆盖它,使您能够通过 TCP/IP 获取覆盖数据。请参阅JaCoCo Agent docs

    您可以使用以下方法将其格式化为报告(例如 HTML):

    java -jar jacococli.jar report jacoco.exec [options]
    

    有关选项,请参阅JaCoCo CLI docs

    ...或者您可以使用 EclEmma 来分析输出。

    如果有真正的原因您不能使用代理,作为最后的手段,您可以使用jacocococli 中的instrument 命令将您的类文件静态转换为插桩类文件。有关这方面的信息,请参阅JaCoCo 'Offline Instrumentation' documentation

    直接调用代理和使用jacococli.jar是JaCoCo最基本的使用方式。由于您使用的是 Maven,因此您可以使用 JaCoCo Maven 插件获得许多相同的效果。

    【讨论】:

    • 这是否意味着在编译期间不需要挂钩 jacoco?它可以在飞行中上钩吗?
    • 是的;我不确定答案如何使这一点更清楚。
    • 但在我的情况下,jar 不是可执行的 jar,功能测试本身会调用相应的代码部分。这就是为什么我一直在寻找一种在编译时挂钩 jacoco 的方法。
    • 你仍然在某个地方启动 Java。例如,如果您在 Tomcat 中运行,请将代理添加到 Tomcat 启动脚本中的java 命令中。
    • 谢谢。我试过这个,它做了一些调整。生成的报告无法直接在 Eclemma 中查看,即没有显示覆盖范围。 (如果我能做到这一点,那就太好了)。即使提供由 maven 创建的用于生成 jar 的 类文件 也不起作用。 (jacoco-cli 给出了一些警告,例如执行环境不同)我必须提取 application.jar 并提供提取的类文件的路径才能获取报告。我在这里遗漏了什么还是应该这样?
    猜你喜欢
    • 1970-01-01
    • 2016-11-11
    • 2019-01-02
    • 2012-11-02
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 2018-05-28
    • 2012-06-11
    相关资源
    最近更新 更多