Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >基于Super-Jacoco的精准测试实践之路

基于Super-Jacoco的精准测试实践之路

作者头像
公号:咻咻ing
发布于 2021-12-07 06:59:41
发布于 2021-12-07 06:59:41
3K00
代码可运行
举报
文章被收录于专栏:公众号:咻咻ing公众号:咻咻ing
运行总次数:0
代码可运行

灵魂拷问

  • 这个版本的影响范围到底有多大?
  • 研发改动了代码,为什么不通知测试?
  • 测试用例真的全面覆盖了吗?
  • 测试同学的测试覆盖情况该怎么评估?

什么是精准测试

概念

借助技术手段、通过辅助算法对软件测试过程进行可视化、分析及优化的过程,使得测试过程更加可视化、智能、可信和精准。

目标

测试质量的评估不在完全依靠个人经验和业务熟练度,而是通过精准的数据来判定。在测试资源有限的条件下,将用例精简到更加有针对性,提高测试效率,减少漏测风险。

核心
  • 研发:研发人员可以看到测试执行用例的代码细节,帮助快速定位和修复缺陷。
  • 测试:测试人员可以通过代码修改范围快速确定测试用例,减少测试的盲目性,提升测试覆盖率。

精准测试实践

  1. 无需对开发代码做任何改造,只需在服务启动命令中添加javaagent即可。
  2. 依托于Super-Jacoco,基于Jacoco、Git二次开发,收集两个版本间增量代码差异。
  3. 用户执行测试用例,用例执行过程中Jacoco会记录代码覆盖情况。
  4. 生成可视化的HTML覆盖率报告,协助用例覆盖情况精准分析。
整体流程图

详细使用流程

业务部署

  • 修改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 ❞

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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中,调用启动覆盖率收集,之后即可执行测试用例

  • uuid:随机值,全局唯一;可手动输入,getEnvCoverResult接口需要使用
  • baseVersion: 基准的Git CommitID
  • address:步骤1中的address

获取覆盖率报告

在测试用例执行后,通过接口/cov/getEnvCoverResult获取覆盖率报告

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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"
  }
}

参数说明:

  • uuid:步骤2中的uuid

访问reportUrl中的地址即可获取覆盖率报告,报告解读:

上图为某项目的报告截图示例,对报告理解作简单介绍:

  • 绿色:用例执行覆盖到了该代码
  • 红色:该代码逻辑未被覆盖到
  • 代码标记颜色说明:

精准测试使用场景

1. 提测阶段

版本提测后,通过触发【启动覆盖率收集】步骤2中的操作,通过【步骤3】获取覆盖率报告,可以获得本次迭代版本相比上个版本的代码变更范围,为测试同学制定测试方案和测试范围提供参考。同时可以评估研发的自测程度。

2. 测试阶段

测试完成后,通过获取【获取覆盖率报告】步骤3来查看测试覆盖情况,测试同学可以根据代码染色结果来分析本次测试的完成度。同时也可以驱动测试同学加强代码阅读和分析,提升测试深度。

3. 回归阶段

通过PostMan测试集合执行回归用例,除了可以查看测试集合的用例执行结果外,还可以通过覆盖率报告进行分析。

常见问题

Super-Jacoco的git地址是否支持ssh?

支持,application.properties中的gitlab.usernamegitlab.password配置为空值时使用默认的SSH值。你也可以修改super-jacoco中com.xiaoju.basetech.util.GitHandler的源码来指定SSH配置,示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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会变掉?

  • 可以把agent放入到基础镜像或者打包到项目中。2. 把address配置成0.0.0.0之后,请求参数中的address写成K8S集群的访问Ip即可。

测试人员无法获取到代码Commit ID?

可能很多公司的测试其实是没有代码仓库权限的,只是对迭代的版本有直观的认知。这个就需要依赖公司内部的协调处理了。

覆盖率需要达到100%吗?

代码覆盖率其实很难达到100%,代码中可能会有一些catch的异常或者lombok生成的代码用例很难覆盖到。而且覆盖率也很难说达到一个稳定的值来作为公司内部测试完成的度量。

结语

