借助技术手段、通过辅助算法对软件测试过程进行可视化、分析及优化的过程,使得测试过程更加可视化、智能、可信和精准。
测试质量的评估不在完全依靠个人经验和业务熟练度,而是通过精准的数据来判定。在测试资源有限的条件下,将用例精简到更加有针对性,提高测试效率,减少漏测风险。
javaagent
即可。业务部署
env
下虚拟机参数
env:
-
name:
OTHER_VM_OPTIONS
value:
'-javaagent:/jacoco-agent.jar=includes=*,output=tcpserver,address=0.0.0.0,port=28048
super-jacoco服务需要通过agent启动的服务中拉取exec文件
address
指定为0.0.0.0即可,但是port
必须为对外暴漏的端口/home/xxx/org.jacoco.agent-0.8.5runtime.jar
:agent Jar包存放路径port
: 部署服务器的空闲port,用于精准测试服务来拉取exec文件javaagent
启动参数
java -javaagent:/home/xxx/org.jacoco.agent-0.8.5runtime.jar=includes=*,output=tcpserver,address={address},port={port} -jar service.jar
启动覆盖率收集
在用例执行之前,先启动覆盖率收集,获取两个Git Commit点之间的代码差量报告
❝Host为Super Jacoco服务启动的ip和port ❞
Host: http://ip:port
Path: /cov/triggerEnvCov
Method: POST application/json
Body:
{
"uuid": "{随机ID}",
"type": 1,
"gitUrl": "ssh://gitUrl/{your project name}",
"subModule": "",
"baseVersion": "commit id",
"nowVersion": "commit id",
"address": "{address}",
"port": "{port}"
}
Response:
{
"code": 200,
"msg": "success",
"data": null
}
参数说明:
可以把接口配置到PostMan中,调用启动覆盖率收集,之后即可执行测试用例
获取覆盖率报告
在测试用例执行后,通过接口/cov/getEnvCoverResult
获取覆盖率报告
Host: http://ip:port
Path: /cov/getEnvCoverResult
Method: GET
Query:
uuid: {uuid}
Response:
{
"code": 200,
"msg": "success",
"data": {
"coverStatus": 1,
"reportUrl": "http://ip:port/uuid/index.html",
"lineCoverage": 60.3,
"branchCoverage": 50.62,
"errMsg": "",
"logFile": "http://ip:port/logs/uuid.log"
}
}
参数说明:
访问reportUrl
中的地址即可获取覆盖率报告,报告解读:
上图为某项目的报告截图示例,对报告理解作简单介绍:
版本提测后,通过触发【启动覆盖率收集】步骤2中的操作,通过【步骤3】获取覆盖率报告,可以获得本次迭代版本相比上个版本的代码变更范围,为测试同学制定测试方案和测试范围提供参考。同时可以评估研发的自测程度。
测试完成后,通过获取【获取覆盖率报告】步骤3来查看测试覆盖情况,测试同学可以根据代码染色结果来分析本次测试的完成度。同时也可以驱动测试同学加强代码阅读和分析,提升测试深度。
通过PostMan测试集合执行回归用例,除了可以查看测试集合的用例执行结果外,还可以通过覆盖率报告进行分析。
Super-Jacoco的git地址是否支持ssh?
支持,application.properties
中的gitlab.username
和gitlab.password
配置为空值时使用默认的SSH值。你也可以修改super-jacoco中com.xiaoju.basetech.util.GitHandler
的源码来指定SSH配置,示例代码如下:
private String private_key = "/Users/wang/.ssh/y";
SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host host, Session session) {
session.setConfig("StrictHostKeyChecking", "no");
}
@Override
protected JSch createDefaultJSch(FS fs) throws JSchException {
JSch sch = super.createDefaultJSch(fs);
sch.addIdentity(private_key); //添加私钥文件
return sch;
}
};
Git git = Git.cloneRepository()
.setURI(gitUrl)
.setTransportConfigCallback(transport -> {
SshTransport sshTransport = (SshTransport) transport;
sshTransport.setSshSessionFactory(sshSessionFactory);
})
.setCredentialsProvider(new UsernamePasswordCredentialsProvider(username, password))
.setDirectory(new File(codePath))
.setBranch(commitId)
.call();
// 切换到指定commitId
checkoutBranch(git, commitId);
return git;
代码安全问题
super-jacoco是根据源码来做增量代码差异化分析的,如果使用统一账户拉取代码,那这个账号可能就拥有了所有代码的权限,可以分配只读权限。
K8S中可以使用吗?
上面的步骤中有K8S的使用方式,主要涉及两个问题,1. agent放在哪里?2. pod重启之后可能IP会变掉?
测试人员无法获取到代码Commit ID?
可能很多公司的测试其实是没有代码仓库权限的,只是对迭代的版本有直观的认知。这个就需要依赖公司内部的协调处理了。
覆盖率需要达到100%吗?
代码覆盖率其实很难达到100%,代码中可能会有一些catch的异常或者lombok生成的代码用例很难覆盖到。而且覆盖率也很难说达到一个稳定的值来作为公司内部测试完成的度量。
借助于super-jacoco,我们可以获取用例执行的覆盖率情况,生成覆盖率报告来协助我们分析用例是否完善。但这才是精准测试迈出的第一步,这个覆盖率报告如何解读,如何作用于研发流程还需要不断实践来总结经验。
未来,还要继续探索如何根据覆盖率来推导代码变动影响的接口范围、分析冗余用例提升回归效率、根据代码变动自定推荐用例等等。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有