Go Coverage不包含其他软件包中的功能

时间:2019-03-16 19:54:10

标签: go

我有一个像这样的项目:

app/
    api/
        foo.go
        test_foo.go
src/
    db/
        bar.go

foo.go中,将调用bar.go中的一个函数。但是,运行覆盖率报告时,它显示bar.go的0行被覆盖了。

有没有一种方法可以覆盖其他程序包的函数调用?

就我而言,我不想对dbapi分别进行测试,因为通过db进行的所有呼叫都将始终通过api进行,因此编写两个测试将是多余的。

我正在像这样运行覆盖范围

go clean -testcache
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out

2 个答案:

答案 0 :(得分:1)

您需要包括coverpkg标志,这样:

 go test -coverpkg=./... coverprofile=coverage.out ./...

将计算所有包裹的覆盖范围。

https://golang.org/cmd/go/#hdr-Testing_flags

答案 1 :(得分:1)

简短的回答。要查看正确的覆盖范围,请运行:

go test ./... -coverprofile=coverage.out -coverpkg=./...
go tool cover -html=coverage.out

然后在浏览器内的下拉菜单中查看百分比。


更长的答案并解释为什么其他方法不起作用。因此,我还有一个包含 apistore(在这个问题中称为 db)包的项目,其中 store 用于 api,并且我在 api 有测试。

go test -cover ./...

api 已被覆盖,store - “[无测试文件]”。

当我运行它时

go test -cover -coverpkg=./... ./...

它降低了 api 中的覆盖率,因为现在这个数字意味着 api 包中的测试用例如何覆盖所有包,这是一个不是很有用的数字。

但是有一种方法可以知道所有包中的测试如何覆盖给定包(例如,store 和其他地方的测试如何覆盖 api)。

首先,您生成覆盖率配置文件:

go test ./... -coverprofile=coverage.out -coverpkg=./... 

以上命令仍然会在输出中给出错误的百分比,但它会创建 coverage.out 文件,该文件将列出所有包中测试覆盖的所有包中的所有行。

然后您可以使用以下命令在浏览器中查看此报告:

go tool cover -html=coverage.out

然后在允许您选择要浏览覆盖范围的文件的下拉菜单中,您将获得正确的每个文件覆盖范围。