猿问

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

我正在设置一些集成测试,这是我在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()

    }

}

此设置在我运行时有效,但是,我想向这些文件或类型添加构建标记:但是,一旦我使用构建标记,database_integration_test.go文件就无法看到初始化的数据库类型。我该如何阻止这种情况?另外作为旁注,我应该更改main_test.go的名称。我只是这么称呼它,因为main是站立的入口点。// +build integration


肥皂起泡泡
浏览 136回答 2
2回答

千万里不及你

首先,关于这一点:另外作为旁注,我应该更改main_test.go的名称。我只是这么称呼它,因为main是标准的入口点。我认为将其命名为main_test.go令人困惑,因为它可能表明您正在测试此文件中的main函数(根据惯例)golang其次,关于这一点:但是,一旦我使用 build 标记,database_integration_test.go 文件就看不到初始化的数据库类型。我该如何阻止这种情况?生成约束(也称为生成标记)用于在生成过程中包含或排除包中的文件。有了这个,我们可以从相同的源代码构建不同类型的构建。因此,如果您没有看到数据库类型初始化,则很可能数据库类型的定义和集成测试使用不同的构建标记进行标记。确保它们存在于相同的生成标记中。另外,我认为您可以使用多个构建标记来标记文件。所以你也可以尝试一下。有关构建标签的更多详细信息,请查看Dave Cheney的以下文章

翻过高山走不出你

您可以简单地将标志添加到您的:TestMainvar isIntegration boolfunc 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
随时随地看视频慕课网APP

相关分类

Go
我要回答