无需共置测试就测试生成的Go代码

问题描述 投票:0回答:1

具有一些用于protobuf消息的自动生成的golang代码,我希望添加一些其他测试,而不必将文件放在同一目录路径下。这是为了轻松删除现有的已生成代码,以确保如果从生成中删除文件,该文件不会意外地包含在代码库中。

这些文件的当前布局由prototool控制,所以我有以下类似内容:

/pkg/<other1>
/pkg/<other2>
/pkg/<name-generated>/v1/component_api.pb.go
/pkg/<name-generated>/v1/component_api.pb.gw.go
/pkg/<name-generated>/v1/component_api.pb.validate.go

*.validate.go来自envoyproxy / protoc-gen-validate,*.pb.go*.pb.gw.go来自protobuf和grpc库。 other1other2是我们随附的两个帮助程序库以及生成的代码,可简化客户端应用程序的工作。服务器端位于单独的存储库中,并根据需要导入。

因为在重新运行prototool之前能够删除/pkg/<name>是很有用的,所以我在路径下放置了一些component_api测试(主要用于执行自动生成的验证规则):

/internal/pkg/<name>/v1/component_api_test.go

虽然此方法适用于go test -v ./...,但在使用-coverpkg生成覆盖率时似乎效果不佳。

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

go build <pkgname>/internal/pkg/<name>/v1: no non-test Go files in ....
<output from the tests in /internal/pkg/<name>/v1/component_api_test.go>
....
....
coverage: 10.5% of statements in ./...
ok      <pkgname>/internal/pkg/<name>/v1    0.014s  coverage: 10.5% of statements in ./...
FAIL    <pkgname>/pkg/other1 [build failed]
FAIL    <pkgname>/pkg/other2 [build failed]
?       <pkgname>/pkg/<name>/v1 [no test files]
FAIL
Coverage tests failed
Generated coverage/go/html/main.html

使用-coverpkg的原因是,没有它,似乎没有发现<pkgname>/pkg/<name>/v1下的任何代码被覆盖的东西,而且我们看到它以前报告的内容没有显示真实的问题。覆盖级别,可通过使用-coverpkg解决:

go test -cover -coverprofile=coverage/go/coverage.out ./...
ok      <pkgname>internal/pkg/<name>/v1 0.007s  coverage: [no statements]
ok      <pkgname>/pkg/other1 0.005s coverage: 100.0% of statements
ok      <pkgname>/pkg/other2    0.177s  coverage: 100.0% of statements
?       <pkgname>/pkg/<name>/v1 [no test files]

查看最终的coverage / go / coverage.out并未提及<pkgname>/pkg/<name>/v1下正在行使的任何内容。

我并没有附加到当前布局上,而是受Prototool自动管理的<pkgname>/pkg/<name>/v1限制,这是为生成的文件命名的规则。想要确保我们拥有的其他模块可以保持导出状态以用作帮助程序库,并且我希望能够为<pkgname>/pkg/<name>/v1添加测试,而无需将它们定位在同一目录中,以便于轻松删除+重新创建生成的文件,同时仍会获得合理的覆盖率报告。

我已经尝试摆弄传递给-coverpkg的软件包,并在命令行上替换./...,但无法提出可行的解决方案。也许我只是不熟悉正确的调用?

除此之外,还有其他布局可以为我解决这个问题吗?

unit-testing go code-coverage
1个回答
0
投票

要处理这种情况,只需在打包和注释的地方,在与脱位测试相同的目录中创建一个doc.go文件。这将允许标准参数起作用,并且golang对于使用空文件似乎相当满意。

一旦安装,以下将按预期工作。

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

基于https://stackoverflow.com/a/47025370/1597808中建议的想法

© www.soinside.com 2019 - 2024. All rights reserved.