Go で引数を渡すテスト
問題:
引数を検証するテストを作成するときos.Args を使用して Go に渡すと、予期した引数が受け取られないという予期しない動作が発生します。 function.
コード スニペット:
package main import ( "flag" "fmt" "testing" "os" ) 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 } 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) } }
試行:
次のテストは失敗し、引数が渡されていない正しく:
--- 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 の割り当てにあります。構文は次のとおりです:
os.Args = []string{"cmd", "-user=bla"}
さらに、テスト前に os.Args の元の値を保存し、後で復元することをお勧めします:
oldArgs := os.Args defer func() { os.Args = oldArgs }()
これにより、他のテストが実行されなくなります。 ~の変更の影響を受けるos.Args.
説明:
os.Args スライスは、プログラムに渡される元の引数を含む「グローバル変数」です。新しいスライスを os.Args に割り当てることで、元の引数を効果的に置き換えます。 os.Args の最初の要素は通常、実行可能ファイルへのパスです。引数リストの先頭に「cmd」を追加することで、関数が正しい引数値を受け取るようになります。
テスト後に os.Args の元の値を復元することは、他のテストで一貫した環境を維持するための良い習慣です。
以上が「os.Args」を使用した引数の受け渡しの Go テストが失敗するのはなぜですか?どうすれば修正できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。