Go:没有包测试时的错误覆盖

Go: Wrong coverage when there is no tests for a package

我有一个具有以下结构的 Go 项目:

foo/foo.go
foo/foo_test.go
main.go

如您所见,main.go没有测试。

我使用以下命令收集覆盖率报告:

go test ./foo ./ -coverprofile=coverage.txt -covermode=atomic

这里 ./foo./ 显示在哪里寻找包。

问题: 我将覆盖率报告发送给 codecov.io,它显示我的代码 100% 被测试覆盖。但这不是真的,因为我的 main.go 根本没有测试。

系统好像只统计那些明确指定测试文件的包。

问题:如何修复覆盖率报告,使其统计未测试包的信息?

注意:你可以在GitHub and the real statistic is here上找到我的项目。该项目具有不同的结构,但问题仍然存在(覆盖错误)。

试试这个:

go test -coverpkg=./... -race -coverprofile=coverage.txt -covermode=atomic ./..

-coverpkg 标志可用于指定用作覆盖率分析基础的包。

引用自Command go: Testing flags:

-coverpkg pattern1,pattern2,pattern3
    Apply coverage analysis in each test to packages matching the patterns.
    The default is for each test to analyze only the package being tested.
    See 'go help packages' for a description of package patterns.
    Sets -cover.

因此在您的特定示例中,这将完成:

go test -coverpkg=.,./foo -coverprofile=coverage.txt -covermode=atomic . ./foo

要将其应用于完整的模块/项目,您可以使用:

go test -coverpkg=./... -coverprofile=coverage.txt -covermode=atomic ./...

另一种选择是将 "empty" 测试文件放入当前没有测试文件的包的文件夹中。这样它们自然会包含在默认覆盖分析中,但显然它们不会被覆盖。

参见 github 上的相关讨论:

cmd/go: go test -cover & go test -coverprofile should always output a coverage #24570