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

Set particular environment variables during execution of a test suite

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

某时我去了(没有双关语意)

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

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

您可以使用 os.Environ to obtain the current environment and os.Unsetenv 取消设置。

大概您还需要在测试完成后恢复这些变量,为此您可以使用 subtest per environment with (*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 标志的子测试来重新执行特定的子测试作为子进程主要测试过程的一部分,具有自己独特的环境。