我想在 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/