我在GO中看到了几种不同的测试包命名策略,我想知道每种策略的优缺点以及我应该使用哪种策略.

Strategy 1:

文件名:github.com/user/myfunc.go

package myfunc

测试文件名:github.com/user/myfunc_测试.go

package myfunc

有关示例,请参见bzip2.

Strategy 2:

文件名:github.com/user/myfunc.go

package myfunc

测试文件名:github.com/user/myfunc_测试.go

package myfunc_test

import (
    "github.com/user/myfunc"
)

有关示例,请参见wire.

Strategy 3:

文件名:github.com/user/myfunc.go

package myfunc

测试文件名:github.com/user/myfunc_测试.go

package myfunc_test

import (
    . "myfunc"
)

有关示例,请参见strings.

Go标准库似乎混合使用了策略1和策略2.我应该使用这三种策略中的哪一种呢?将package *_test附加到我的测试包中是一件痛苦的事情,因为这意味着我不能测试我的包的私有方法,但也许有一个我没有意识到的隐藏优势?

推荐答案

您列出的三种策略之间的根本区别在于测试代码是否与被测试代码位于同一个包中.在测试文件中使用package myfuncpackage myfunc_test的决定取决于您想要执行white-box还是black-box测试.

在一个项目中同时使用这两种方法没有什么错.例如,你可以有myfunc_whitebox_test.gomyfunx_blackbox_test.go.

测试代码包比较

  • Black-box Testing:使用package myfunc_test,这将确保您只使用exported identifiers.
  • White-box Testing:使用package myfunc可以访问未导出的标识符.适用于需要访问非导出变量、函数和方法的单元测试.

所列策略的比较

  • Strategy 1:文件myfunc_test.go使用package myfunc-在这种情况下,myfunc_test.go中的测试代码将位于与myfunc.go中正在测试的代码相同的包中,其在本例中为myfunc.
  • Strategy 2:文件myfunc_test.go使用package myfunc_test——在本例中,myfunc_test.go中的测试代码"将被编译为一个单独的包,然后与主测试二进制文件链接并运行"[来源:test.go源代码中的第58-59行]
  • Strategy 3:文件myfunc_test.go使用package myfunc_test,但是使用点符号导入myfunc-这是策略2的变体,但是使用点符号导入myfunc.

Go相关问答推荐

你能帮我优化一个golang代码关于函数CrossPointTwoRect

如何将文件从AWS S3存储桶复制到Azure BLOB存储

需要类型[]*structpb.Value(GCP Golang客户端库;aiPlatform)

转到http服务器头内容-类型设置为多部分/表单-数据,但在客户端获取内容-类型:文本/纯文本

当我有外键时,如何使用 GORM 创建数据库的新条目

如何获取集群外go Kubernetes客户端的当前命名空间?

如何在golang中使用viper获取对象的配置数组?

如何解决构建Docker Compose时的权限被拒绝问题

如何忽略打印达到最大深度限制 go colly

如何在 Go msgraph-sdk-go 中转发消息并包括抄送和/或密送收件人?

AWS Lambda 中的 Websocket URL 超时达到错误

Opensearch 错误 ping 弹性服务器:由未知权威签署的 x509 证书

Gorm delete with clauses sqlmock 测试

在 Go 模板中对照片使用随机 Int

Golang invopop jsonschema 使用 if/then/else

在 docker kill --signal=SIGX 上以这种方式关闭容器内运行的 go 应用程序是否安全?

在 golang 中联合一个接口和类型

go routine 和接收错误或成功的通道

如何获得Ent中数字列的总和

如何允许可转换为指针的泛型类型参数化另一种可转换为指针的泛型类型?