如何在 Go 中測試參數解析
考慮以下 Go 程式碼,它使用 flag 套件解析命令列參數:
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 設定為新的slice 不將參數傳遞給函數。為了解決這個問題,我們需要確保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中文網其他相關文章!