一尘不染

如何在Golang中测试参数的传递?

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)
    }
}

结果是:

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


阅读 240

收藏
2020-07-02

共1个答案

一尘不染

根据我的评论,第一个值os.Args是可执行文件本身的(路径),因此os.Args = []string{"cmd", "-user=bla"}应解决您的问题。您可以从标准包中查看标志测试,他们正在做类似的事情。

另外,就像os.Args“全局变量”一样,最好保持测试之前的状态并在测试之后恢复状态。与链接测试类似:

oldArgs := os.Args
defer func() { os.Args = oldArgs }()

例如,在其他测试正在检查调用时传递的真实参数时,这可能会很有用go test

2020-07-02