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) } }
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 = []string{"-user=bla不能够这个参数传递给函数的结果是root不是bla
os.Args = []string{"-user=bla
root
bla
根据我的评论,第一个值os.Args是可执行文件本身的(路径),因此os.Args = []string{"cmd", "-user=bla"}应解决您的问题。您可以从标准包中查看标志测试,他们正在做类似的事情。
os.Args
os.Args = []string{"cmd", "-user=bla"}
另外,就像os.Args“全局变量”一样,最好保持测试之前的状态并在测试之后恢复状态。与链接测试类似:
oldArgs := os.Args defer func() { os.Args = oldArgs }()
例如,在其他测试正在检查调用时传递的真实参数时,这可能会很有用go test。
go test