Python unittest相对路径在PyCharm单测/批量测试运行不兼容问题
问题根因
出现该问题的核心原因是两种运行方式下,PyCharm默认设置的**工作目录(Working Directory)**不一致:
- 右键tests文件夹批量运行测试时,PyCharm默认将工作目录设为
tests目录,你写的相对路径testassets/xxx.txt会被解析为tests/testassets/xxx.txt,和实际资源路径匹配,因此可以正常读取 - 右键单个测试文件运行时,PyCharm默认将工作目录设为项目根目录(即存放
MyClass.py的上层目录),相对路径会被解析为项目根目录/testassets/xxx.txt,路径不存在因此抛出文件找不到错误
推荐解决方案(无需判断运行方式,全场景兼容)
不需要区分运行方式,直接基于当前测试文件的绝对路径拼接资源路径,无论工作目录如何变化都能准确定位到资源目录。修改test_MyClass.py代码即可:
- 首先导入os模块
- 修改
get_file方法,通过当前文件的绝对路径拼接资源路径
修改后的完整代码示例:
import unittest import io import os from ..MyClass import MyClass class MyClassTests(unittest.TestCase): myClassInstance = None @classmethod def setUpClass(cls): cls.myClassInstance = MyClass() def get_file(self, use_case): # 获取当前测试文件所在目录的绝对路径(即tests目录的绝对路径) current_test_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接得到资源文件的完整路径,os.path.join可自动适配不同操作系统的路径分隔符 path_to_file = os.path.join(current_test_dir, "testassets", f"{use_case}.txt") with io.open(path_to_file, 'r', encoding="utf-8") as file: return file.read() def test_uc_file1(self): file_content = self.get_file("uc_1") self.myClassInstance.set_content(file_content) self.assertEquals("test1", self.myClassInstance.get_content()) def test_uc_file2(self): file_content = self.get_file("uc_2") self.myClassInstance.set_content(file_content) self.assertEquals("test2", self.myClassInstance.get_content())
可选补充方案(仅本地生效,无需修改代码)
如果你不想修改代码,也可以统一配置PyCharm测试运行的默认工作目录:
- 打开PyCharm设置:
File -> Settings -> Tools -> Python Integrated Tools - 找到
Testing板块,将Working directory设置为你项目中tests目录的绝对路径
配置完成后,两种运行方式的工作目录都会统一为tests目录,原有相对路径写法可以正常生效。该方案仅本地生效,换设备或者同步代码到其他环境需要重新配置。
运行方式判断方法(不推荐使用,仅作参考)
如果确实需要区分运行方式,可以通过比对工作目录和测试文件所在目录实现:
import os def is_running_single_test(): work_dir = os.getcwd() current_test_dir = os.path.dirname(os.path.abspath(__file__)) # 工作目录和测试文件目录不一致时,即为单独运行单个测试文件的场景 return work_dir != current_test_dir
单独运行时资源路径可以拼接为os.path.join("tests", "testassets", f"{use_case}.txt"),但该方案兼容性差,更推荐使用绝对路径拼接的方案。
内容的提问来源于stack exchange,提问作者bookofproofs
相关产品推荐
相关产品推荐

