java - 从 GitLab-CI 中的 docker 容器中提取测试覆盖率
问题描述
我正在使用 GitLab-CI 并运行借助 Gradle 构建的 java 应用程序。
Docker 容器内运行着一个应用程序。同时,作业自动化运行 ApiTestSuite 测试套件以及 java 应用程序。
问题是:如何在ApiTestSuite套件结束后从正在运行的应用程序中获取测试覆盖率?
这是 GitLab 作业的简化版本:
automation:
stage: validate
tags:
- dind
variables:
PROFILE: some-profile
services:
- docker:stable-dind
- redis:5-alpine
- webcenter/activemq
before_script:
- docker run --detach --name MY_APPLICATION
script:
- ./gradlew ApiTestSuite
我可以在运行单元测试用例时获取代码覆盖率,但在理解如何为上面的示例实现它时遇到一些问题。
先感谢您 :)
解决方案
- 告诉 java 在容器内运行应用程序时使用 JaCoCo 代理
-javaagent:/home/java/jacoco.jar=destfile=folder_inside_contrainer/jacoco-it.exec,append=true
- 配置 Agent 以将结果写入folder_inside_container
replace *folder_inside_contrainer* with the one you will share with the host later on
- 在容器和主机之间共享文件夹folder_inside_container(在本例中为 GitLab 作业)
docker run -d -v gitlab_folder:folder_inside_contrainer
- 通过 JaCoCo-cli.jar 将 .exec 格式的结果导出为 .html 格式
java -jar jacococli.jar report gitlab_folder/jacoco-it.exec --classfiles path_to_app_compiled_classes --html coverage/api-coverage-html
- 从 HTML 中获取覆盖范围并为该作业显示它
api-coverage:
stage: release
script:
- 'apt-get install -y unzip'
- 'curl -L "https://search.maven.org/remotecontent?filepath=org/jacoco/jacoco/0.8.6/jacoco-0.8.6.zip" -o jacoco.zip'
- 'unzip jacoco'
- 'java -jar lib/jacococli.jar report gitlab_folder/jacoco-it.exec --classfiles path_to_app_compiled_classes --html coverage/api-coverage-html'
- grep -oP "Total.*?([0-9]{1,3})%" coverage/api-coverage-html/index.html
coverage: "/Total.*?([0-9]{1,3})%/"
artifacts:
paths:
- coverage/
推荐阅读
- react-native - 添加新组件时 React Native 组件松散排列
- java - Spring:在 Unittest 中回滚事务
- excel - 将 A 列与 B 列和 B 列与 A 列进行比较,并分别复制整行缺失和添加到新工作表
- python - 如果我的函数有两个嵌套的 for 循环,它会以二次时间运行吗?
- flutter - 颤振检查器 devtools 详细信息选项卡 D 是什么意思?
- c++ - C/C++:注释“/*< */”代表什么?
- python - ModuleNotFoundError:没有名为“psutil”的模块
- c# - 使用实体框架存储库模式克隆动态对象
- android - 较低 android 版本上的 CardView 设计问题
- firebase - 是否可以通过 cloud_firestore 使用偏移量和限制?