我在 main.go
中定义了无法在 main_test.go
中访问的函数。但是,在一些在线教程中,我看到函数是可访问的:我想了解其中的区别,以及如何以惯用的方式构建这些函数。
具体来说,我有一个包含多个二进制文件的应用程序:
myapp/cmd/app/main.go
myapp/cmd/cli/main.go
我目前在 main.go
文件的 func main
中运行了很多简单的单元测试逻辑。我只是测试单个函数并让它们打印输出,如果我能避免的话,我不会尝试调用“测试”套件的全部功能。
由于此时我在 main.go 顶部的测试太长了,我想将它们移动到特定的测试文件中,例如:
myapp/cmd/app/main_test.go
myapp/cmd/cli/main_test.go
这对我的 makefile 来说效果很好:
# Makefile
all: test build
build:
go build -o cmd/app/main cmd/app/main.go
go build -o cmd/cli/main cmd/cli/main.go
test:
go test ./cmd/app/main_test.go
go test ./cmd/cli/main_test.go
如果我只想运行我的测试文件,我想在我的 app/main.go
// cmd/app/main.go
package main
func definedInMain(m string) string {
//
}
func main() {
m := definedInMain("1")
fmt.Println(m)
// all the rest of my app's logic...
}
然后在我的 main_test.go
中运行它
// cmd/app/main_test.go
package main
// no imports, I hope?
func testDefinedInMain() {
m := definedInMain("1")
fmt.Println(m)
}
然而,这失败了:
undefined: definedInMain
FAIL
我很困惑,我必须将所有这些函数导入到我的 main_test.go
文件中(甚至当我尝试时,它提示 "can't load package: ... myapp/cmd/app/main"在以下任何一个中:..."
)
是否有一种干净且符合惯用的方式让我在测试文件中测试非常简单的单元测试并在主文件中运行我的函数,而无需大量重写导入或其他实质性的重新架构?
从一些链接中,我的印象是,如果我制作了一个 main_test.go
,导入将自行进行(就像它们在这些示例中那样)。
- https://medium.com/@thejasbabu/testing-in-golang-c378b351002d (其中没有在 reverse_test.go 中显式导入 Reverse 函数)
- https://tutorialedge.net/golang/intro-testing-in-go/ (其中 Calculate 函数未显式导入 main_test.go)
- https://blog.alexellis.io/golang-writing-unit-tests/ (其中未在 main_test.go 中显式导入 Sum 函数)
所以,您可以看到我对免费导入其功能的教程感到有点困惑,而我没有,我只是想更好地理解魔术。
是不是我的函数 definedInMain 是私有(private)的,因为它是小写的?我确实希望这个函数是私有(private)的,但我希望它能以与在 main.go 中可用的方式相同的方式导出到 main_test.go 文件。我是否必须完全公开才能在另一个文件中进行测试?这似乎不正确,例如,“在 go 中只能对公共(public)方法进行单元测试吗?”
最佳答案
如果@Mustafa Simav 想发布那个答案,我会接受,但如果不是,我会关闭它:
解决方案是使用完整路径低于 $GOPATH
的非本地导入。 whatever_test.go 确实可以正确地进行自动导入,即使是非导出的小写函数,这正是我想要进行单元测试的。由于进口,这很难看到。
关于unit-testing - 如何在 Golang 测试文件中构建导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52583197/