Go で引数の解析をテストする方法
フラグ パッケージを使用してコマンドライン引数を解析する次の Go コードを考えてみましょう。
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"
ただし、この動作を次のテストでテストしようとすると:
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) } }
エラーが発生します:
FAIL coverage: 87.5% of statements FAIL tool 0.008s
この失敗の理由は、単に os.Args を新しいスライスに設定したことです。引数を関数に渡しません。これを解決するには、次の改訂されたテストで実証されているように、os.Args の最初の値が実行可能ファイル自体 (へのパス) であることを確認する必要があります。
func TestArgs(t *testing.T) { expected := "bla" oldArgs := os.Args defer func() { os.Args = oldArgs }() os.Args = []string{"cmd", "-user=bla"} actual := passArguments() if actual != expected { t.Errorf("Test failed, expected: '%s', got: '%s'", expected, actual) } }
os.Args の復元を延期することによって元の状態に戻すと、go test を呼び出すときに渡される実際の引数を検査する可能性のある他のテストにテストが干渉しないことを確認できます。
以上が単体テストで Go の「flag」パッケージの引数解析を適切にテストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。