使用 Go 语言进行测试的正确包命名

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


策略一:


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


package myfunc

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


package myfunc


策略二:


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


package myfunc

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


package myfunc_test


import (

    "github.com/user/myfunc"

)


策略三:


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


package myfunc

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


package myfunc_test


import (

    . "myfunc"

)


Go 标准库似乎混合使用了策略 1 和 2。我应该使用这三种中的哪一种?附加package *_test到我的测试包上很痛苦,因为这意味着我无法测试我的包私有方法,但也许有一个我不知道的隐藏优势?


慕桂英546537
浏览 280回答 3
3回答

慕工程0101907

您列出的三种策略之间的根本区别在于测试代码是否与被测代码在同一个包中。在使用的决定package myfunc或package myfunc_test在测试文件取决于你是否要执行白盒或黑箱测试。在项目中同时使用这两种方法并没有错。例如,您可以拥有myfunc_whitebox_test.go和myfunx_blackbox_test.go。测试代码包比较黑盒测试:使用package myfunc_test,这将确保您只使用导出的标识符。白盒测试:使用package myfunc以便您可以访问非导出的标识符。适用于需要访问非导出变量、函数和方法的单元测试。问题中列出的策略的比较策略 1:文件myfunc_test.go使用package myfunc- 在这种情况下, 中的测试代码myfunc_test.go将与 中正在测试的代码位于同一包中myfunc.go,myfunc在本例中。策略 2:文件myfunc_test.go使用package myfunc_test——在这种情况下,myfunc_test.go“将作为单独的包编译,然后与主测试二进制文件链接并运行”中的测试代码。[来源:test.go源代码中的第 58-59 行]策略 3:文件myfunc_test.go使用package myfunc_test但myfunc使用点表示法导入- 这是策略 2 的变体,但使用点表示法导入myfunc.

皈依舞

这取决于您的测试范围。高级测试(集成、验收等)可能应该放在一个单独的包中,以确保您通过导出的 API 使用该包。如果您有一个包含大量内部组件的大型包需要进行测试,那么请使用相同的包进行测试。但这并不是让您的测试访问任何私有状态的邀请。这将使重构成为一场噩梦。当我在 go 中编写结构时,我经常实现接口。我从测试中调用的是那些接口方法,而不是所有的辅助方法/函数。

繁华开满天机

您应该尽可能使用策略 1。您可以使用特殊的foo_test包名来避免导入循环,但这主要是因为可以使用相同的机制测试标准库。例如,strings不能使用策略 1 进行测试,因为testing包依赖于strings. 正如您所说,使用策略 2 或 3,您无权访问包的私有标识符,因此除非必须,否则通常最好不要使用它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go