如何在 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中文网其他相关文章!