运行Pytest遇FileNotFoundError,如何解决路径问题?
问题原因
你遇到的FileNotFoundError核心是相对路径的工作目录不匹配:
app.py里用open("config_demo.json")读取文件时,这个相对路径是基于当前执行代码的工作目录,而非app.py所在的project/文件夹。- 你在仓库根目录执行
pytest -v tests,此时工作目录是根目录,代码会在根目录下查找config_demo.json,但该文件实际存放在project/目录中,因此找不到。
另外注意:你贴出的文件列表里有project/config.json,但app.py里读取的是config_demo.json,请确保文件名一致,避免额外路径问题。
解决方案
优先推荐方案一,它能彻底解决路径依赖问题,无论代码在哪里运行都能精准定位配置文件。
方案一:修改app.py,使用基于文件位置的绝对路径
调整app.py的配置文件读取逻辑,利用__file__获取当前脚本的绝对路径,再拼接配置文件路径:
from flask import Flask import json # 补上缺失的json模块导入 from os.path import dirname, join # 获取app.py所在的project目录绝对路径 app_directory = dirname(__file__) # 拼接配置文件的完整路径 config_file_path = join(app_directory, "config_demo.json") with open(config_file_path, 'r', encoding='utf8') as f: base_config = json.load(f) app = Flask(__name__) # 后续代码保持不变
这种方法的优势是:无论直接在project/目录运行app.py,还是在根目录执行测试,都能正确找到配置文件。
方案二:在测试中切换工作目录(备选)
如果不想修改app.py的代码,可以通过pytest的fixture强制切换工作目录到project/:
- 在
tests/目录下新建conftest.py文件(pytest会自动加载该文件):
import os from os.path import dirname, join, normpath import pytest @pytest.fixture(scope="session", autouse=True) def switch_to_project_dir(): # 计算project目录的绝对路径 repo_root = dirname(dirname(__file__)) project_dir = normpath(join(repo_root, "project")) # 保存原工作目录,测试结束后恢复 original_cwd = os.getcwd() os.chdir(project_dir) yield os.chdir(original_cwd)
这个fixture会在所有测试运行前自动切换到project/目录,让app.py里的相对路径能找到配置文件。
额外注意点
- 你贴出的
tests/test_app.py和目录结构里的tests/unit_tests/test_app.py路径不匹配,请确保测试文件实际路径与代码导入逻辑一致,避免pytest找不到测试用例。 app.py中缺少import json,即使解决了路径问题,也会触发NameError: name 'json' is not defined错误,需要补上。
内容的提问来源于stack exchange,提问作者gentlethorns
相关产品推荐
相关产品推荐

