将数据库凭据传递给go中的测试?

时间:2018-01-06 17:49:33

标签: go testing credentials

我尝试了几种方法(如下所示),但我不喜欢它们中的任何一种。所以我决定向社区询问是否有更好的方法。

方法1

将数据库凭据作为参数传递:

go test -args -db_user=test -db_pass=secret

然后在测试中使用它:

package my_test
var dbUser = flag.String("db_user", "", "test database user")
var dbPass = flag.String("db_pass", "", "test database password")

func TestSomething(t *testing.T) {
    db := open(*dbUser, *dbPass)
}

方法2

在运行测试之前设置环境变量:

$ export TEST_DB_USER=user
$ export TEST_DB_PASS=secret
$ go test

$ TEST_DB_USER=user TEST_DB_PASS=secret go test -v

然后在测试中使用它:

package my_test
var dbUser = flag.String("db_user", "", "test database user")
var dbPass = flag.String("db_pass", "", "test database password")

func TestSomething(t *testing.T) {
    db := open(os.Getenv("TEST_DB_USER"), os.Getenv("TEST_DB_PASS"))
}

方法3

在运行测试之前,使用.env.test文件和github.com/joho/godotenv包加载数据库连接凭据。

1 个答案:

答案 0 :(得分:0)

由于以下原因,环境变量往往是最佳选择:

  • 更容易在本地环境中持续设置
  • 大多数测试基础架构允许您指定环境变量,并且通常有办法将它们标记为"敏感" (在设置后不可见)并且可以通过构建类型进行限制(以使贡献者无法泄露凭据)
  • 环境变量在流程列表/日志中不可见(除非有意列出)。命令行标志是。
  • 可以处理任何事情,而不仅仅是去。 (例如:如果您需要AWS凭据,相同的设置将适用于大多数AWS库)。

但总的来说,这个问题太广泛了。最终的答案取决于每天需要运行测试的项目人员。它还大量依赖于您的测试基础架构。

最后:如果这是单元测试,你不应该需要数据库凭证,应该嘲笑外部服务。您也不希望贡献者需要数据库凭据来运行单元测试。

如果这是用于集成测试,那么您的测试基础架构将是最重要的因素。