平台网站建设公司,中职网站建设与维护试卷,网页前端设计包括哪些内容,百家号权重查询目录 一、介绍 二、自己在本地搭建Super-jacoco服务
2.1 准备工作
2.2 部署super jacoco服务
1、下载super jacoco 项目
2、初始化数据库
3、配置application.properties
4、编译super jacoco项目
5、部署 super jacoco 服务
2.3 启动被测项目
2.4、代码覆盖率收集
2…目录 一、介绍 二、自己在本地搭建Super-jacoco服务
2.1 准备工作
2.2 部署super jacoco服务
1、下载super jacoco 项目
2、初始化数据库
3、配置application.properties
4、编译super jacoco项目
5、部署 super jacoco 服务
2.3 启动被测项目
2.4、代码覆盖率收集
2.4.1 启动代码覆盖率收集
2.4.2 获取代码覆盖率
三、公司项目级docker容器化项目Super-jacoco应用
3.1 镜像准备
3.2 部署项目
3.3 测试同学部署Super-jacoco服务
3.3.1 、数据库准备用于存储报告信息等。
3.3.2 配置Super-jacoco服务application.properties信息 3.3.3、编译super jacoco项目
3.3.4、部署 super jacoco 服务 3.4、代码覆盖率收集
3.4.1 启动代码覆盖率收集
3.4.2 获取代码覆盖率
四、报错处理 4.1 errMsg: 统计失败:编译代码出错
五、Super-jacoco原理
5.1 整体流程
5.2 获取增量代码
5.3. jacoco 二次改造支持增量方法列表参数
5.4. 执行
5.5. 报告输出
编辑
5.6、架构 六、相关资料 一、介绍
Super-jacoco 在jacoco 上发展而来可以统计增量代码覆盖率的统计。
jacoco 相关说明jacoco代码覆盖率_jacoco覆盖率_做测试的喵酱的博客-CSDN博客
本文介绍 Super-jacoco 统计手工用例代码覆盖率的统计数据。
主要分两部分
一、自己在本地搭建Super-jacoco自己玩一玩
二、在公司的容器化项目中如何使用Super-jacoco统计手工用例的代码覆盖率 GitHub项目地址
GitHub - didi/super-jacoco
GitHub - didi/super-jacoco
尽量使用git命令直接下载
git clone https://github.com/didi/super-jacoco.git二、自己在本地搭建Super-jacoco服务
2.1 准备工作
准备gitlab用户准备一个MySQL数据库5.x或者8.x版本
2.2 部署super jacoco服务
1、下载super jacoco 项目
GitHub - didi/super-jacoco
2、初始化数据库
在super jacoco 项目中sql/coverage_report.sql 文件用于初始化数据库。
CREATE DATABASE super-jacoco DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
CREATE TABLE diff_coverage_report (id int(10) NOT NULL AUTO_INCREMENT,job_record_uuid varchar(80) NOT NULL COMMENT 请求唯一标识码,request_status int(10) NOT NULL COMMENT 请求执行状态,1下载代码成功,2生成diffmethod成功3生成报告成功,-1执行出错,giturl varchar(80) NOT NULL COMMENT git 地址,now_version varchar(80) NOT NULL COMMENT 本次提交的commidId,base_version varchar(80) NOT NULL COMMENT 比较的基准commitId,diffmethod mediumtext COMMENT 增量代码的diff方法集合,type int(11) NOT NULL DEFAULT 0 COMMENT 2增量代码覆盖率,1全量覆盖率,report_url varchar(300) NOT NULL DEFAULT COMMENT 覆盖率报告url,line_coverage double(5,2) NOT NULL DEFAULT -1.00 COMMENT 行覆盖率,branch_coverage double(5,2) NOT NULL DEFAULT -1.00 COMMENT 分支覆盖率,err_msg varchar(1000) NOT NULL DEFAULT COMMENT 错误信息,create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 修改时间,sub_module varchar(255) NOT NULL DEFAULT COMMENT 子项目目录名称,from int(10) NOT NULL DEFAULT 0 COMMENT 1单元测试2环境部署1单元测试2hu,now_local_path varchar(500) NOT NULL DEFAULT ,base_local_path varchar(500) NOT NULL DEFAULT ,log_file varchar(255) NOT NULL DEFAULT ,PRIMARY KEY (job_record_uuid),KEY id (id)
) ENGINEInnoDB AUTO_INCREMENT0 DEFAULT CHARSETutf8 COMMENT增量代码覆盖率;CREATE TABLE diff_deploy_info (id int(10) NOT NULL AUTO_INCREMENT,job_record_uuid varchar(80) NOT NULL COMMENT 请求唯一标识码,address varchar(15) NOT NULL COMMENT HOST,port int(10) NOT NULL COMMENT 端口,code_path varchar(1000) NOT NULL DEFAULT COMMENT nowVersion代码目录,child_modules varchar(1000) NOT NULL DEFAULT COMMENT 项目子模块名称,PRIMARY KEY (job_record_uuid),KEY id (id)
) ENGINEInnoDB AUTO_INCREMENT0 DEFAULT CHARSETutf8 COMMENT服务部署地址;
3、配置application.properties
在下载下来的项目中application.properties配置信息
src/main/resources/application.properties
# 以下信息需要手动配置
spring.datasource.urljdbc:mysql://127.0.0.1:3306/super-jacoco?useUnicodetruecharacterEncodingUTF-8zeroDateTimeBehaviorconvertToNullallowMultiQueriestrueserverTimezoneAsia/ShanghaiuseSSLfalse
spring.datasource.usernameroot
spring.datasource.password123456
#git username password
gitlab.usernamemiaojiang
gitlab.passwordmj123456
主要配置
数据库的连接信息url 账号 密码
gitlab 的账号、密码 注意
数据库的驱动配置5.x与8.x 版本的MySQL驱动是不一致的根据自己的数据库配置。 如果你的数据库为MySQL 8.x需要修改项目中的驱动。
1、修改pom.xml文件
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.didichuxing.chefuqa/groupIdartifactIdsuper-jacoco/artifactIdpackagingjar/packagingversion1.0-SNAPSHOT/versionnamesuper-jacoco/namedescriptionproject for Spring cloud eureka client/descriptionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.0.2.RELEASE/versionrelativePath/ !-- lookup parent from repository --/parentpropertiesentity.target.dirsrc/main/java//entity.target.dirdao.resources.dirsrc/main/resources//dao.resources.dirproject.build.sourceEncodingUTF-8/project.build.sourceEncodingjava.version1.8/java.versionspring-cloud.versionFinchley.RELEASE/spring-cloud.versionmybatis-spring-boot1.2.0/mybatis-spring-bootmysql-connector8.0.26/mysql-connectorJAVA_HOME/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/JAVA_HOME/propertiesdependenciesdependencygroupIdorg.jodd/groupIdartifactIdjodd-core/artifactIdversion5.1.6/version/dependencydependencygroupIddom4j/groupIdartifactIddom4j/artifactIdversion1.6.1/version/dependencydependencygroupIdorg.jacoco/groupIdartifactIdorg.jacoco.core/artifactIdversion0.8.4/version/dependencydependencygroupIdorg.ow2.asm/groupIdartifactIdasm/artifactIdversion7.1/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-context-support/artifactIdversion5.1.4.RELEASE/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion${mybatis-spring-boot}/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.16.16/version/dependency!-- MySQL 连接驱动依赖 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion${mysql-connector}/version/dependencydependencygroupIdcommons-lang/groupIdartifactIdcommons-lang/artifactIdversion2.6/version/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactIdversion2.5.0/version/dependencydependencygroupIdorg.codehaus.jackson/groupIdartifactIdjackson-mapper-asl/artifactIdversion1.9.13/version/dependencydependencygroupIdorg.codehaus.jackson/groupIdartifactIdjackson-core-asl/artifactIdversion1.9.13/version/dependencydependencygroupIdcom.google.guava/groupIdartifactIdguava/artifactIdversion15.0/version/dependencydependencygroupIdnet.sf.json-lib/groupIdartifactIdjson-lib/artifactIdversion2.4/versionclassifierjdk15/classifier/dependencydependencygroupIdcom.jayway.jsonpath/groupIdartifactIdjson-path/artifactIdversion2.2.0/version/dependencydependencygroupIdorg.sharegov/groupIdartifactIdmjson/artifactIdversion1.4.1/version/dependencydependencygroupIdjoda-time/groupIdartifactIdjoda-time/artifactIdversion2.3/version/dependency!-- pinyin--dependencygroupIdcom.belerweb/groupIdartifactIdpinyin4j/artifactIdversion2.5.1/version/dependencydependencygroupIdorg.jdom/groupIdartifactIdjdom2/artifactIdversion2.0.6/version/dependency!-- ssh的依赖 --dependencygroupIdch.ethz.ganymed/groupIdartifactIdganymed-ssh2/artifactIdversionbuild210/version/dependencydependencygroupIdorg.tmatesoft.svnkit/groupIdartifactIdsvnkit/artifactIdversion1.8.7/version/dependencydependencygroupIdorg.apache.httpcomponents/groupIdartifactIdhttpclient/artifactIdversion4.5.5/version/dependencydependencygroupIdorg.apache.httpcomponents/groupIdartifactIdhttpmime/artifactIdversion4.2.3/version/dependencydependencygroupIdio.rest-assured/groupIdartifactIdrest-assured/artifactIdversion3.1.1/version/dependencydependencygroupIdorg.eclipse.jgit/groupIdartifactIdorg.eclipse.jgit/artifactIdversion4.9.0.201710071750-r/version/dependencydependencygroupIdcom.github.javaparser/groupIdartifactIdjavaparser-core/artifactIdversion3.4.4/version/dependency!-- Swagger2核心包 --dependencygroupIdio.springfox/groupIdartifactIdspringfox-swagger2/artifactIdversion2.7.0/version/dependencydependencygroupIdio.springfox/groupIdartifactIdspringfox-swagger-ui/artifactIdversion2.7.0/version/dependencydependency!-- jsoup HTML parser library http://jsoup.org/ --groupIdorg.jsoup/groupIdartifactIdjsoup/artifactIdversion1.10.2/version/dependencydependencygroupIdtk.mybatis/groupIdartifactIdmapper-spring-boot-starter/artifactIdversion2.0.2/version/dependency/dependenciesdependencyManagementdependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring-cloud.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementbuildfinalNamesuper-jacoco/finalNamepluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/pluginplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdconfigurationsource1.8/sourcetarget1.8/targetcompilerArgumentsbootclasspath${java.home}/lib/rt.jar:${java.home}/lib/jce.jar/bootclasspath/compilerArguments/configuration/pluginplugingroupIdorg.mybatis.generator/groupIdartifactIdmybatis-generator-maven-plugin/artifactIdversion1.3.7/versionconfigurationverbosetrue/verboseoverwritetrue/overwriteconfigurationFile${basedir}/src/main/resources/tk-mybatis-autogen.xml/configurationFile!--允许移动生成的文件 --verbosetrue/verboseoverwritetrue/overwrite/configurationdependenciesdependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.26/version/dependencydependencygroupIdtk.mybatis/groupIdartifactIdmapper/artifactIdversion4.1.5/version/dependency/dependencies/plugin/plugins/build
/project
2、application.properties修改数据库配置驱动 下面这个是8.x MySQL的驱动
spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver 4、编译super jacoco项目
修改完super jacoco项目中的配置文件就可以编译该项目了。生成super jacoco.jar
5、部署 super jacoco 服务 启动super-jacoco.jar 服务
执行命令
nohup java -jar super-jacoco.jar
默认端口为8899 可以8899端口程序是否启动成功
lsof -i:8899
注意
在部署 super jacoco 服务的机器上一定要有以下环境
1、有mvn环境如果没有的话需要配置
2、有git环境并配置了能拉取被测项目的gitlab账号和密码。
可以自己在这台机器上手动试一下是否有权限
git clone xxx.xxx.git 相关资料
Mac下安装Mavenidea配置maven_做测试的喵酱的博客-CSDN博客
maclinux配置环境变量详解_vim ~/.zshrc-CSDN博客 2.3 启动被测项目
1、在super jacoco项目中找到jacoco/org.jacoco.agent-0.8.5-runtime.jar 文件。
将org.jacoco.agent-0.8.5-runtime.jar 文件放在被测服务部署的项目上。
如放置路径为/usr/local/org.jacoco.agent-0.8.5-runtime.jar
被测项目为 mock-server.jar
启动被测项目
nohup java -javaagent:/usr/local/org.jacoco.agent-0.8.5-runtime.jarincludes*,outputtcpserver,port18513,address*,appendtrue -jar mock-server.jar /dev/null 21
命令解释 nohup忽略挂起信号允许命令在后台运行。 java启动 Java 虚拟机。 -javaagent:/usr/local/org.jacoco.agent-0.8.5-runtime.jarincludes*,outputtcpserver,port18513,address*,appendtrue配置 JaCoCo 代码覆盖率工具代理其中 /usr/local/org.jacoco.agent-0.8.5-runtime.jar指定 JaCoCo 代理 Jar 文件的路径。 includes*指定要包括在覆盖率报告中的类的匹配模式。此处将所有类都包括在内。 outputtcpserver指定覆盖率信息的输出模式。此处使用 TCP 服务器模式。 port18513指定 TCP 服务器的端口号。 address*指定 TCP 服务器的地址。此处使用星号 * 表示接受所有来自任何地址的连接。 appendtrue指定是否将新的覆盖率数据附加到现有数据文件中。此处附加新的数据以保留历史数据。 -jar mock-server.jar指定要运行的 Jar 文件即 MockServer 的可执行 Jar 文件。 /dev/null将标准输出重定向到 /dev/null即不输出任何信息。 21将标准错误输出重定向到标准输出。 将进程置于后台运行。 注意
port18513 端口是在被测试的服务所在服务器上18513端口上启一个jacoco监听的服务一定要保证部署被测项目的机器放开了18513 端口且我们有权限访问18513 端口。 启动被测项目后我们可以查看18513 端口的服务是否启动成功
lsof -i:18513 2.4、代码覆盖率收集
假如
super jacoco 服务部署在了 123.123.123.123 这台服务上了
被测项目mock-server 部署在了 456.456.456.456 机器上了
2.4.1 启动代码覆盖率收集
1)启动覆盖率收集URL
http://123.123.123.123 /cov/triggerEnvCov
调用方法POST参数body方式传入
{uuid: uuid,type: 1,gitUrl: gitgit,subModule: ,baseVersion: master,nowVersion: masteraddress: 456.456.456.456,port: 18513
}
备注
IP和port为被测服务所在服务器的IP和端口
uuid 自定义的一个id将来拉取覆盖率时通过这个uuid来拉取
gitUrl 被测项目的gitlab地址 返回
{code: 200,data: true,msg: msg
}
2.4.2 获取代码覆盖率
覆盖率结果URL
http://123.123.123.123/cov/getEnvCoverResult
调用方法
GET
参数
uuid(String)
返回
{code: 200,data: {coverStatus: 1,errMsg: msg,lineCoverage: 100.0,branchCoverage: 100.0,logFile: file content,reportUrl: http://},msg: msg
} 三、公司项目级docker容器化项目Super-jacoco应用
前提
需要运维、网络、研发、测试同学的相互配合。
但是整体流程其实和上面是一致的。
下载Super-jacoco 项目
git clone https://github.com/didi/super-jacoco.git
然后取出Super-jacoco 项目 中的 jacoco/org.jacoco.agent-0.8.5-runtime.jar 文件与sql/coverage_report.sql文件。
3.1 镜像准备
本部分公司主要是由运维同学负责。
举例
依然是部署mock-server服务。
之前的流程
运维: 准备 Dockerfile文件---生成镜像
部署被测项目拉取镜像拉取被测项目的代码进行编译生成jar包。在容器中启动该项目
应用jacoco流程
运维: 先把jacoco agent 的jar包打 放到某一个公共服务器的位置 然后编写 Dockerfile文件在里面写拉jacoco agent jar包的命令。 最后再通过这个Dockerfile文件生成的image镜像
部署被测项目
拉取镜像拉取被测项目的代码进行编译生成jar包。在容器中启动该项目。需要配置JAVA_OPTS的环境变量把java agent信息配置到变量里 -javaagent:/usr/local/org.jacoco.agent-0.8.5-runtime.jarincludes*,outputtcpserver,port18513,address*,appendtrue 服务的启动命令是
java $JAVA_OPTS -jar xxx.jar
这样就拼接成了完整的运行命令
java -javaagent:/usr/local/org.jacoco.agent-0.8.5-runtime.jarincludes*,outputtcpserver,port18513,address*,appendtrue -jar mock-server.jar 运维同学要注意
要放开18513 这个端口如果要对该端口做代理的话
jacoco并非http/https如果测试环境的k8s集群里面访问形式为ingresssvc的形式ingress配置域名svc配置ClusterIP的模式。但是这个ingress只能代理http/https两种协议的请求。这种代理模式是不通的。需要把svc的ClusterIP改为了NodePort的模式就可以直接通过公共节点PORT进行访问了。 3.2 部署项目
负责部署项目的同学 测试/研发在自己公司的部署平台上选择上面创建好的镜像配置部署项目的命令。
3.3 测试同学部署Super-jacoco服务
3.3.1 、数据库准备用于存储报告信息等。
安装MySQL。
使用sql/coverage_report.sql 初始化MySQL信息
3.3.2 配置Super-jacoco服务application.properties信息
在下载下来的项目中application.properties配置信息
src/main/resources/application.properties
# 以下信息需要手动配置
spring.datasource.urljdbc:mysql://127.0.0.1:3306/super-jacoco?useUnicodetruecharacterEncodingUTF-8zeroDateTimeBehaviorconvertToNullallowMultiQueriestrueserverTimezoneAsia/ShanghaiuseSSLfalse
spring.datasource.usernameroot
spring.datasource.password123456
#git username password
gitlab.usernamemiaojiang
gitlab.passwordmj123456
主要配置
数据库的连接信息url 账号 密码
gitlab 的账号、密码 注意
数据库的驱动配置5.x与8.x 版本的MySQL驱动是不一致的根据自己的数据库配置。 如果你的数据库为MySQL 8.x需要修改项目中的驱动具体修改方式在第二章有写上面翻一番 3.3.3、编译super jacoco项目
修改完super jacoco项目中的配置文件就可以编译该项目了。生成super jacoco.jar
3.3.4、部署 super jacoco 服务 启动super-jacoco.jar 服务
执行命令
nohup java -jar super-jacoco.jar
默认端口为8899 可以8899端口程序是否启动成功
lsof -i:8899
注意
在部署 super jacoco 服务的机器上一定要有以下环境
1、有mvn环境如果没有的话需要配置
2、有git环境并配置了能拉取被测项目的gitlab账号和密码。
可以自己在这台机器上手动试一下是否有权限
git clone xxx.xxx.git
3、启动super jacoco 服务的机器一定要有访问被测服务器18513端口的权限。
公司中对服务器权限、端口权限控制的比较严可能需要走工单进行申请这个需要注意。 3.4、代码覆盖率收集
假如
super jacoco 服务部署在了 123.123.123.123 这台服务上了
被测项目mock-server 部署在了 456.456.456.456 机器上了
3.4.1 启动代码覆盖率收集
1)启动覆盖率收集URL
http://123.123.123.123 /cov/triggerEnvCov
调用方法POST参数body方式传入
{uuid: uuid,type: 1,gitUrl: gitgit,subModule: ,baseVersion: master,nowVersion: masteraddress: 456.456.456.456,port: 18513
}
备注
IP和port为被测服务所在服务器的IP和端口
uuid 自定义的一个id将来拉取覆盖率时通过这个uuid来拉取
gitUrl 被测项目的gitlab地址 返回
{code: 200,data: true,msg: msg
}
3.4.2 获取代码覆盖率
覆盖率结果URL
http://123.123.123.123/cov/getEnvCoverResult
调用方法
GET
参数
uuid(String)
返回
{code: 200,data: {coverStatus: 1,errMsg: msg,lineCoverage: 100.0,branchCoverage: 100.0,logFile: file content,reportUrl: http://},msg: msg
}
四、报错处理 4.1 errMsg: 统计失败:编译代码出错
背景
拉取报告时 提示 统计失败:编译代码出错 原因
查看启动super jacoco 服务的日志
2023-10-12 17:01:14,642 INFO (CodeCloneExecutor.java:45)- uuid miaojiang开始下载代码...
2023-10-12 17:01:16,316 INFO (CodeCloneExecutor.java:52)- uuid miaojiang完成下载代码...
2023-10-12 17:01:16,322 DEBUG (BaseJdbcLogger.java:181)- Preparing: UPDATE diff_coverage_report SET request_status?, err_msg?, line_coverage?, branch_coverage?, report_url?, diffmethod?, log_file?, now_local_path?, update_timeNOW() WHERE job_record_uuid?
2023-10-12 17:01:16,323 DEBUG (BaseJdbcLogger.java:181)- Parameters: 102(Integer), (String), -1.0(Double), -1.0(Double), (String), (String), http://127.0.0.1:8899/logs/miaojiang.log(String), /Users/zhaohui/app/super_jacoco/clonecode/miaojiang/master(String), miaojiang(String)
2023-10-12 17:01:16,327 DEBUG (BaseJdbcLogger.java:181)- Updates: 1
2023-10-12 17:01:16,328 DEBUG (BaseJdbcLogger.java:181)- Preparing: UPDATE diff_coverage_report SET request_status?, err_msg?, line_coverage?, branch_coverage?, report_url?, diffmethod?, log_file?, now_local_path?, update_timeNOW() WHERE job_record_uuid?
2023-10-12 17:01:16,329 DEBUG (BaseJdbcLogger.java:181)- Parameters: 3(Integer), (String), -1.0(Double), -1.0(Double), (String), (String), http://127.0.0.1:8899/logs/miaojiang.log(String), /Users/zhaohui/app/super_jacoco/clonecode/miaojiang/master(String), miaojiang(String)
2023-10-12 17:01:16,331 DEBUG (BaseJdbcLogger.java:181)- Updates: 1
IP:127.0.0.1
2023-10-12 17:01:16,335 INFO (CmdExecutor.java:43)- CmdThreadPool:java.util.concurrent.ThreadPoolExecutor4b5dade5[Running, pool size 0, active threads 0, queued tasks 0, completed tasks 0]
2023-10-12 17:01:16,335 INFO (CmdExecutor.java:48)- executeCmd : bash -c cd /Users/zhaohui/app/super_jacoco/clonecode/miaojiang/mastermvn clean compile /Users/zhaohui/report/logs/miaojiang.log
2023-10-12 17:01:16,346 INFO (CmdExecutor.java:101)- bash: mvn: command not found
2023-10-12 17:01:16,347 INFO (CmdExecutor.java:56)- readLine.stop();
2023-10-12 17:01:16,347 INFO (CmdExecutor.java:58)- progressBar.stop();
2023-10-12 17:01:16,348 INFO (CmdExecutor.java:59)- executeCmd done !!!!!!
2023-10-12 17:01:16,348 INFO (CmdExecutor.java:60)- worker done !!!!!! times 0s
2023-10-12 17:01:16,349 DEBUG (BaseJdbcLogger.java:181)- Preparing: UPDATE diff_coverage_report SET request_status?, err_msg?, line_coverage?, branch_coverage?, report_url?, diffmethod?, log_file?, now_local_path?, update_timeNOW() WHERE job_record_uuid?
2023-10-12 17:01:16,350 DEBUG (BaseJdbcLogger.java:181)- Parameters: 203(Integer), 编译代码出错(String), -1.0(Double), -1.0(Double), (String), (String), http://127.0.0.1:8899/logs/miaojiang.log(String), /Users/zhaohui/app/super_jacoco/clonecode/miaojiang/master(String), miaojiang(String)
2023-10-12 17:01:16,352 DEBUG (BaseJdbcLogger.java:181)- Updates: 1
2023-10-12 17:01:16,352 INFO (CodeCovServiceImpl.java:252)- Thread-4计算覆盖率具体步骤...编译失败uuidmiaojiang
2023-10-12 17:01:16,353 INFO (CodeCovServiceImpl.java:309)- Thread-4计算覆盖率具体步骤...编译失败uuidmiaojiang
2023-10-12 17:01:19,981 DEBUG (BaseJdbcLogger.java:181)- Preparing: SELECT * from diff_coverage_report WHERE request_status? AND from? ORDER BY update_time asc limit ?
2023-10-12 17:01:19,987 DEBUG (BaseJdbcLogger.java:181)- Parameters: 0(Integer), 1(Integer), 1(Integer)
根据日志信息可以看出发生了以下事件
17:01:14 - miaojiang开始下载代码。 17:01:16 - miaojiang完成下载代码。 17:01:16 - 执行数据库更新操作更新了diff_coverage_report表的一行数据。 17:01:16 - 执行数据库更新操作再次更新了diff_coverage_report表的一行数据。 17:01:16 - 从IP地址为127.0.0.1的主机上执行命令cd /Users/zhaohui/app/super_jacoco/clonecode/miaojiang/mastermvn clean compile /Users/zhaohui/report/logs/miaojiang.log但是出现了错误bash: mvn: command not found。 17:01:16 - 终止读取日志和进度条。 17:01:16 - 执行命令结束执行时间为0秒。 17:01:16 - 再次执行数据库更新操作更新了diff_coverage_report表的一行数据将request_status设为203err_msg设为编译代码出错。 17:01:16 - Thread-4处理计算覆盖率的具体步骤时发生编译失败uuid为miaojiang。 17:01:19 - 执行数据库查询操作从diff_coverage_report表中选取request_status为0from为1的记录并按update_time升序排列限制返回结果数量为1个。 注意
bash: mvn: command not found。
说明 127.0.0.1 服务上没有配置mvn环境 解决办法
在127.0.0.1 机器上配置mvn环境 五、Super-jacoco原理
5.1 整体流程 为了支持增量覆盖率收集我们需要做两件事情**1**获取不同版本代码diff文件**2**对jacoco进行二次开发使其支持增量方法列表参数。
5.2 获取增量代码
主要流程拉取master参照分支和feature(提测分支)代码再通过JGit对两个分支源码进行比对获取增量代码。以下为部分代码片段 5.3. jacoco 二次改造支持增量方法列表参数
JaCoCo 对 exec 的解析主要是在 Analyzer 类的 analyzeClass(final byte[] source) 方法。这里面会调用 createAnalyzingVisitor 方法生成一个用于解析的 ASM 类访问器继续跟代码发现对方法级别的探针计算逻辑是在 ClassProbesAdapter 类的 visitMethod 方法里面。所以我们只需要改造 visitMethod 方法使它只对提取出的每个类的新增或变更方法做解析非指定类和方法不做处理。改造后的核心代码片段如下 5.4. 执行
只需要在执行的mvn命令中加入-Djacoco.diffFile变更方法列表即可收集变更方法的代码覆盖率。如果不传入-Djacoco.diffFile或者Djacoco.diffFile参数为空则默认收集全量覆盖率。
5.5. 报告输出
覆盖率报告如下图在图中是某个 service 的实现类在最新的代码中有23个方法但是只会对变更或新增的5个方法进行覆盖率统计与显示 5.6、架构 六、相关资料 滴滴开源Super-jacocojava代码覆盖率收集平台 - 掘金