Golang:使用 init() 函数进行测试

Shr*_*rma 9 go

嗨,我是 Go 的新手,我正在编写一个简单的应用程序,它从 env 变量中获取一些配置。我在 init 函数中执行此操作,如下所示。

type envVars struct {
    Host     string `env:"APP_HOST"`
    Username string `env:"APP_USERNAME"`
    Password string `env:"APP_PASSWORD"`
}

var envConfig envVars

func init() {
    if err := env.Parse(&envConfig); err != nil {
        log.Fatal(err)
    }
}
Run Code Online (Sandbox Code Playgroud)

我编写了测试来验证是否正确读取了 env 变量。但问题是我的程序的 init func 甚至在我的测试的 init func 之前就被调用了。有什么办法可以在我的程序的 init func 被调用之前进行某种设置。

func init() {
    os.Setenv("APP_HOST", "http://localhost:9999")
    os.Setenv("APP_USERNAME", "john")
    os.Setenv("APP_PASSWORD", "doe")
}

func TestEnvConfig(t *testing.T) {
    assert.NotNil(t, envConfig)
    assert.Equal(t, "http://localhost:9999", envConfig.Host)
}
Run Code Online (Sandbox Code Playgroud)

小智 12

您可以使用 TestMain 函数来控制测试之前和之后发生的情况。

例如:

func TestMain(m *testing.M) {
    // Write code here to run before tests
    
    // Run tests
    exitVal := m.Run()
    
    // Write code here to run after tests

    // Exit with exit value from tests
    os.Exit(exitVal)
}

func TestYourFunc(t *testing.T) {
    // Test code
}
Run Code Online (Sandbox Code Playgroud)


Vol*_*der -1

不太理想,但这对我有用。您正在测试的包内部:

func init() {
    if len(os.Args) > 1 && os.Args[1][:5] == "-test" {
        log.Println("testing")//special test setup goes goes here
        return // ...or just skip the setup entirely
    }
    //...
}
Run Code Online (Sandbox Code Playgroud)