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
相关产品推荐
相关产品推荐

