在Golang测试中如何加载.env.test文件
在Golang测试中如何加载.env.test文件
我想在运行 go test 命令时加载 .env.test 文件,但在运行 go run 时保持使用当前的 .env 文件。
我当前的代码如下:
godotenv.Load()
err := godotenv.Load(filepath.Join("…/…/", “.env”))
if err != nil {
fmt.Println("Error: ", err)
}
5 回复
我真的找不到解决方案,你能提供一个符合我所说的例子吗?
更多关于在Golang测试中如何加载.env.test文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
该链接指向的是 TestMain 函数的文档,你可以提供此函数来为测试进行特殊的初始化。这很可能就是你想要加载环境变量的地方。
testing package - testing - pkg.go.dev
Package testing provides support for automated testing of Go packages.
结果是,当我运行 go run main.go 时,它会加载 .env 文件,但当我运行 go test 时,它会使用我传递给这行代码的内容:err := godotenv.Load(filepath.Join("…/…/", “.env.test”))。
所以现在它可以正常工作了。
err := godotenv.Load(filepath.Join("…/…/", “.env.test”))
在Go测试中加载.env.test文件,可以使用testing包的TestMain函数结合环境变量判断。以下是具体实现:
package main
import (
"os"
"path/filepath"
"testing"
"github.com/joho/godotenv"
)
func TestMain(m *testing.M) {
// 检查是否在测试环境中
if os.Getenv("GO_ENV") == "test" || len(os.Args) > 0 && filepath.Base(os.Args[0]) == "test" {
// 加载测试环境变量文件
err := godotenv.Load(".env.test")
if err != nil {
// 如果.env.test不存在,尝试加载默认.env文件
_ = godotenv.Load(".env")
}
} else {
// 非测试环境加载默认.env文件
_ = godotenv.Load(".env")
}
// 运行测试
os.Exit(m.Run())
}
或者使用更简洁的方式,在测试初始化时直接加载:
// init_test.go 文件
package main
import (
"os"
"testing"
"github.com/joho/godotenv"
)
func init() {
// 仅在测试时加载.env.test
if testing.Testing() {
// 优先加载.env.test,失败则加载.env
if err := godotenv.Load(".env.test"); err != nil {
_ = godotenv.Load(".env")
}
}
}
对于特定测试文件,可以在测试函数开始时加载:
func TestSomething(t *testing.T) {
// 加载测试环境变量
_ = godotenv.Load(".env.test")
// 测试逻辑
// ...
}
设置环境变量控制加载逻辑:
// 通过环境变量控制
func init() {
envFile := ".env"
if os.Getenv("APP_ENV") == "test" {
envFile = ".env.test"
}
_ = godotenv.Load(envFile)
}
运行测试时指定环境变量:
APP_ENV=test go test ./...
# 或
GO_ENV=test go test ./...

