、、
点击关注“有赞coder”
获取更多技术干货哦~
作者:赵海强 团队:测试团队一、引言
我是一名中间件 QA,我对应的研发团队是有赞 PaaS,目前我们团队有很多产品是使用 go 语言开发,因此我对 go 语言项目的单测覆盖率、集成以及增量测试覆盖率统计与分析做了探索。
二、单测覆盖率以及静态代码分析
2.1 单测覆盖率分析
Go 语言自身提供了单元测试工具go test
,单元测试文件必须以
*_test.go
形式存在,
go test
工具同时也提供了分析单测覆盖率的功能。因为需要将单测覆盖率上传到 sonar 平台展示,所以必须将覆盖率文件转换成能被 sonar 识别的格式,因此,还需要另外一个命令行工具 gocov 。 首先我们使用
go test
生成覆盖率输出文件
cover.out
,并通过 gocov 工具来将生成的覆盖率文件
cover.out
转换成可以被 sonar 识别的 Cobertura 格式的 xml 文件。如下所示:
go test -v ./... -coverprofile=cover.out #生成覆盖率输出
gocov convert cover.out | gocov-xml > coverage.xml #将覆盖率输出转换成xml格式的报告
将生成的单测覆盖率报告发送到 sonar 平台上来展示。
2.2 静态代码分析
Go 静态代码分析工具有两个,分别是 gometalinter 和 golangci-lint ,我们现在使用的是 golangci-lint,因为 gometalinter 已经停止维护,而且作者也推荐去使用 golangci-lint。2.2.1 golangci-lint 的安装
以下是安装 golangci-lint 推荐的两种方法:- 将二进制文件安装在 (go env GOPATH)/bin/golangci-lint 目录下
curl-sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin vX.Y.Z
- 或者将二进制文件安装在 ./bin/ 目录下
curl-sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s vX.Y.Z
golangci-lint--version
来查看它的版本。
2.2.2 golangci-lint 的使用
在需要进行静态代码扫描的目录下执行golangci-lint run
,此命令和
golangci-lint run./…
命令等效,表示扫描整个项目文件代码,并进行监测,也可以通过指定 go 文件或者文件目录名来对特定的代码文件或者目录进行代码扫描,例如
golangci-lint run dir1 dir2/...dir3/file1.go
。
ps:扫描指定目录的时候是不支持递归扫描的,如果要进行递归扫描需要在目录路径后面追加
/…