go - 在执行测试套件期间设置特定的环境变量

标签 go testing environment-variables

我想在 Go 中运行一个与环境变量有关的单元测试 fxn。

在某个时候我会去(没有双关语)

    for test := range tests {
        for k, v := range test.envVars {
            os.Setenv(k, v)
        }

有没有办法确保在测试执行期间,通过调用上面的 os.Setenv() 设置的变量将是唯一可用的环境变量到测试功能?

最佳答案

您可以使用os.Environ获取当前环境和os.Unsetenv取消设置。

大概您还需要在测试完成后恢复这些变量,为此您可以使用 subtest每个环境 (*testing.T).Cleanup (https://play.golang.org/p/A5HGZwWm-NS):

    for _, tc := range tests {
        t.Run(tc.name, func(t *testing.T) {
            // NOTE: do NOT call t.Parallel in this subtest or its parent,
            // or the environment WILL be corrupted.
            //
            // (However, *subtests of* t may be run in parallel.)

            prevEnv := os.Environ()
            for _, entry := range prevEnv {
                parts := strings.SplitN(entry, "=", 2)
                os.Unsetenv(parts[0])
            }
            for k, v := range tc.envVars {
                os.Setenv(k, v)
            }
            t.Cleanup(func() {
                for k := range tc.envVars {
                    os.Unsetenv(k)
                }
                for _, entry := range prevEnv {
                    parts := strings.SplitN(entry, "=", 2)
                    os.Setenv(parts[0], parts[1])
                }
            })

            …
        })
    }

另请注意,Go 1.17 添加了 (*testing.T).Setenv方法,自动清除修改。但是,还没有相应的 (*testing.T).Unsetenv


如果您希望能够并行运行测试,您可以使用带有 os/exec-test.run 标志的子测试来重新执行特定的子测试作为主测试流程的子流程,具有自己独特的环境。

关于go - 在执行测试套件期间设置特定的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68686006/

相关文章:

go - 使用 FUSE 以目录形式命名管道

android - 是否可以将 Android 应用程序设置为连接到开发服务器?

c# - 单元测试 EF 数据模型

java - 外部化 Grails 应用程序的运行配置

templates - 你如何传递多个对象去模板?

go - 如何从bazel目标读取静态文件?

go - 在Golang中使用上下文超时停止运行功能

java - 我可以使用模拟检查数据库查询的返回值吗?

java - RHEL 5 - 路径环境变量更改不生效

Flutter:使构建时环境变量可用于代码