maven - 运行 jacoco 报告,其中集成测试在一个代码库中,而源代码在另一个代码库中
问题描述
我最近开始为 maven 项目创建 jacoco 报告,包括单元和集成测试,它们似乎工作正常。现在我遇到了一个不同的场景,我不确定如何处理。我有一个由集成测试用例组成的工作区 - 应用程序 A,但源代码不存在于同一个工作区/代码库中。在调用这些集成测试脚本时实际运行的源代码位于不同的工作区/代码库 - 应用程序 B(它们是使用带有 localhost url 的 rest api 调用调用的。jboss 服务器为应用程序 B 启动,因此 localhost 上下文是up)来自集成测试。目的是从应用程序 A 调用这些集成测试,进而调用应用程序 B 中这些测试的源代码,生成应用程序 B 的代码覆盖率的 jacoco 报告。我实际上不确定如何实现这一点。有人可以提供一些输入。
谢谢。
解决方案
如果我理解正确,您的场景中实际上有 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
它,它会在您需要流式传输的任何地方开始流式传输结果。测试后,您应该收集这些结果并准备一份报告。您可以在此处找到有关此方法的更多信息
推荐阅读
- java - 无法在 vscode 中调试 Maven 项目,因为 Maven 插件为空
- c++ - WSASockets 是否能够在不使用管道的情况下获取进程 I/O?
- python - 在 Python 中获取 MySQL 日期时间字段时忽略秒数
- laravel - Laravel 中的会话仅在本地类中可用
- postman - 在 Postman 中使用集合变量
- elasticsearch - 弹性搜索索引模式中的计算字段
- sql - 在 T-SQL 中的顺序行中适当地设置计数器
- java - Android Activity 生命周期:Onstop() 的问题
- c# - jQuery 和 Razor 执行顺序
- html - 如何在 HTML 中使用 div 创建类似表的结构