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

1
2
3
4
5
6
7
8
9
10
11
12
13
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)
    }
}

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

1
2
3
4
5
6
7
8
9
10
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)
}
  • 并不是的。 初始化函数的要点将在所有其他函数之前自动调用。 如果希望能够在初始化之前执行某些操作,则需要将其移出初始化。 (同样,读取环境变量不是您通常要测试的内容。读取它们的代码应分别进行测试)
  • 也许这将有助于stackoverflow.com/questions/23729790/

不太理想,但这对我有用。
在要测试的包装内:

1
2
3
4
5
6
7
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
    }
    //...
}
  • 这不是正确的方法。 请参阅golang.org/pkg/testing或stackoverflow.com/questions/23729790/

您可以在实际测试之前添加Test_parse_params(t * testing.T)函数。 看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
type envVars struct {
    Host     string `env:"APP_HOST"`
    Username string `env:"APP_USERNAME"`
    Password string `env:"APP_PASSWORD"`
}

var envConfig envVars

//parse command params
func Test_parse_params(t *testing.T) {
    if err := env.Parse(&envConfig); err != nil {
        log.Fatal(err)
    }
}

func Test_real_test(t *testing.T) {
....
}