我有一个像这样的项目:
app/
api/
foo.go
test_foo.go
src/
db/
bar.go
在foo.go
中,将调用bar.go
中的一个函数。但是,运行覆盖率报告时,它显示bar.go的0行被覆盖了。
有没有一种方法可以覆盖其他程序包的函数调用?
就我而言,我不想对db
和api
分别进行测试,因为通过db
进行的所有呼叫都将始终通过api
进行,因此编写两个测试将是多余的。
我正在像这样运行覆盖范围
go clean -testcache
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out
答案 0 :(得分:1)
您需要包括coverpkg
标志,这样:
go test -coverpkg=./... coverprofile=coverage.out ./...
将计算所有包裹的覆盖范围。
答案 1 :(得分:1)
简短的回答。要查看正确的覆盖范围,请运行:
go test ./... -coverprofile=coverage.out -coverpkg=./...
go tool cover -html=coverage.out
然后在浏览器内的下拉菜单中查看百分比。
更长的答案并解释为什么其他方法不起作用。因此,我还有一个包含 api
和 store
(在这个问题中称为 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
然后在允许您选择要浏览覆盖范围的文件的下拉菜单中,您将获得正确的每个文件覆盖范围。