在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 函数的文档,你可以提供此函数来为测试进行特殊的初始化。这很可能就是你想要加载环境变量的地方。

pkg.go.dev

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 ./...
回到顶部