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

时间:2016-07-20 15:39:13

标签: 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)
    }
}

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

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)
}

5 个答案:

答案 0 :(得分: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
    }
    //...
}

答案 1 :(得分:1)

您可以使用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
}

答案 2 :(得分:0)

您的Go测试功能应该是独立的,并测试一个功能。但在这种情况下,它取决于其他一些不是很好的测试方法。并且init()是在代码执行中作为第一步加载的一些东西,我不认为在测试方法中使用init是非常正确的方法。

答案 3 :(得分:0)

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

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) {
....
}

答案 4 :(得分:0)

不,您不应该期望init()以某种顺序运行(实际上,它是基于文件加载顺序的,但仍然不应指望它)。

简单的方法是,如果要测试它,请使用Shell脚本运行测试或Makefile之类的东西。

Shell示例:

set +e
export APP_HOST=http://localhost:9999
export APP_USERNAME=john
export APP_PASSWORD=doe
go test .
unset APP_HOST
unset APP_USERNAME
unset APP_PASSWORD

或单行命令:

APP_HOST=http://localhost:9999 APP_USERNAME=john APP_PASSWORD=doe go test .

编辑:

其他解决方案:将读取的env从init函数中移出。

func init(){
  envInit()
}
func envInit(){
 if err := env.Parse(&envConfig); err != nil {
        log.Fatal(err)
    }
}

然后,您可以在测试中再次调用envInit以确保它可以正常工作。

相关问题