Testy v Go a environment variables

Go, Windows, Linux

V testování je nejnáročnější jednotlivé testy spolehlivě oddělit od sebe. A při testování s environment variables to může být o to náročnější, protože je nutné je resetovat manuálně.

Testy v Go a environment variables

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 a 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í. Toho je možné docílit pomocí konstruktu defer

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í defer. Tím se vždy po skončení funkce vše resetuje do původních hodnot. 

func TestFunctionWithEnvVars(t *testing.T) {
	closer := envSetter(map[string]string{
		"MY_ENV_VARS":         "with some value",
		"MY_ANOTHER_ENV_VARS": "again with some value",
	})
	defer closer()
	// ...
}

Vlastní zkušenosti s testováním a environment variables lze sdílet v komentářích

Přidat komentář

Položky označené * jsou povinné. Email nebude zveřejněn

Buď první, kdo přidá komentář. Zatím zde nic není