Github测试运行时找不到本地可正常读取的模型文件如何优雅解决?
问题根源
路径报错的核心原因是本地和CI环境运行测试时的工作目录不一致:本地执行测试时工作目录是test文件夹,GitHub CI执行时工作目录是仓库根目录,硬编码的相对路径自然会失效,你当前写的条件判断只是临时兼容方案,可维护性很差。
方案1:基于测试文件位置生成绝对路径(无框架依赖)
不需要猜当前工作目录,直接通过当前测试文件的内置变量__file__计算模型目录的绝对路径,不管在什么环境执行都能定位到正确位置:
import os # 取当前测试文件所在的目录(即 test/test_model 目录) current_test_dir = os.path.dirname(os.path.abspath(__file__)) # 向上回溯一级到 test 目录,再拼接 models 路径 model_dir = os.path.join(current_test_dir, "..", "models") # 拼接得到模型的完整路径 nn_class_path = os.path.join(model_dir, "nn_class.sav")
方案2:用pytest fixture管理测试依赖(推荐)
如果你用pytest做单元测试,fixture完全适用,还能额外带来统一维护、预加载缓存的好处:
- 首先在
test目录下新建conftest.py,编写fixture逻辑:
import os import pytest import pickle @pytest.fixture(scope="session") # 会话级别,整个测试过程只加载一次模型 def nn_class_model(): test_root_dir = os.path.dirname(os.path.abspath(__file__)) model_path = os.path.join(test_root_dir, "models", "nn_class.sav") with open(model_path, "rb") as f: return pickle.load(f)
- 测试用例直接引入fixture即可,不需要重复写路径和加载逻辑:
def test_classification_predict(nn_class_model): test_input = [1,2,3,4] predict_res = nn_class_model.predict(test_input) assert predict_res == 1
方案优势
- 完全不依赖运行环境的工作目录,不会出现本地正常CI报错的问题
- 路径逻辑统一维护,后续调整目录结构只需要改一次路径计算逻辑
- fixture方案还能减少重复加载模型的开销,提升测试运行效率
内容的提问来源于stack exchange,提问作者Saif Ali Khan
相关产品推荐
相关产品推荐

