Go覆盖率不包括其他包中的函数

12

我有一个类似这样的项目:

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个回答

12

当我运行代码时,命令行显示我的 bar.go 文件测试覆盖率为0%。但是,当我打开HTML报告时,发现 bar.go 的覆盖率大于0%。 - Matthew Moisen
是的,它就是这样做的!命令行打印的是运行API测试时所有包的覆盖率,然后在运行db测试(即没有测试)时所有包的覆盖率。HTML文件然后包含所有运行测试的总覆盖率。 - Iain Duncan

1

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

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

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


更长的回答,解释为什么其他方法不起作用。所以,我还有一个带有apistore(在这个问题中被称为db)包的项目,其中storeapi中使用,并且我在api中进行了测试。

go test -cover ./...

api已覆盖,store - "[无测试文件]"。

当我像这样运行它

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

它减少了api的覆盖率,因为现在该数字表示api包中测试用例覆盖所有包的情况,这个数字并不是很有用。
但是有一种方法可以知道给定包在所有包中被测试覆盖的情况(例如,如何从api和其他位置的测试用例中覆盖store)。
首先,您需要生成覆盖率概要文件:
go test ./... -coverprofile=coverage.out -coverpkg=./... 

上述命令输出的百分比仍然不正确,但它会创建一个名为coverage.out的文件,其中列出了所有包中由测试覆盖的行。

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

go tool cover -html=coverage.out

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

go tool cover -html 会按文件分组覆盖率,而 go tool cover -func 则按函数分组。你知道是否有任何方法可以像 go test 一样按包分组覆盖率吗? - thedarklord47

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