将数据库凭据传递给测试?

Passing database credentials to tests in go?

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

方法一

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

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

方法二

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

$ 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 包加载数据库连接凭据。

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

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

但总的来说,这个问题太宽泛了。最终答案取决于每天需要 运行 测试的项目工作人员。它还在很大程度上取决于您的测试基础设施。

最后:如果这是用于单元测试,则您不需要数据库凭据,应该模拟外部服务。您也不希望贡献者需要数据库凭据才能进行 运行 单元测试。

如果这是针对集成测试,您的测试基础设施将是最重要的因素。