如何修改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
相关产品推荐
相关产品推荐

