使用pytest测试方法返回DataFrame列匹配时运行报错,求解决方案
错误修复方案
1. 修正测试用DataFrame的构造逻辑
你当前的fixture中构造DataFrame的参数传递错误:
- 你传入了一维列表作为数据,pandas会将每个元素识别为单独的行,而非单行的多列值
- 传入的7个值和你定义的6个列名数量不匹配,会直接触发参数错误
修正后的fixture代码如下:
@pytest.fixture def df(): # 单行数据需包裹在二维列表中,外层列表代表行,内层列表代表当前行的所有列值 df = pd.DataFrame( [ ['2020-06-05 01:01:00', '1591318860', 'Jun 4, 2020 at 7:01 PM', '7:01 PM', 71, True, 71] ], # 补全第7个列名,可根据接口真实返回的列名调整 columns=['time', 'formattedTime', 'formattedAxisTime', 'time_label', 'value', 'hasData', 'formattedValue'] ) return df
注意需要将value、hasData等字段的字符串格式改为和接口返回一致的数字、布尔类型,避免后续类型不匹配导致断言失败。
2. 修正断言逻辑
你当前写的assert data.columns.equals(df)逻辑完全错误:data.columns是列名集合,无法和整个DataFrame做相等判断。根据你的测试需求选择对应断言方式:
- 若要验证两个DataFrame的内容、列名、索引完全一致,使用pandas内置的测试方法:
pd.testing.assert_frame_equal(data, df)
- 若仅需要验证列名一致:
assert data.columns.equals(df.columns)
- 若仅需要验证关键字段值符合预期,可以简化断言:
assert data['value'].iloc[0] == 71 assert data['hasData'].iloc[0] == True
3. 调试适配接口返回结构
如果修正后仍断言失败,先在测试函数中添加打印逻辑,确认接口真实返回的结构和值:
def test__dict_request(keyword, start, end, df): """test the dict functionality""" pytrends = GoogleTrends() data = pytrends.interest_over_time(kw_list=keyword, start_date=start, end_date=end) # 运行pytest时加-s参数即可看到打印内容 print("接口返回数据结构:\n", data.dtypes) print("接口返回数据内容:\n", data.head()) pd.testing.assert_frame_equal(data, df)
根据打印的真实返回结果调整测试df的构造即可。
内容的提问来源于stack exchange,提问作者Ivan Raykov
相关产品推荐
相关产品推荐

