Testy v Go a environment variables

(publikováno 13.07.2021) 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 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