go 的测试文件(_test.go)默认不参与构建,因此无法直接导出供其他包的测试文件使用;但可通过构建标签(build constraints)将共享测试数据定义在非 _test.go 文件中,并配合 `-tags` 参数启用。
在 Go 中,*_test.go 文件仅在运行 go test 时被编译,且不会被包含在常规包构建产物中——这意味着即使你将函数或变量声明为导出(首字母大写),其他包(包括其他测试包)也无法导入或调用它们。这也是你遇到 undefined B.ExportedVars 错误的根本原因:B_test.go 中的代码对 A_test.go 完全不可见。
你需要将共享的测试数据或工具函数移出 _test.go 文件,放入普通 .go 文件(如 testdata.go 或 shared_test.go),并使用构建约束(Build Constraint)确保它仅在测试时被编译,同时又能被多个测试包导入。
假设你有两个包 a 和 b,希望在 a/a_test.go 中使用 b 包定义的测试数据:
// b/testdata.go
// +build testdata
package b
// ExportedVars 是导出的测试数据,仅在启用 testdata 标签时编译
func ExportedVars() []int {
return []int{0, 1}
}? 关键点:// +build testdata 是构建约束注释(Go 1.17+ 推荐使用 //go:build testdata,兼容写法可并存),该文件仅当指定 -tags testdata 时才参与构建。
// a/a_test.go
package a
import (
"testing"
"your-module/b" // 替换为实际模块路径
)
func TestWithSharedData(t *testin
g.T) {
data := b.ExportedVars()
if len(data) != 2 {
t.Fatal("expected 2 items")
}
}go test ./a ./b -tags testdata # 或只测 a 包(仍需加载 b 的 testdata) go test ./a -tags testdata
✅ 成功!b.ExportedVars() 现在可被 a_test.go 调用。
//go:build testdata // +build testdata
此模式不仅适用于共享测试数据,还可用于:
只要逻辑属于“测试基础设施”,且需跨包复用,构建标签就是 Go 生态中最简洁、最标准的解决方案。