如何测试 Golang 中参数的传递?
How to test the passing of arguments in 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"
显示已通过的用户名。
目的:为了防止每次都需要手动构建代码和运行来测试代码,目的是编写一个测试能够测试参数的传递。
尝试
运行以下测试:
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
中的第一个值是可执行文件本身的(路径),因此 os.Args = []string{"cmd", "-user=bla"}
应该可以解决您的问题。您可以从他们正在做类似事情的标准包中查看 flag test。
此外,由于 os.Args
是 "global variable",最好保留测试前的状态并在测试后恢复。与链接测试类似:
oldArgs := os.Args
defer func() { os.Args = oldArgs }()
这可能对其他测试有用,例如,检查调用 go test
时传递的实际参数。
虽然看起来已经过时了,但仍然被搜索出来了。
因为Go 1.13 changed sth.
我发现 this change 有用,将 flag.*()
放入 init() 并将 flag.Parse()
放入 Test*()
-args 后面不能带-<test-args>=<val>
,只能带<test-args>
,否则test-args会被当作go test的命令行参数,而不是你的Test*的
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
中的第一个值是可执行文件本身的(路径),因此 os.Args = []string{"cmd", "-user=bla"}
应该可以解决您的问题。您可以从他们正在做类似事情的标准包中查看 flag test。
此外,由于 os.Args
是 "global variable",最好保留测试前的状态并在测试后恢复。与链接测试类似:
oldArgs := os.Args
defer func() { os.Args = oldArgs }()
这可能对其他测试有用,例如,检查调用 go test
时传递的实际参数。
虽然看起来已经过时了,但仍然被搜索出来了。 因为Go 1.13 changed sth.
我发现 this change 有用,将 flag.*()
放入 init() 并将 flag.Parse()
放入 Test*()
-args 后面不能带-<test-args>=<val>
,只能带<test-args>
,否则test-args会被当作go test的命令行参数,而不是你的Test*的