先聊聊,为什么要有测试覆盖率?

设想以下场景:

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:

  1. goc 命令加上 --debug 会打印详细的日志。我们建议在提交 bug 时附上详细日志。

  2. 默认情况下,插桩过的服务会监听在一个随机的端口,注册中心会通过这个端口与服务通信。然而,对于 docker 和 kubernetes 容器化运行环境,对外暴露端口需在容器启动前指定。针对这种场景,你可以在 goc build 或 goc install 时使用 --agentport 来指定插桩过的服务监听在固定的端口。

  3. 如果注册中心不在本机,你可以在 goc build 或 goc install 编译目标服务时使用 --center 指定远端注册中心地址。

  4. 目前覆盖率数据存储在插过桩的服务侧,如果某个服务中途需要重启,那么其覆盖率数据在重启后会丢失。针对这个场景,你可以通过以下步骤解决:

    1. 在重启前,通过 goc profile -o a.cov 命令收集一次覆盖率
    2. 测试结束后,通过 goc profile -o b.cov 命令再收集一次覆盖率
    3. 通过 goc merge a.cov b.cov -o merge.cov 命令合并两次的覆盖率
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