覆盖多个包的 Go 测试覆盖率和 Gitlab 测试覆盖率徽章

6

我试图为我的gitlab项目显示准确的覆盖率徽章。

问题是我有多个软件包,在gitlab-ci.yml中,我运行

go test $(go list ./... | grep -v /vendor/) -v -coverprofile .testCoverage.txt

我的输出大概是这样的:

$ go test -coverprofile=coverage.txt -covermode=atomic ./...
 ok     gitlab.com/[MASKED]/pam 10.333s coverage: 17.2% of statements
 ok     gitlab.com/[MASKED]/pam/acquisition 0.004s  coverage: 57.7% of statements
 ok     gitlab.com/[MASKED]/pam/acquisition/api 0.005s  coverage: 72.1% of statements
 ok     gitlab.com/[MASKED]/pam/acquisition/ftp 24.936s coverage: 73.1% of statements
 ok     gitlab.com/[MASKED]/pam/repartition 0.004s  coverage: 90.1% of statements

而我的Gitlab测试覆盖率解析正则表达式是:

^coverage:\s(\d+(?:\.\d+)?%)

如果我检查 .testCoverage,会看到很多类似这样的行:
 gitlab.com/[MASKED]/pam/repartition/repartition.go:54.33,56.5 1 1

因此,当它只是最后一个程序包的覆盖率时,它给我一个结果为90.1%

我该怎么做?

1个回答

12
根据这个回答,我只需要另一个命令:

我只需要另一条命令:

go tool cover -func profile.cov

这将给你结果:
✗ go tool cover -func profile.cov

gitlab.com/[MASKED]/pam/acquisition/acquisition.go:17:                       FetchAll                        0.0%
gitlab.com/[MASKED]/pam/acquisition/acquisition.go:32:                       TransformData                   100.0%
gitlab.com/[MASKED]/pam/acquisition/acquisition_mocks.go:13:                 FetchMeters                     0.0%
gitlab.com/[MASKED]/pam/repartition/repartition.go:102:                      GroupMetersByOperation          100.0%
gitlab.com/[MASKED]/pam/repartition/repartition.go:111:                      SetProrataRedistributed         71.4%
total:                                                                          (statements)                    68.7%

在GitLab中,您可以更改正则表达式:
^coverage:\s(\d+(?:\.\d+)?%)

By

\(statements\)(?:\s+)?(\d+(?:\.\d+)?%)

如果您有模拟数据,测试覆盖率会包含它们,因此您必须按照这个答案的步骤移除它们:

go test . -coverprofile profile.cov.tmp
cat profile.cov.tmp | grep -v "_mocks.go" > cover.out
tool cover -func profile.cov

当然,你的所有mock都应该在文件名后缀为_mocks.go的文件中。
它应该能够工作。
希望这有助于其他人!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接