在Golang中将变量传递给测试用例的惯用方式

Jac*_*cob 6 go

在为golang编写测试用例时,传递需要提供给测试的变量的标准方法是什么。例如,我们不想在测试用例的源代码中嵌入密码。

处理此问题的最标准方法是什么?我们是否有测试用例寻找配置文件?环境变量?还有吗

moz*_*zey 9

使用环境变量

func func TestFoo(t *testing.T) {
  x := os.Getenv("MY_X")
  fmt.Println(x)
}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用你的测试

MY_X=bar go test -v ./... -run TestFoo
Run Code Online (Sandbox Code Playgroud)

它应该打印 bar


Jac*_*cob 6

看来我偶然发现了答案。将其添加到测试用例中可以传递参数,即

var password string

func init() {
        flag.StringVar(&password, "password", "", "Database Password")
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以执行以下操作:

go test github.com/user/project -password=123345
Run Code Online (Sandbox Code Playgroud)

(如下所述,请不要在不信任测试服务器上有权查看正在运行的进程的其他用户的测试中执行此操作(即,也许测试数据库中包含敏感数据。但是。在喜欢将敏感数据保存在测试环境中的组织中,这可能是您最少的安全问题)

  • 看起来像是在开玩笑。是的-密码不是来源的一部分,但是在大多数计算机中,任何用户都可以看到其他用户的进程。每个可以在同一台计算机上计费并且在特定时间内意外运行_ps ax_的人都会看到您的密码。通常,此类敏感数据存储在文件中。 (2认同)
  • 我不这么认为。在大学里很正常,每个学生在同一台机器上都有帐户。但是当然没有其他学生可以访问该同学的文件。还有另一个不通过命令行传递敏感数据的小原因 - 数据也存储在意外的存储中 - 在文件 .bash_history 中。 (2认同)
  • @PennyQian 的评论非常重要。人们可以通过在 TestMain 函数中执行标志解析来改进这个答案: `func TestMain(m *testing.M) { flag.StringVar(&password, "password", "", "Database password") flag.Parse() if password == "" { use() log.Fatal("请设置数据库密码") } retCode := m.Run() os.Exit(retCode) }` (2认同)
  • @PennyQian 在 `init()` 或 `TestMain()` 中不需要 `flag.Parse()` 因为就像 @DaveC 所说,**命令行标志总是在测试或基准函数运行时解析**,除非init() 或 **TestMain 取决于命令行标志,包括测试包的标志,它应该显式调用 flag.Parse。** (突出显示部分来自 golang 测试文档 https://golang.org/pkg/测试/#hdr-Main) (2认同)