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

Python单元测试跨相对路径加载外部文件报错如何解决

问题根因

这个报错的核心原因是Python中使用相对路径打开文件时,路径是相对于**进程运行的当前工作目录(CWD)**解析,而非代码文件本身所在的目录。你在单元测试目录下启动测试时,CWD是测试文件所在的目录,自然找不到存放在Scripts/Project目录下的file.yml。

另外注意你现有测试代码中test_add_then_string方法的缩进有误,没有归入TestProject类下,运行时不会被识别为测试用例,需要先修正缩进。


解决方案

以下两个方案按推荐优先级排序:

方案1:修改业务代码,使用模块路径作为基准(推荐)

该方案可以一劳永逸解决所有场景下的路径查找问题,不管是直接运行业务代码还是从测试入口调用都不会出错。

修改util2.py的路径拼接逻辑:

from Scripts.Project.util1 import add
import yaml
import os

# 获取当前util2.py文件所在的目录绝对路径
MODULE_DIR = os.path.dirname(os.path.abspath(__file__))

def add_then_string(x, y):
    z = add(x, y)
    # 拼接得到file.yml的绝对路径
    file_path = os.path.join(MODULE_DIR, "file.yml")
    with open(file_path) as f:
        word = yaml.safe_load(f)['A']
    return str(z) + word


if __name__ == "__main__":
    print(add_then_string(2, 3))

无需修改测试代码,修正缩进后直接运行测试即可正常通过。

方案2:单元测试中临时切换工作目录(无需修改业务代码)

如果你不想改动现有业务代码,可以在测试用例执行时临时切换工作目录到业务代码所在路径,执行完成后自动恢复。

修改测试文件代码如下:

import unittest
import os
from Scripts.Project import util2

class TestProject(unittest.TestCase):
    def setUp(self):
        # 保存测试启动时的原始工作目录
        self.original_cwd = os.getcwd()
        # 切换到util2模块所在的目录
        util2_dir = os.path.dirname(os.path.abspath(util2.__file__))
        os.chdir(util2_dir)

    def tearDown(self):
        # 测试结束后恢复原始工作目录,避免影响其他测试
        os.chdir(self.original_cwd)

    def test_dummy(self):
        self.assertTrue(True)

    def test_add(self):
        from Scripts.Project.util1 import add
        self.assertEqual(add(1,1), 2)

    def test_add_then_string(self):
        from Scripts.Project.util2 import add_then_string
        self.assertEqual(add_then_string(1,1), "2hello")


if __name__ == "__main__":
    unittest.main()

内容的提问来源于stack exchange,提问作者generic_user

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:24:08