我如何将我的函数导入我的测试文件夹?我在cmd目录下运行go mod init
,它创建了一个go。mod文件与module "cmd"
,但是,当我试图在测试中导入它,我无法访问的功能。我在根项目目录下运行go test ./test
,错误是:test/services_test.go:4:2: "cmd" is not an importable package;
myproject
├── cmd
├── main.go (package main)
├── helper.go (package main)
└── services.go (package main)
├── test
├── helper_test.go (package_main)
└── services_test.go (package main)
├── go.mod (module cmd)
└── go.sum
在cmd/services.go
package main
func doStuff() {
// TODO
}
在测试/services_test.go
package main
import {
"cmd"
"testing"
}
func TestdoStuff (*testing.T) {
cmd.doStuff()
}
给定包的测试应该在该包中,以便它们可以看到该包的未导出的变量、字段和方法,并且根本不需要导入该包。不要把它们放在单独的test
目录下。
你可以导入其他包来测试这个包,但是你将无法看到其他包中未导出的内容。在这方面,测试与其他文件没有什么不同。
正如其他答案所指出的,测试文件必须位于相同的目录作为测试文件。你可以查看教程创建一个Go模块,然后添加一个测试。
以下是这些教程中的示例:
myproject
├── greetings
├── greetings.go (package greetings)
├── greetings_test.go (package greetings)
├── go.mod
└── go.sum
的问候。文件:
package greetings
import "fmt"
// Hello returns a greeting for the named person.
func Hello(name string) string {
// Return a greeting that embeds the name in a message.
message := fmt.Sprintf("Hi, %v. Welcome!", name)
return message
}
和greetings_test。
package greetings
import (
"testing"
"regexp"
)
// TestHelloName calls greetings.Hello with a name, checking
// for a valid return value.
func TestHelloName(t *testing.T) {
name := "Gladys"
want := regexp.MustCompile(`b`+name+`b`)
msg, err := Hello("Gladys")
if !want.MatchString(msg) || err != nil {
t.Fatalf(`Hello("Gladys") = %q, %v, want match for %#q, nil`, msg, err, want)
}
}
// TestHelloEmpty calls greetings.Hello with an empty string,
// checking for an error.
func TestHelloEmpty(t *testing.T) {
msg, err := Hello("")
if msg != "" || err == nil {
t.Fatalf(`Hello("") = %q, %v, want "", error`, msg, err)
}
}
针对二进制本身进行测试,而不是针对用于实现该二进制的单个函数。您可以通过使用 或者,使用第三方测试包,如 或者,将任何helper函数分解到 使用这些方法中的任何一种,给定包的测试仍然属于与该包相同的目录。这样,当用户运行package main
的编译工件是二进制文件,该二进制文件是包的下游用户将与之交互的内容。因此,验证package main
行为的测试应该os/exec
包来运行go build cmd
(也许使用-o
标志将二进制输出到测试的临时目录),然后使用os/exec
包来执行结果二进制来编写这样的测试。github.com/rogpeppe/testscript
来编写更简洁的脚本驱动测试。internal
包中,并测试这些包的导出函数。go test cmd
时,他们可以确信cmd
实际上是有效的——如果测试在不同的包中,他们显然不知道要运行go test test
来测试cmd
包。