如何在Golang测试文件中构造导入文件

时间:2018-10-01 00:13:00

标签: unit-testing go testing import

我有main.go中定义的功能,而这些功能在main_test.go中不可访问。但是,在一些在线教程中,我看到了可以访问的功能:我想了解不同之处,以及如何以惯用的方式构造这些功能。

具体来说,我有一个包含多个二进制文件的应用程序:

myapp/cmd/app/main.go
myapp/cmd/cli/main.go

目前,我在func main文件的main.go中运行了许多简单的单元测试逻辑。我只是在测试单个功能,并让它们打印输出,如果可以避免的话,我并没有试图调用“测试”套件的全部功能。

由于我在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" in any of: ..."

我是否有一种干净实用的方法来在测试文件中测试非常简单的单元测试并在主文件中运行函数,而无需进行大量重写导入或其他实质性的重新构架?

从某些链接中,我有一个印象,如果我制作了main_test.go,则导入将独立进行(如在这些示例中所示)。

因此,您会看到我有些困惑,教程是免费导入其函数的,而我没有,我只是想更好地理解魔术。

是因为我的函数defineInMain是小写的,是私有的吗?实际上,我确实希望此函数是私有的,但我希望将其以与main.go中可用的相同方式导出到main_test.go文件中。我是否必须完全公开才能在另一个文件中进行测试?这似乎是不正确的,例如,“只能在go中对公共方法进行单元测试吗?”

1 个答案:

答案 0 :(得分:1)

如果@Mustafa Simav要发布该答案,我会接受,但如果不是,请将其关闭:

解决方案是使用完整路径$GOPATH以下的非本地导入。 what_test.go确实可以正确自动导入,甚至是未导出的小写函数也可以正确导入,这正是我想要进行单元测试的内容。由于进口,这很难看。