目录
一、背景
在统计后端代码覆盖率时,一般都使用的是Jacoco,但是Jacoco本身并不支持增量统计,当有一个新需求出现时,经过一轮轮的测试,并不能直观的从全量覆盖率中找出我们想要的那部分统计率。
二、增量统计思路
(不想看思路的,直接拉到最后)
首先我们要想清楚几个问题:
1:什么叫增量?
2:怎么获取增量文件?
3:怎么找出增量文件中修改的部分?
4:怎么让Jacoco只统计这部分代码的覆盖率?
以下我们就来分析这4个问题:
什么叫增量?
当前发布的版本中后端修改的class文件或者是新增的class文件即是增量文件。
怎么获取增量文件?怎么找出增量文件中修改的部分?
每次Git提交的时候都是有记录的,我们可以从git下手找出我们想要的。
1:先用log找到提交的版本号
2:根据版本号去获取2次版本直接的差异文件
git diff beab05eab0499458734e9c6c1d340ef06de677df 35aa4ac5fb0497a96f9d4c4d4b6a2a70323a3082
得到的结果如下:
diff --git a/src/main/java/com/dxy/platform/jacoco/JacocoOrders.java b/src/main/java/com/dxy/platform/jacoco/JacocoOrders.java
index 3c52f59..1911441 100644
--- a/src/main/java/com/dxy/platform/jacoco/JacocoOrders.java
+++ b/src/main/java/com/dxy/platform/jacoco/JacocoOrders.java
@@ -43,4 +43,16 @@
class JacocoOrders {
p.destroy();
return success;
}
+
+ public static void main(String[] args) {
+
+ try {
+ JacocoOrders jacocoOrders = new JacocoOrders();
+ boolean fail =
+ jacocoOrders.exec("mvn clean package -f /Users/xx/IdeaProjects/testworks/logcollector".split(" "));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
}
diff --git a/src/main/java/com/dxy/platform/utils/CaseRun.java b/src/main/java/com/dxy/platform/utils/CaseRun.java
index 146c6a9..830425a 100644
--- a/src/main/java/com/dxy/platform/utils/CaseRun.java
+++ b/src/main/java/com/dxy/platform/utils/CaseRun.java
@@ -250,7 +250,7 @@
public class CaseRun {
compareInfo.setHopeData(caseInfo.getHopeValue());
compareInfo.setHeader(caseInfo.getHeaderValue());
- if (infos == null || EmptyUtil.isEmpty(caseInfo.getHopeValue())) {
+ if (infos == null) {
compareInfo.setErrorMessage(errorInfo);
} else {
// code 是否是200 不是直接返回;是200 对比数据
diff --git a/src/main/java/com/dxy/platform/utils/GroupsRun.java b/src/main/java/com/dxy/platform/utils/GroupsRun.java
index 60a25b9..f219c16 100644
:
diff --git a/src/main/java/com/dxy/platform/jacoco/JacocoOrders.java b/src/main/java/com/dxy/platform/jacoco/JacocoOrders.java
index 3c52f59..1911441 100644
--- a/src/main/java/com/dxy/platform/jacoco/JacocoOrders.java
+++ b/src/main/java/com/dxy/platform/jacoco/JacocoOrders.java
@@ -43,4 +43,16 @@
class JacocoOrders {
p.destroy();
return success;
}
+
+ public static void main(String[] args) {
+
+ try {
+ JacocoOrders jacocoOrders = new JacocoOrders();
+ boolean fail =
+ jacocoOrders.exec("mvn clean package -f /Users/xx/IdeaProjects/testworks/logcollector".split(" "));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
}
分析这些差异(这里只是简单的讲解一下,详细的讲解可以百度):
diff --git :
表示是有修改的差异文件,
a/ 修改前的文件,b/修改后的文件
--- a/ :表示改动前的文件
+++ b/:表示改动后的文件
@@ -43,4 +43,16 @@:
@@之间的表示修改的地方
-43,4:表示修改前的文件是从第43行开始,连续修改到后面4行
+43,16 表示修改后的文件是从第43行开始,连续修改到后面16行
现在我们知道了哪些是修改的文件且修改的地方我们也知道怎么找出来了。
怎么让Jacoco只统计这部分代码的覆盖率?
这里使用的是ant build.xml形式去配置的,只需要在统计代码的时候,使用<include></include>标签,告诉Jacoco我只想统计这些文件即可。
(这里省去了Jacoco 服务器环境的搭建,百度一搜全是)
三、如何使用增量插件
下载插件: incremental.jar
链接:https://pan.baidu.com/s/1Wv0IFwNCbBxoHdNPP9R3vg 密码:gudd
创建一个yml文件,配置内容如下:
jacoco:
path:
source: #必填 拉取代码存放路径
report: #必填 存放报告路径
git:
url: #必填 仅支持https
user: #必填
pswd: #必填
branch: # 默认master
source: "/api/src/main/java,/service/src/main/java" # 源码路径,多模块的话用,分隔 默认src/main/java/
classes: "/api/target/dist/classes,/service/target/classes" # 编译后路面 多模块的话用,分隔 默认 target/classes/
v1: # v1,v2不填写默认比较最新2个版本 新版本号
v2: # 旧版本号
include: "**/test.class,**/test2.class,**/tst/test3.class" #包含类
exclude: #排除类
server:
ip: #必填
port: #必填
使用命令:java -jar incremental.jar -f [你的yml配置文件路径]
【
写这个插件用的时间比较少,很多细节没处理好,
】