为了账号安全,请及时绑定邮箱和手机立即绑定

调用同一包中的函数和变量,但使用构建标记调用不同的文件

调用同一包中的函数和变量,但使用构建标记调用不同的文件

Go
肥皂起泡泡 2022-08-24 16:16:02
我正在设置一些集成测试,这是我在src代码的单独测试包中完成的。这样做是为了防止循环依赖关系。单元测试不存储在此处,它们与正在测试的文件一起存储。我的 golang 项目层次结构如下所示:cmd public ...testing/ main_test.go database_test.go在main_test.go中,我计划初始化与外部依赖项(例如我的测试数据库)的连接。package teststype Database struct {...}var DB Databasefunc TestMain(m *testing.M){ SetUpDatabase() exitCode := m.Run() os.Exit(exitCode)}database_integration_test.gofunc 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()    }}此设置在我运行时有效,但是,我想向这些文件或类型添加构建标记:但是,一旦我使用构建标记,database_integration_test.go文件就无法看到初始化的数据库类型。我该如何阻止这种情况?另外作为旁注,我应该更改main_test.go的名称。我只是这么称呼它,因为main是站立的入口点。// +build integration
查看完整描述

2 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

首先,关于这一点:

另外作为旁注,我应该更改main_test.go的名称。我只是这么称呼它,因为main是标准的入口点。

我认为将其命名为main_test.go令人困惑,因为它可能表明您正在测试此文件中的main函数(根据惯例)golang

其次,关于这一点:

但是,一旦我使用 build 标记,database_integration_test.go 文件就看不到初始化的数据库类型。我该如何阻止这种情况?

生成约束(也称为生成标记)用于在生成过程中包含或排除包中的文件。有了这个,我们可以从相同的源代码构建不同类型的构建。

因此,如果您没有看到数据库类型初始化,则很可能数据库类型的定义和集成测试使用不同的构建标记进行标记。确保它们存在于相同的生成标记中。另外,我认为您可以使用多个构建标记来标记文件。所以你也可以尝试一下。

有关构建标签的更多详细信息,请查看Dave Cheney的以下文章


查看完整回答
反对 回复 2022-08-24
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

您可以简单地将标志添加到您的:TestMain


var isIntegration bool


func init() {

    flag.StringVar(&isIntegration, "mytest.integration", "Set flag to set up DB for integration tests")

}


func TestMain(t *testing.M) {

    SetUpDatabase(isIntegration)

    //etc...

}

然后,只需根据参数是否为 或 来让调用不同的、未导出的函数即可。这将是获取行为的快速方法,而不必过多地使用自定义构建约束。特别是考虑到您正在运行测试,而不是像这样构建应用程序。SetUpDatabasetruefalse


就重命名而言:我不明白为什么你需要改变它。它按照它在锡上所说的去做。当其他人想要查看测试的结构/运行方式,或者添加了哪些可能的标志时,只需检查目录并查找文件(以及 ,这将是我查找的第一个文件)要容易得多。任何其他名称,如 、 、 、 ...只会把水搅浑。main_test.gomain_test.goinit.gosetup_integration_test.gointegration_setup_test.gointegration_start_test.go


查看完整回答
反对 回复 2022-08-24
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号