使用构建标记调用同一包中的函数和变量但不同的文件
我正在设置一些集成测试,我正在一个单独的测试包中进行我的 src 代码。这样做是为了防止循环依赖。单元测试不存储在这里,它们与它们正在测试的文件一起存储。
我的 golang 项目层次结构如下所示:
cmd public ... testing/ main_test.go database_test.go
在 main_test.go 中,我计划初始化与外部依赖项的连接,例如我的测试数据库。
package tests
type Database struct {
...
}
var DB Database
func TestMain(m *testing.M){
SetUpDatabase()
exitCode := m.Run()
os.Exit(exitCode)
}
database_integration_test.go
func Test(t *testing.T) {
tests := []struct {
title string
run func(t *testing.T)
}{
{"should make query", testQuery},
}
for _, test := range tests {
t.Run(test.title, func(t *testing.T) {
test.run(t)
})
}
}
func testQuery(t *testing.T) {
var r result.Result
err := DB.database.DoQuery("").Decode(&r)
if err != nil {
t.Errorf(err.Error())
t.Fatal()
}
}
这个设置在我运行时有效,但是,我想向这些文件或类型添加构建标记:// +build integration
但是,一旦我使用构建标记,database_integration_test.go 文件就无法看到初始化的数据库类型。我怎么能阻止这个?另外作为旁注,我是否应该更改 main_test.go 的名称。由于 main 是标准入口点,我才这么称呼它。
回答
首先,关于这个:
另外作为旁注,我是否应该更改 main_test.go 的名称。由于 main 是标准入口点,我才这么称呼它。
我认为将其命名为 main_test.go 令人困惑,因为它可能表明您正在测试此文件中的 main 函数(根据golang约定)
其次,关于这个:
但是,一旦我使用构建标记,database_integration_test.go 文件就无法看到初始化的数据库类型。我怎么能阻止这个?
构建约束或也称为构建标记用于在构建过程中包含或排除包中的文件。有了这个,我们可以从相同的源代码构建不同类型的构建。
因此,如果您没有看到初始化的数据库类型,那么很可能是数据库类型的定义和集成测试用不同的构建标签进行了标记。确保它们出现在相同的构建标签中。另外,我认为您可以使用多个构建标记来标记文件。所以你也可以试试。
有关构建标签的更多详细信息,请在此处查看Dave Cheney 撰写的以下文章