如何导入go模块到/*_test.文件吗?



我如何将我的函数导入我的测试文件夹?我在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)
}
}

package main的编译工件是二进制文件,该二进制文件是包的下游用户将与之交互的内容。因此,验证package main行为的测试应该

针对二进制本身进行测试,而不是针对用于实现该二进制的单个函数。您可以通过使用os/exec包来运行go build cmd(也许使用-o标志将二进制输出到测试的临时目录),然后使用os/exec包来执行结果二进制来编写这样的测试。

或者,使用第三方测试包,如github.com/rogpeppe/testscript来编写更简洁的脚本驱动测试。

或者,将任何helper函数分解到internal包中,并测试这些包的导出函数。


使用这些方法中的任何一种,给定包的测试仍然属于与该包相同的目录。这样,当用户运行go test cmd时,他们可以确信cmd实际上是有效的——如果测试在不同的包中,他们显然不知道要运行go test test来测试cmd包。

相关内容

最新更新