文章目录
前言
jacoco是一个针对java可生成java测试代码覆盖率的开源项目,源项目未和git结合做提交差异对比,无意中在github上看到一个项目,将git和jacoco结合可以做分支差异对比,或者commit差异对比。针对代码修改的部分生成代码测覆盖率,可以很方便的对比此次功能发布,有哪些代码未覆盖到。因此基于次开源项目做了平台化集成。方便测试人员直接在平台提交任务后就能直接生成代码覆盖率
一、jacoco是什么?
相信你能看到此文章大概也知道jacoco是什么了,在此就不再赘述了(从网上复制),贴一下github上面基于git对比的源码项目地址吧:github地址。平台实现大概架构
源码地址:https://github.com/serverMockProxy/jacocoReportTools
二、前端页面
三、jacoco源码修改
1.PreMain
代码如下(示例):
/**
* This method is called by the JVM to initialize Java agents.
*
* @param options
* agent options
* @param inst
* instrumentation callback provided by the JVM
* @throws Exception
* in case initialization fails
*/
public static void premain(final String options, final Instrumentation inst)
throws Exception {
final AgentOptions agentOptions = new AgentOptions(options);
final Agent agent = Agent.getInstance(agentOptions);
final IRuntime runtime = createRuntime(inst);
runtime.startup(agent.getData());
inst.addTransformer(new CoverageTransformer(runtime, agentOptions,
IExceptionLogger.SYSTEM_ERR));
//添加15分钟向服务器上报exec文件逻辑
if (null !=agentOptions.getServerHost() && null != agentOptions.getProjectName()){
Thread thread = new Thread(()->{
while (true) {
sendExecFile(agentOptions.getServerHost(),agentOptions.getProjectName());
try {
Thread.sleep(1000*60*15);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
}
}
private static void sendExecFile(String serverHost,String projectName) {
try {
byte[] bytes = RT.getAgent()
.getExecutionData(true);
given().multiPart("file","myfile.exec",bytes)
.expect()
.when()
.post(serverHost+"/upload/file/"+projectName+"/5");
}catch (Exception e){
System.out.println(e.getMessage());
}
}
四、server端主要代码
1.GitlabServer主要请求gitlab接口,根据gitlab项目id获取项目信息
代码如下(示例):
package com.apiProxy.server;
import com.apiProxy.App;
import com.apiProxy.model.GitlabProject;
import com.apiProxy.model.vo.GitlabBranchesVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.util.List;
/**
* @Author:何明
* @Date:6/23/21 7:55 下午
*/
@Component
@Slf4j
public class GitlabServer {
@Autowired
private RestTemplate restTemplate;
private static GitlabServer INSTANCE;
//获取项目详情接口地址
@Value("${gitHost}api/v4/projects/{projectId}")
private String projectUrl;
//获取commit号接口地址
@Value("${gitHost}api/v4/projects/{projectId}/repository/commits?ref_name={branch}")
private String commitsUrl;
@Value("${gitHost}api/v4/projects/{projectId}/repository/branches")
private String branchUrl;
@Value("${gitToken}")
private String gitToken;
public static GitlabServer getInstance() {
if (INSTANCE == null) {
INSTANCE = App.getBean(GitlabServer.class);
}
return INSTANCE;
}
public GitlabProject getProjectById(Integer gitlabProjectId) {
GitlabProject gitlabProject = restTemplate.exchange(projectUrl,
HttpMethod.GET,
getEntity(),
new ParameterizedTypeReference<GitlabProject>() {
},
gitlabProjectId).getBody();
return gitlabProject;
}
public List<GitlabBranchesVo> getBranches(Integer gitlabProjectId){
List<GitlabBranchesVo> gitlabBranchesVos = restTemplate.exchange(branchUrl,
HttpMethod.GET,
getEntity(),
new ParameterizedTypeReference<List<GitlabBranchesVo>>() {
},
gitlabProjectId).getBody();
return gitlabBranchesVos;
}
public List<GitlabBranchesVo> getCommits(Integer gitlabProjectId,String branch){
List<GitlabBranchesVo> gitlabBranchesVos = restTemplate.exchange(commitsUrl,
HttpMethod.GET,
getEntity(),
new ParameterizedTypeReference<List<GitlabBranchesVo>>() {
},
gitlabProjectId,branch).getBody();
return gitlabBranchesVos;
}
private HttpEntity getEntity(){
HttpHeaders headers = new HttpHeaders();
headers.add("PRIVATE-TOKEN",gitToken);
return new HttpEntity<>(null, headers);
}
}
2.GitlabProject gitlab返回参数实体类
代码如下(示例):
package com.apiProxy.model;
import lombok.Data;
/**
* @Author:何明
* @Date:6/23/21 8:39 下午
*/
@Data
public class GitlabProject {
private Integer id;
private String name;
private String ssh_url_to_repo;
private String http_url_to_repo;
private String web_url;
private String path_with_namespace;
}
3.JacocoController 提供接口给前端调用
代码如下(示例):
package com.apiProxy.controller;
import com.apiProxy.mbg.po.Jacoco;
import com.apiProxy.mbg.po.ProxyConfig;
import com.apiProxy.model.PageRequest;
import com.apiProxy.model.PagedData;
import com.apiProxy.model.Response;
import com.apiProxy.model.vo.