unit-testing - 测试生成的 Go 代码而不使用同位测试

标签 unit-testing go code-coverage

有一些用于 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是我们与生成的代码一起包含的两个帮助程序库,以使客户端应用程序更容易。服务器端位于单独的存储库中,并根据需要导入。

因为能够删除 /pkg/<name> 很有用在重新运行 prototool 之前,我在路径下放置了一些 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 下的任何内容正在行使。

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

我试过摆弄传递给 -coverpkg 的包。并替换 ./...在命令行上并且无法提出可行的方法。也许我只是不熟悉正确的调用?

除此之外,是否有不同的布局可以为我解决这个问题?

最佳答案

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

一旦到位,以下将按预期工作。

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

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

关于unit-testing - 测试生成的 Go 代码而不使用同位测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60775372/

相关文章:

javascript - 测试调用 API 的 redux 操作

unit-testing - 使用内存数据库进行测试。单元测试还是集成测试?

regex - 使用 Go Validator v2 转义正则表达式

rest - 混合命名和未命名函数参数

c# - 如何将解决方案测试的代码覆盖率结果文件输出到解决方案目录而不是测试项目目录

unit-testing - 为单个文件生成新的代码覆盖率,而不清除 PHPUnit 中的所有其他覆盖率报告

python - 单元测试 lambda 脚本

go - os.Create 和 os.Open 不能与 gomobile 一起使用并 react native

java - 三叶草3.1.7不支持Java 7 Diamond

javascript - 为什么在模拟 Node.js 模块时 Jest 模拟实例为空?