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 项目中构建测试存在不同的意见,我建议您阅读上面的博客。
假设我在包 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 项目中构建测试存在不同的意见,我建议您阅读上面的博客。