借助于super-jacoco,我们可以获取用例执行的覆盖率情况,生成覆盖率报告来协助我们分析用例是否完善。但这才是精准测试迈出的第一步,这个覆盖率报告如何解读,如何作用于研发流程还需要不断实践来总结经验。

未来,还要继续探索如何根据覆盖率来推导代码变动影响的接口范围、分析冗余用例提升回归效率、根据代码变动自定推荐用例等等。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 咻咻ing 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
super-jacoco单元测试覆盖率度量实践-1
代码覆盖率,尤其是增量代码覆盖率,是质量门禁的重要指标之一。由于一些不可名状的原因,团队原先提供质量门禁服务的工具暂时停服了,因此需要另外寻找一个工具来代替提供此项服务。于是,笔者就Super-Jacoco做了一个简单的POC。
Antony
2022/02/08
1.6K0
super-jacoco单元测试覆盖率度量实践-1
super-jacoco源码分析与二次开发
在第一篇文章super-jacoco单元测试覆盖率度量实践-1中,笔者介绍了Super-Jacoco的单元测试覆盖率统计只要向Super-Jacoco服务发送如下的一个post请求
Antony
2022/02/08
3.5K0
super-jacoco源码分析与二次开发
精准测试系列《四》
前期推文:精准测试系列《三》分享了如何通过测试管理平台进行发布分支,今天分享的内容是在发布完成后我们要触发代码覆盖率的统计的逻辑,分享的大致思路还是从前端页面发起请求,然后后端接收到请求继续处理这样的逻辑来分享的。
Wu_Candy
2022/07/04
3250
基于 Jenkins + JaCoCo 实现功能测试代码覆盖率统计
对于 JaCoCo,有所了解但又不是很熟悉。 "有所了解"指的是在 CI 实践中已经使用 JaCoCo 对单元测试代码覆盖率统计: 当代码 push 到代码仓库后,用 JaCoCo 进行单元测试代码覆盖率统计,并将相应数据推送到 SonarQube。 "不是很熟"指的是应用场景也仅限于此,并未进行过多研究与实践。
LinuxSuRen
2019/05/23
4.2K0
只懂黑盒测试也能学会的代码覆盖率及精准化测试
测试覆盖率是对测试完成程度的度量。它通常依据某种覆盖准则来对测试用例执行情况进行衡量,以判断测试执行得是否充分 。 ——出自《 计算机科学技术名词 》第三版
霍格沃兹测试开发
2022/05/30
1.2K0
精准测试系列《二》
前期的推文:精准测试系列《一》讲解了 SuperJacoco 这个工具是什么,以及 SuperJacoco 能为我们测试解决哪些问题,以及现存在的一些问题。
Wu_Candy
2022/07/04
9170
精准测试系列《二》
如何知道我们的E2E测试覆盖率?
在单元测试中,很容易知道已经覆盖了哪些代码区域。但是我们能及时知道API调用的动态范围吗?我们一直在思考,既然已经编写了许多 E2E 测试用例,但是我们应该继续编写多少剩余测试?
ThoughtWorks
2020/09/25
1.5K0
使用 JaCoCo 生成测试覆盖率报告
在我们实际的工作中,当完成程序的开发后,需要提交给测试人员进行测试,经过测试人员测试后,代码才能上线到生产环境。
头发还在
2023/10/16
1.2K0
使用 JaCoCo 生成测试覆盖率报告
接口测试代码覆盖率(jacoco)方案分享
在做接口测试过程中,为了达到量化接口测试用例效果的目的,引入了代码覆盖率作为重要指标,在查阅相关文档和资料通过实践之后,大概得到了一个方案。如图:
FunTester
2019/07/27
2.4K0
基于自动化用例的精准测试探索
在当前web系统或app后端服务测试过程中, 黑盒测试占据了大部分的测试,即便是接口测试,也是基于场景的用例设计,这种测试方法完全依赖于测试人员的能力,经验和业务熟悉度,而互联网行业的一大特点就是人员流动性高,这使得线上质量经常是“靠天吃饭”。基于黑盒的测试使的项目测试在测试过程中存在以下几个问题:
测试开发社区
2019/09/20
1.4K0
基于自动化用例的精准测试探索
浅谈代码覆盖率
经常有人问这样的问题:“我们在做单元测试,那测试覆盖率要到多少才行?”。答案其实很简答,“作为指标的测试覆盖率都是没有用处的。”
JavaEdge
2020/05/27
1.8K0
浅谈代码覆盖率
精准测试体系构建
版本提测后,开发往往会说,影响范围比较大,做个主链路或者全量回归吧,我只改了几行代码,为什么要回归这么长时间?等等。
政采云前端团队
2023/09/01
1.3K0
精准测试体系构建
jacoco初探
覆盖率是衡量自动化用例效果产品的一个指标,但只是一个辅助指标,覆盖率高并不意味着质量好,但覆盖率低却能说明一些问题,
千往
2018/10/22
3.5K0
jacoco初探
java代码覆盖工具Jacoco
Jacoco是一个开源的覆盖率工具。Jacoco可以嵌入到Ant 、Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序。很多第三方的工具提供了对Jacoco的集成,如sonar、Jenkins等。
苦叶子
2019/08/05
2K0
java代码覆盖工具Jacoco
JaCoCo增量覆盖率的基本实现原理
如图所示,在master分支提交了HelloController,然后从master拉了个新分支test;提交了第1次代码,增加了WorldController;提交了第2次代码,增加了DonController。增量的获取方式有两种:
dongfanger
2022/11/28
3.8K0
JaCoCo增量覆盖率的基本实现原理
Jacoco统计接口测试的代码覆盖率
搜狗商城现有的接口自动化测试框架是使用Python搭建的,共900多条case,每天都会运行一次,从而监控是否有因开发代码变更或者新功能添加而导致的遗漏的bug。但我们只是依照测试用例来转换成自动化脚本、case,实际上并没有度量的指标,也不能保证测试的完整性,所以我们打算引入代码覆盖率这一指标来度量测试完整性。
用户5521279
2019/08/09
3.8K1
Jacoco统计接口测试的代码覆盖率
精准测试系列《五》
精准测试系列《四》分享了如何通过测试管理平台进行代码覆盖率的统计,今天的分享内容是在发布平台进行获取覆盖率报告的逻辑,分享的大致思路还是从前端页面发起请求,然后后端接收到请求继续处理这样的逻辑来讲解。
Wu_Candy
2022/07/04
4270
有赞iOS精准测试实践
近几年有赞零售业务快速发展,为了满足日益增多的业务需求,2019年起零售客户端发版改成了每周一次,在质量保障方面,技术团队要面对更大的挑战。故此我们团队做了很多研究,希望通过技术工具来提升移动端测试的质量和效率,这是我们研发移动端精准测试平台的初衷。
有赞coder
2020/08/24
2.3K1
有赞iOS精准测试实践
精准测试系列《一》
在实际的软件生产交付过程中,我们通过单元测试、接口测试、功能测试、自动化测试等手段来保障软件质量;但是无论使用哪种测试手段,case 设计是否全面、精简,显得尤为重要。在实际的项目测试过程中,case 的设计也会经常出现以下问题:
Wu_Candy
2022/07/04
8610
JAVA代码覆盖率工具JaCoCo-原理篇
关于JAVA代码覆盖率工具JaCoCo,作者会通过三篇来介绍,分别为原理篇、实践篇和踩坑篇,先从原理篇开始介绍~ 一、覆盖率定义 作为一个测试人员,保证产品的软件质量是其工作首要目标,为了这个目标,测试人员常常会通过很多手段或工具来加以保证,覆盖率就是其中一环比较重要的环节。 我们通常会将测试覆盖率分为两个部分,即“需求覆盖率”和“代码覆盖率”。 需求覆盖:指的是测试人员对需求的了解程度,根据需求的可测试性来拆分成各个子需求点,来编写相应的测试用例,最终建立一个需求和用例的映射关系,以用例的测试结果来验证
腾讯移动品质中心TMQ
2018/02/06
27.5K0
JAVA代码覆盖率工具JaCoCo-原理篇
相关推荐
super-jacoco单元测试覆盖率度量实践-1
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验