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

如何修改pytest测试运行工作目录且不改变测试输出存放位置

解决方案

你之前配置的pythonpath仅作用于Python模块导入的搜索路径,完全不影响程序读写文件时的相对路径解析,因此既无法解决词表文件找不到的问题,还会打乱pytest默认的输出路径规则。下面提供两种可落地的方案,都能满足「正常读取词表+测试输出保留在tests目录」的要求。

方案一:一劳永逸修改业务代码路径逻辑(推荐)

不要依赖运行时工作目录解析静态资源路径,直接基于脚本文件自身的位置拼接资源的绝对路径,不管在哪个目录启动程序、跑测试都不会出现路径错误,也不需要修改任何pytest配置。

  • 打开src/main.py,把原来读取词表的相对路径写法替换为基于__file__的路径拼接:
from pathlib import Path

# 获取当前main.py文件所在目录的绝对路径
SRC_DIR = Path(__file__).parent.resolve()
# 拼接词表文件的绝对路径,完全不依赖运行时工作目录
WORDLIST_PATH = SRC_DIR / "assets" / "wordlist.txt"

# 读取文件时直接用拼好的路径
with open(WORDLIST_PATH, "r", encoding="utf-8") as f:
    word_list = [line.strip() for line in f]
  • 删掉pytest.ini里之前加的pythonpath = . src配置,如果需要正常导入src下的模块,保留如下最小配置即可:
[pytest]
testpaths = tests
pythonpath = src

改完后你在tests目录下直接执行pytest即可,所有测试输出、缓存文件都会默认存放在tests目录,不会跑到repo根目录。

方案二:不修改业务代码,通过pytest钩子切换工作目录

如果不想调整业务代码的路径逻辑,可以在tests目录下新增pytest自动加载的conftest.py配置文件,通过钩子函数在测试启动时切换工作目录到repo根目录,不会影响测试输出的存放位置。

  • 在tests目录下新建conftest.py文件,写入如下代码:
import os
from pathlib import Path

def pytest_configure(config):
    # 定位到repo根目录(当前conftest.py在tests目录下,上级就是根目录)
    repo_root = Path(__file__).parent.parent.resolve()
    # 切换进程工作目录到repo根目录
    os.chdir(repo_root)
  • 同样删掉pytest.ini里冗余的pythonpath配置,保留方案一里给出的最小配置即可。

这个配置只会修改测试运行时进程的工作目录,不会改变pytest输出文件的默认存放规则,你在tests目录下执行pytest时,所有报告、缓存依然会生成在tests目录下。

注意:如果用这个方案,你代码里读取词表的路径要和repo根目录的相对路径对应——如果你的词表在src/assets/wordlist.txt位置,代码里的路径要写成src/assets/wordlist.txt,否则还是会找不到文件。这也是更推荐方案一的原因,不需要记路径对应关系,怎么跑都不会错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:09:22