首页 > 解决方案 > 运行 jacoco 报告,其中集成测试在一个代码库中,而源代码在另一个代码库中

问题描述

我最近开始为 maven 项目创建 jacoco 报告,包括单元和集成测试,它们似乎工作正常。现在我遇到了一个不同的场景,我不确定如何处理。我有一个由集成测试用例组成的工作区 - 应用程序 A,但源代码不存在于同一个工作区/代码库中。在调用这些集成测试脚本时实际运行的源代码位于不同的工作区/代码库 - 应用程序 B(它们是使用带有 localhost url 的 rest api 调用调用的。jboss 服务器为应用程序 B 启动,因此 localhost 上下文是up)来自集成测试。目的是从应用程序 A 调用这些集成测试,进而调用应用程序 B 中这些测试的源代码,生成应用程序 B 的代码覆盖率的 jacoco 报告。我实际上不确定如何实现这一点。有人可以提供一些输入。

谢谢。

标签: mavenjacoco

解决方案


如果我理解正确,您的场景中实际上有 2 个不同的过程:

  • 运行集成测试并且可以轻松应用 jacoco 的“客户端”进程,但这不是您所需要的

  • 运行实际 JBoss 服务器并执行实际代码的“服务器”进程。

客户端进程通过 HTTP 联系服务器。

在这种情况下,如果您从 maven/gradle 运行测试,恐怕 jacoco 将无法为您提供覆盖,因为 jacoco 仅在运行的 JVM 上检测字节码。所以你必须在这里“有创意”:)

我将在这里列出一些可能的方法 免责声明:虽然我没有尝试过(不适用于 jboss/java ee),但也许你至少可以借用一些想法

第一种方法是以某种方式与应用程序一起运行测试,例如在 spring 测试中所做的(我不确定 JBoss 是否提供类似的功能)。

这个想法很简单:

  • 您运行集成测试,它运行“嵌入在同一个 jvm 中”的 jboss,您可以将 bean / EJB 会话 bean 注入测试(如使用 spring 自动装配)。

这种方法的优点是您可以只使用 jacoco maven 插件,它会为您检测一切

我不知道在技术上实现这个架构有多容易,我知道最近的 jboss 版本支持嵌入式模式,所以也许你会发现这个链接是一个有用的基础

另一个方向是看一下Arquillian项目。他们有一些可能会有所帮助的 jacoco 扩展,但我从未尝试过。

我能想到的最后一种方法是直接使用 jacoco 代理运行 jboss 服务器,而不是依赖为您运行 jacoco 的构建系统。

这里的想法是将覆盖的服务器代码的结果流式传输到某个文件/ tcp 端点。因此,您使用 jboss 运行-javaagent:[yourpath/]jacocoagent.jar它,它会在您需要流式传输的任何地方开始流式传输结果。测试后,您应该收集这些结果并准备一份报告。您可以在此处找到有关此方法的更多信息


推荐阅读