统计 Golang 项目的测试覆盖率

时间:2022-3-29     作者:smarteng     分类: Go语言


我们的项目主要基于 Golang 开发,公司要求统计测试覆盖率。所以,我们摸索了一下在 Golang 下如何统计整个项目得测试覆盖率:

以下内容均基于 Go SDK 1.10.1 获得,不保证可以向下兼容

先直接上结果:

go test -coverpkg=./... -coverprofile=coverage.data -timeout=5s ./...
go tool cover -html=coverage.data -o coverage.html
go tool cover -func=coverage.data -o coverage.txt

下面是具体的分析:

如何测试并统计各go语法块覆盖率

其实,这个问题本质上可以通过 go test -h 搞定:

  1. 参数 -cover :是否开启覆盖率统计的开关。但是 -covermode-coverpkg-coverprofile 这些参数默认会打开这个选项,所以不用专门去设置了。
  2. 参数 -covermode mode :可选值有 set、count、atomic,其中 set (默认值)仅统计语法块是否覆盖,count 会统计语法块覆盖了多少次,atomic 用于多线程测试中统计语法块覆盖了多少次。
  3. 参数 -coverpkg pattern1,pattern2,pattern3 :覆盖率统计 packages 的范围,若不设置默认只统计有执行了测试的 packages。
  4. 参数 -timeout t :单个测试用例的超时时间,默认值 10 分钟。
  5. 参数 -coverprofile cover.out :覆盖率 profile 文件输出地址。

如何统计当前的项目测试覆盖率数值

输出报告时,我们需要的是整个项目,目前覆盖率达到多少。所以需要使用命令 go tool cover -func=coverage.data -o coverage.txt
在输出文件的最后一行:

total:        (statements)        3.1%

即可获得加权后的总覆盖率。

如何获取直观的测试覆盖情况

在提升测试覆盖率时,我们关注的是当前文件到底覆盖的情况如何。这时,需要使用 go tool cover -html=coverage.data -o coverage.html 或者直接使用 go tool cover -html=coverage.data ,即可在网页中直接查看各文件的覆盖情况。