Go 覆盖多个包和 Gitlab 覆盖徽章

Jul*_*oro 6 testing code-coverage go

我正在尝试为我的 gitlab 项目显示准确的覆盖范围徽章。

事情是我有几个包,在 gitlab-ci.yml 中,我运行

go test $(go list ./... | grep -v /vendor/) -v -coverprofile .testCoverage.txt
Run Code Online (Sandbox Code Playgroud)

我的输出是这样的:

$ 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
Run Code Online (Sandbox Code Playgroud)

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

^coverage:\s(\d+(?:\.\d+)?%)
Run Code Online (Sandbox Code Playgroud)

如果我检查 .testCoverage,我会得到很多这样的行:

 gitlab.com/[MASKED]/pam/repartition/repartition.go:54.33,56.5 1 1
Run Code Online (Sandbox Code Playgroud)

因此,它给我的结果90.1%是仅覆盖最后一个包的情况。

我该怎么办呢?

Jul*_*oro 13

根据这个答案,

\n\n

我只需要另一个命令:

\n\n
go tool cover -func profile.cov\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会给你结果:

\n\n
\xe2\x9c\x97 go tool cover -func profile.cov\n\ngitlab.com/[MASKED]/pam/acquisition/acquisition.go:17:                       FetchAll                        0.0%\ngitlab.com/[MASKED]/pam/acquisition/acquisition.go:32:                       TransformData                   100.0%\ngitlab.com/[MASKED]/pam/acquisition/acquisition_mocks.go:13:                 FetchMeters                     0.0%\ngitlab.com/[MASKED]/pam/repartition/repartition.go:102:                      GroupMetersByOperation          100.0%\ngitlab.com/[MASKED]/pam/repartition/repartition.go:111:                      SetProrataRedistributed         71.4%\ntotal:                                                                          (statements)                    68.7%\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 gitlab 中,您可以更改正则表达式:

\n\n
^coverage:\\s(\\d+(?:\\.\\d+)?%)\n
Run Code Online (Sandbox Code Playgroud)\n\n

经过

\n\n
\\(statements\\)(?:\\s+)?(\\d+(?:\\.\\d+)?%)\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,如果您有模拟,覆盖范围将包括它们,因此您必须按照以下答案删除它们:

\n\n
go test . -coverprofile profile.cov.tmp\ncat profile.cov.tmp | grep -v "_mocks.go" > cover.out\ntool cover -func profile.cov\n
Run Code Online (Sandbox Code Playgroud)\n\n

当然,所有模拟都应该位于带有后缀的文件中:_mocks.go

\n\n

它应该有效。

\n\n

希望它对其他人有帮助!

\n