3 回答
TA贡献1831条经验 获得超9个赞
给定包的测试应位于该包中,以便它们可以看到该包的未导出变量、字段和方法,并且根本不需要导入该包。不要将它们放在单独的目录中。test
如有必要,您可以导入其他包来测试此包,但无法看到其他包中未导出的内容。在这方面,测试与任何其他文件没有什么不同。
TA贡献1871条经验 获得超13个赞
正如其他答案中指出的那样,测试文件必须与测试文件位于同一目录中。可以查看教程创建 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.go 文件包含两个测试:
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)
}
}
TA贡献1821条经验 获得超5个赞
的 已编译项目是二进制文件,该二进制文件是包的下游用户将与之交互的内容。因此,验证 行为的测试应该针对二进制文件本身进行测试,而不是针对用于实现该二进制文件的单个函数进行测试。package mainpackage main
可以通过以下方法编写此类测试:使用要运行的包(可能使用标志将二进制文件输出到测试的临时目录),然后使用包执行生成的二进制文件。os/execgo build cmd-oos/exec
或者,使用第三方测试包(如 github.com/rogpeppe/testscript)编写更简洁的脚本驱动测试。
或者,将任何帮助程序函数分解为内部包,并测试这些包的导出函数。
使用上述任何一种方法,给定包的测试仍与该包属于同一目录。这样,当用户运行时,他们可以确信它确实有效 - 如果测试位于不同的包中,他们显然不会知道为了测试包而运行。go test cmdcmdgo test testcmd
- 3 回答
- 0 关注
- 141 浏览
添加回答
举报
