如何读取Pandas DataFrame并使用Pytest测试corr函数?
解决Pytest测试中文件读取失败及单元测试规范问题
一、修复文件找不到的问题
你遇到的FileNotFoundError是因为Pytest运行时的工作目录和你写的相对路径不匹配导致的。要确保无论从哪个目录运行测试,都能正确找到数据文件,应该基于测试脚本的绝对路径来拼接数据路径:
from pathlib import Path # 获取当前测试脚本所在的目录 test_script_dir = Path(__file__).parent # 拼接数据文件的路径(根据你的目录结构调整) data_file_path = test_script_dir / "../data/prcs1.csv" # 转为绝对路径,彻底避免相对路径歧义 data_file_path = data_file_path.resolve()
二、修正测试代码的结构
你的代码把测试函数错误定义成了@pytest.fixture,fixture是用来准备测试数据的工具,真正的测试函数需要以test_开头,且不需要fixture装饰器。同时建议把数据读取逻辑放到fixture中,避免重复加载数据,提升测试效率。
修正后的完整测试代码:
import pytest from geb import corr import pandas as pd import numpy as np from pathlib import Path @pytest.fixture(scope="module") def raw_re_data(): # 读取原始数据的fixture,scope="module"表示整个测试模块只加载一次 test_script_dir = Path(__file__).parent data_file_path = test_script_dir / "../data/prcs1.csv" data_file_path = data_file_path.resolve() re_df = pd.read_csv(data_file_path, parse_dates=['Date'], index_col=["Date"]) return re_df.values @pytest.fixture(scope="module") def neg_re_data(raw_re_data): # 基于原始数据生成负收益数据的fixture,复用已有数据 re_df = pd.DataFrame(raw_re_data) neg_re_df = re_df[re_df < 0].fillna(0) return neg_re_df.values def test_corr_with_raw_data(raw_re_data): # 测试原始数据的corr结果,用rel参数设置允许的相对误差,避免浮点精度问题 assert pytest.approx(corr(raw_re_data), rel=1e-3) == 0.286 def test_corr_with_neg_data(neg_re_data): # 可添加负收益数据的测试,替换成你的预期值 assert pytest.approx(corr(neg_re_data), rel=1e-3) == 你的预期结果值
三、关键注意事项
- 路径可靠性:用
Path(__file__)获取脚本绝对路径是最稳妥的方式,不会受运行测试的工作目录影响。 - Fixture复用:把数据加载逻辑放到fixture中,不仅能避免重复加载,还能让不同测试用例共享数据,降低冗余代码。
- 浮点断言:使用
pytest.approx时建议设置rel或abs参数,允许结果存在合理的浮点误差,避免因精度问题导致断言失败。
内容的提问来源于stack exchange,提问作者kalin.klinkov
相关产品推荐
相关产品推荐

