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

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代码即可:

  1. 首先导入os模块
  2. 修改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测试运行的默认工作目录:

  1. 打开PyCharm设置:File -> Settings -> Tools -> Python Integrated Tools
  2. 找到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:09:00