Go:测试内部函数

Go: test internal functions

假设我在包 mypackage 中有一个带有私有方法 (mt *MyType) private() 的类型 MyType。 我还有一个目录 tests,我想在其中存储我的包的测试。这是 tests/mypackage_test.go 的样子:

package mypackage_test

import (
    "testing"
    "myproj/mypackage"
)

func TestPrivate(t *testing.T) {
    // Some test code
}

但是,当我 运行 go test 时,我得到了 cannot refer to unexported field or method my package.(*MyType)."".private) 错误。我在谷歌上搜索了一下,发现以小写开头的函数在它们自己的包之外是看不到的(这似乎是真的,因为大写函数可以从测试中自由调用)。

我也在某处读到,在测试文件中添加 <...>_internal_test.go 可以像这样解决我的问题 (tests/mypackage_internal_test.go):

package mypackage

import (
    "testing"
)

func TestPrivate(t *testing.T) {

    mt := &MyType{}
    // Some test code
}  

但是我只得到 undefined: MyType。所以,我的问题是:如何测试 internal/private 方法?

为什么将测试放在不同的包中? go testing 机制使用 _test 作为测试文件的后缀,因此您可以将测试放在与实际代码相同的包中,避免您描述的问题。将测试放在单独的包中并不是 Go 惯用的做法。不要试图与 Go 约定作斗争,这不值得付出努力,而且你很可能会输掉这场斗争。

Go 坚持同一文件夹中的文件属于同一包,即 _test.go 文件除外。将您的测试代码移出包允许您编写测试,就好像您是包的真实用户一样。您不能 fiddle 关注内部结构,而是专注于暴露的界面,并始终考虑可能添加到 API.

中的任何噪音

并且:

如果您确实需要对某些内部结构进行单元测试,请创建另一个以 _internal_test.go 作为后缀的文件。内部测试必然比您的接口测试更脆弱 —— 但它们是确保内部组件正常运行的好方法,并且在您进行测试驱动开发时特别有用。

来源:https://medium.com/@matryer/5-simple-tips-and-tricks-for-writing-unit-tests-in-golang-619653f90742

对于如何在 golang 项目中构建测试存在不同的意见,我建议您阅读上面的博客。