学习pytest时脚本运行正常,但pytest无法找到CSV文件求助
解决pytest执行时找不到CSV文件的问题
这问题我碰到过好几次啦!核心坑点在于单独运行脚本和用pytest执行时的工作目录不一致,导致你用相对路径找文件的逻辑失效了:
- 直接跑脚本时,Python的工作目录是脚本所在的文件夹,所以能找到同目录的CSV;
- 但pytest默认会把你执行
pytest命令的那个目录作为工作目录,它会在这个目录下去找你指定的CSV文件,自然就找不到了。
下面给你两个实用的解决方案:
方案1:用脚本绝对路径拼接文件路径(推荐用于需要真实文件的场景)
修改你的load_data函数,通过__file__获取脚本所在的绝对目录,再和文件名拼接,这样不管从哪个目录运行pytest,都能精准定位到文件:
import csv import os def load_data(file): # 获取当前脚本所在的绝对目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接出CSV文件的绝对路径 file_path = os.path.join(script_dir, file) mast_list = [] with open(file_path) as csvfile: data = csvfile.read() phone_masts = data.split('\n') columns = csv.reader(phone_masts, delimiter=',') for row in columns: if len(row) > 0: mast_list.append(row) return mast_list
方案2:用Mock模拟文件读取(推荐用于单元测试场景)
如果你只是想验证函数返回列表类型,完全不需要依赖真实的CSV文件,用unittest.mock模拟文件读取的行为就行,这样测试更独立、更快:
from unittest.mock import mock_open, patch import pytest from your_script import load_data # 替换成你的脚本文件名 def test_load_data_returns_list(): # 模拟一段CSV格式的内容 mock_csv_content = "id,location\n1,London\n2,Paris" # 替换内置的open函数,让它返回我们模拟的内容 with patch("builtins.open", mock_open(read_data=mock_csv_content)): result = load_data("dummy_file.csv") # 验证返回结果是列表类型 assert isinstance(result, list)
额外小技巧
如果坚持要用真实文件且不想改代码,也可以在执行pytest时指定脚本所在目录为根目录:
pytest --rootdir /path/to/your/script/folder
不过这种方式灵活性较差,不如前两个方案实用。
内容的提问来源于stack exchange,提问作者iFunction
相关产品推荐
相关产品推荐

