Article in English can be found on dev.to/arxeiss/auto-reset-environment-variables-when-testing-in-go-5ec
Někdy nastanou situace, kdy pro jednotlivé testy je potřeba nastavit různé hodnoty do environment variables. A protože testy by po sobě měly vždy uklidit, aby neovlivnily jiné testy, je potřeba tyto hodnoty resetovat do výchozích hodnot. A je nutné to udělat manuálně.
Pomocná funkce t.Cleanup() / defer
Je vhodné si napsat pomocnou funkci, která proměnné nastaví a rovněž po skončení testů je resetuje do původních hodnot, nebo odstraní.
func envSetter(envs map[string]string) (closer func()) {
originalEnvs := map[string]string{}
for name, value := range envs {
if originalValue, ok := os.LookupEnv(name); ok {
originalEnvs[name] = originalValue
}
_ = os.Setenv(name, value)
}
return func() {
for name := range envs {
origValue, has := originalEnvs[name]
if has {
_ = os.Setenv(name, origValue)
} else {
_ = os.Unsetenv(name)
}
}
}
}
Použití
Pro použití stačí zavolat pomocnou funkci a vrácený callback zavolat pomocí t.Cleanup() v Go 1.14+ nebo defer ve starších verzích. Tím se po skončení testu vše resetuje na původní hodnoty.
func TestFunctionWithEnvVars(t *testing.T) {
closer := envSetter(map[string]string{
"MY_ENV_VARS": "with some value",
"MY_ANOTHER_ENV_VARS": "again with some value",
})
t.Cleanup(closer) // Pro Go 1.14+
// defer closer() // Do verze Go 1.14
// ...
}
Vlastní zkušenosti s testováním a environment variables lze sdílet v komentářích
K tomuto článku již není možné přidávat další komentáře