执行go test报错无法读取根目录配置文件问题咨询
Go测试读取配置文件报不存在的问题解决
核心结论
- Go执行测试时,工作目录是被测包所在的目录,不是项目根目录。
你执行go test -v ./model/...时,测试进程的工作目录是项目下的model/文件夹,config包init阶段用相对路径config.yaml查找文件,实际查找路径是model/config.yaml,所以报不存在;正常启动应用时你是在项目根目录执行命令,相对路径匹配因此能正常读取。
对应报错表现:
server git:(main) ➜ go test -v ./model/... 2022/07/06 15:46:21 config.go:72: Reading config file config.yaml 2022/07/06 15:46:21 config.go:75: open config.yaml: no such file or directory FAIL github.com/texbazaar/server/model 0.141s FAIL server git:(main) ➜
零重构解决方案(优先推荐)
不需要调整现有业务代码结构,只需要在model包任意一个_test.go测试文件中添加TestMain入口,测试启动时自动把工作目录切回项目根即可:
func TestMain(m *testing.M) { // 路径根据model目录相对于项目根的层级调整 // 如果model是项目根下的一级目录就用../,嵌套多层就补对应数量的../ err := os.Chdir("../") if err != nil { log.Fatalf("切换工作目录失败: %v", err) } os.Exit(m.Run()) }
记得在测试文件中导入os、log依赖,添加后所有测试用例执行前都会先完成目录切换,config包init阶段就能正常找到项目根下的config.yaml。
其他轻量可选方案
如果不想在测试里加目录切换逻辑,也可以选改动量同样很小的方案:
- 给配置读取逻辑加路径探测:init读取配置时,依次尝试
./config.yaml、../config.yaml、../../config.yaml等常用相对路径,找到存在的文件就加载,兼容正常启动、不同目录下跑测试的场景。 - 增加环境变量适配:config包读取配置时优先判断
CONFIG_PATH环境变量,如果存在就用该路径加载配置,跑测试前提前把环境变量设为配置文件的绝对路径即可,不影响原有默认逻辑。
不要直接把config.yaml复制到model目录下,后续多份配置很容易出现不同步的问题,维护成本高。
内容的提问来源于stack exchange,提问作者capsci
相关产品推荐
相关产品推荐

