You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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完全适用,还能额外带来统一维护、预加载缓存的好处:

  1. 首先在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)
  1. 测试用例直接引入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:54:02