goc统计go语言代码覆盖率项目实践

一、背景

分析未覆盖部分的代码,从而反推测试用例设计场景是否覆盖充分,没有覆盖到的代码是否存在设计的盲点,以便后续补充测试场景。
代码覆盖率高不一定能说明测试质量就一定高,但是反过来看,代码覆盖率低的,测试质量就一定是比较薄弱的(个人认为:低于60%),可以作为定量自我审视测试是否充分的重要工具之一。

二、技术选型

工具 优点 缺点
go test -cover 自带的简单覆盖率工具,易于使用
适合单元测试快速获取覆盖率数据
只能输出行覆盖率,无法对函数和语句覆盖率进行细粒度分析
只能以单元测试方式启动,无法打包项目进行正常部署
对代码插桩
goc 可以生成具有更细粒度的覆盖率信息,如函数和语句级别的覆盖率
可以对项目打包,按照我们公司现在的流程部署
提供注册中心统一管理被测服务
对代码插桩
只支持goc build .打包

三、goc介绍

goc github: https://github.com/qiniu/goc

简介:goc 是专为 Go 语言打造的一个综合覆盖率收集系统,尤其适合复杂的测试场景,比如系统测试时的代码覆盖率收集以及精准测试。

架构设计:goc统计go语言代码覆盖率项目实践_第1张图片

四、工具安装

goc安装

# Mac/AMD64
curl -s https://api.github.com/repos/qiniu/goc/releases/latest | grep "browser_download_url.*-darwin-amd64.tar.gz" | cut -d : -f 2,3 | tr -d \" | xargs -n 1 curl -L | tar -zx && chmod +x goc && mv goc /usr/local/bin

gocov 和 gocov-html安装,生成覆盖率报告

go install github.com/axw/gocov/gocov@latest
go install github.com/matm/gocov-html/cmd/gocov-html@latest

五、本地项目代码覆盖率统计

项目github:simple-go-server
步骤1:复制项目代码到本地
步骤2:启动goc注册中心服务

goc server

步骤3:使用"goc build"编译项目

goc build

步骤4:运行项目

./simple-go-server

步骤5:执行测试用例
步骤6:收集覆盖率

goc profile -o temp.cov

步骤7:生成覆盖率报告

gocov convert temp.cov |gocov-html >temp.html

覆盖率报告截图:

goc统计go语言代码覆盖率项目实践_第2张图片

六、集成到Jenkins

实现流程图
goc统计go语言代码覆盖率项目实践_第3张图片

goc统计go语言代码覆盖率项目实践_第4张图片
exclude.txt排出文件内容:

simple-go-server/xxx.go
simple-go-server/test

Jenkins 执行shell 配置

# 获取服务ip address
target_url=$(goc list --center="domainA:7777" | jq '.simple-go-server[0]')

#清除存量覆盖率数据
goc clear --center="domainA:7777" --address=$target_url

#执行自动化测试用例
newman run at_testcases.json

#收集覆盖率数据
goc profile --address=$target_url --center="domainA:7777" -o temp.cov

#排出不想收集文件
grep -v -F -f exclude.txt temp.cov > temp.cov

#拉取最新代码
cd simple-go-server
git pull

#生成代码覆盖率报告
gocov convert temp.cov | gocov-html > temp_report_cov.html

七、Q&A

问题1:如何忽略某些文件的覆盖率统计?
背景:在统计项目的代码覆盖率时,统计的覆盖率是整个项目下所有代码的覆盖率,实际执行测试时项目下有很多代码是完全执行不到的,比如框架生成的代码等等,如果这些都统计进去的话,会拉低整个项目的代码覆盖率值,所以一般我们只关心具体业务的代码覆盖率即可
答:

 如仅需统计项目下的src文件夹下的代码覆盖率

方法1:指明需要覆盖的文件路径

goc profile --coverfile src   #需覆盖的路径仅有一个时
goc profile --coverfile src/main --converfile src/list   #需覆盖的路径超过1个时
方法2:忽略不需要覆盖的文件路径

goc profile --skipfile /app    #仅忽略一个路径时
goc profile --skipfile /app/errors --skipfile /app/test  #忽略路径超过1个时

问题2:如何清除存量代码覆盖率统计数据?
答:goc clear

问题3:如何合并两个代码覆盖率文件?
答:goc merge a.cov b.cov -o merge.cov

问题4:如何统计增量代码覆盖率?
答:还在思考中

你可能感兴趣的:(质量保障,golang,代码覆盖率,开发语言)