使用jacoco+git生成差异代码覆盖率测试报告并在平台展示


前言

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.
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值