Golang での引数の受け渡しのテスト
Golang では、引数を関数に渡すのが入力を提供する一般的な方法です。引数の受け渡しの正確性をテストすることは、コードの信頼性を確保するために非常に重要です。
課題
次のコード スニペットを考えてみましょう:
package main import ( "flag" "fmt" ) func main() { passArguments() } func passArguments() string { username := flag.String("user", "root", "Username for this server") flag.Parse() fmt.Printf("Your username is %q.", *username) usernameToString := *username return usernameToString }
このプログラムに引数 -user=bla を渡すと、「あなたのユーザー名は 'bla' です。」と正しく出力されます。課題は、コードを毎回手動で構築して実行することなく、この動作を検証するテストを作成することです。
The Attempt
One might尝试 os.Args を使用するテストで引数を指定するには:
package main import ( "os" "testing" ) func TestArgs(t *testing.T) { expected := "bla" os.Args = []string{"-user=bla"} actual := passArguments() if actual != expected { t.Errorf("Test failed, expected: '%s', got: '%s'", expected, actual) } }
ただし、このテストを実行すると、結果は
Your username is "root". Your username is "root". --- FAIL: TestArgs (0.00s) args_test.go:15: Test failed, expected: 'bla', got: 'root' FAIL coverage: 87.5% of statements FAIL tool 0.008s
解決策
問題は、os.Args がグローバル変数であるため、["args"] の初期値が上書きされることです。テストは、プログラムの他の部分に影響を与えます。これを解決するには、元の値を保存し、テスト後にそれを復元します。
oldArgs := os.Args defer func() { os.Args = oldArgs }() os.Args = []string{"cmd", "-user=bla"} // ...
以上がGolang 関数で引数の受け渡しを効果的にテストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。