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 }
コンパイル済みのコードに引数を渡します。コマンドを使用したコード:
./args -user=bla
これにより、次の出力:
Your username is "bla"
テスト手法
手動でのコンパイルと実行を回避するために、引数の受け渡しを検証するテストを作成することを目指します。テスト関数を作成します:
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
引数「bla」が関数に渡されないため、表示される結果は「root」になります。 username.
解決策
問題は os.Args の設定にあります。 os.Args の最初の引数は、実行可能ファイル自体へのパスです。これを修正するには、次のように変更します。
os.Args = []string{"cmd", "-user=bla"}
さらに、正しい引数に依存する他のテストでは、元の os.Args 状態を保存し、テスト後にそれを復元することをお勧めします。
以上がGo で引数の受け渡しを正しくテストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。