Go测试覆盖率 - Goc
goc 是专为 Go 语言打造的一个综合覆盖率收集系统
先聊聊,为什么要有测试覆盖率?
设想以下场景:
1,自动化组,长期做接口黑盒测试
2,业务组,针对单项目做系统测试
这种情况,会导致对所测系统的覆盖度未知。而综合覆盖率收集系统,尤其适合没有白盒测试的团队。
再聊聊,测试覆盖率的价值:反馈与发现。
反馈:测试水平如何。case设计水平,测试人员执行效率等。
发现:不足或风险并予以提高。风险前置。性能优化。
eg. 比如常见的,单元测试覆盖率作为CI准入标准,系统测试覆盖率作为CD门禁等等。
那么,是不是覆盖率越高就代表代码质量越好?
并不是。
注意:高代码覆盖率并不能保证高产品质量,但低代码覆盖率一定说明大部分逻辑没有被自动化测到。后者通常会增加问题遗留到线上的风险,当引起注意。所以落地时要平衡指标。
最后聊聊,覆盖率的终极目标:提高测试覆盖率。
尤其是自动化场景的覆盖率,并一以贯之。
所以基于此,业界我们看到,做的比较有价值的落地形态是增量覆盖率的度量(goc diff)。
引申:精准测试。
-
精准测试其背后的价值逻辑比较清晰,就是建立业务到代码的双向反馈,用于提升测试行为的精准高效。即本次改动涉及的范围,业务测试需要覆盖的工作量。目前有某公司在落地精准测试平台,但是产出并不明显。
下面介绍本期主角,Goc
地址: https://github.com/qiniu/goc.git
goc旨在做go语言领域综合性的覆盖率工具以及精准测试系统。
Goc架构:
不同于jacoco,goc没有选择自己做插桩,也是考虑go语言的兼容性,以及性能问题,毕竟 go tool cover工具,原生采用结构体来定义counter收集器,每个文件都有单独的结构体,性能相对比较可靠。
集测时,被测对象通常是完整产品,涉及到多个long running的后端服务。所以goc在设计上会自动化会给每个服务注入HTTP API,同时通过服务注册中心goc server来管理所有被测服务。如此的话,就可以在运行时,通过命令goc profile实时获取整个集群的覆盖率结果,当真非常方便。
Goc原理:
整体比较简单,大体只需要三步:
-
首先通过
goc server命令部署一个服务注册中心,它将会作为枢纽服务跟所有的被测服务通信。 -
➜ simple-go-server git:(master) ✗ goc server -
使用
goc build--center="<server>"命令编译被测程序。goc不会破坏被测程序的启动方式,所以你可以直接将编译出的二进制发布到集成测试环境。 -
➜ simple-go-server git:(master) ✗ goc build . ... // omit logs ➜ simple-go-server git:(master) ✗ ./simple-go-server -
环境部署好之后,就可以做执行任意的系统测试。而在测试期间,可以在任何时间,通过
goc profile--center="<server>"拿到当前被测集群的覆盖率结果。 -
➜ simple-go-server git:(master) ✗ goc profile mode: atomic enricofoltran/simple-go-server/main.go:30.13,48.33 13 1 enricofoltran/simple-go-server/main.go:48.33,50.3 1 0 enricofoltran/simple-go-server/main.go:52.2,65.12 5 1 enricofoltran/simple-go-server/main.go:65.12,74.46 7 1 enricofoltran/simple-go-server/main.go:74.46,76.4 1 0 ...
释义:
enricofoltran/simple-go-server/main.go:30.13,48.33 13 1
基本语义为 "文件:起始行.起始列,结束行.结束列 该基本块中的语句数量 该基本块被执行到的次数"
tips:
-
goc 命令加上
--debug会打印详细的日志。我们建议在提交 bug 时附上详细日志。 -
默认情况下,插桩过的服务会监听在一个随机的端口,注册中心会通过这个端口与服务通信。然而,对于 docker 和 kubernetes 容器化运行环境,对外暴露端口需在容器启动前指定。针对这种场景,你可以在
goc build或goc install时使用--agentport来指定插桩过的服务监听在固定的端口。 -
如果注册中心不在本机,你可以在
goc build或goc install编译目标服务时使用--center指定远端注册中心地址。 -
目前覆盖率数据存储在插过桩的服务侧,如果某个服务中途需要重启,那么其覆盖率数据在重启后会丢失。针对这个场景,你可以通过以下步骤解决:
- 在重启前,通过
goc profile -o a.cov命令收集一次覆盖率 - 测试结束后,通过
goc profile -o b.cov命令再收集一次覆盖率 - 通过
goc merge a.cov b.cov -o merge.cov命令合并两次的覆盖率
- 在重启前,通过
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)