将数据库凭据传递给测试?
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 库)。
但总的来说,这个问题太宽泛了。最终答案取决于每天需要 运行 测试的项目工作人员。它还在很大程度上取决于您的测试基础设施。
最后:如果这是用于单元测试,则您不需要数据库凭据,应该模拟外部服务。您也不希望贡献者需要数据库凭据才能进行 运行 单元测试。
如果这是针对集成测试,您的测试基础设施将是最重要的因素。
我尝试了几种方法(如下所示),但我都不喜欢其中任何一种。所以我决定向社区询问是否有更好的方法。
方法一
将数据库凭据作为参数传递:
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 库)。
但总的来说,这个问题太宽泛了。最终答案取决于每天需要 运行 测试的项目工作人员。它还在很大程度上取决于您的测试基础设施。
最后:如果这是用于单元测试,则您不需要数据库凭据,应该模拟外部服务。您也不希望贡献者需要数据库凭据才能进行 运行 单元测试。
如果这是针对集成测试,您的测试基础设施将是最重要的因素。