如何使pytest单元测试程序适配多文件并实现JSON转DataFrame与原JSON数据的断言对比
我来帮你搞定这两个测试痛点!针对你提到的核心需求,咱们一步步来实现:
1. 用原JSON数据动态生成断言值,替代硬编码
既然不想写死固定数字,咱们可以自己解析JSON文件,提取对应位置的预期值,再和转换后的DataFrame做对比。这样不管JSON样本怎么更新,测试都会自动取最新的预期值,不用手动修改断言逻辑。
举个修改后的代码示例:
import json import pytest import je # 你的转换器脚本 def get_expected_value(json_path, target_key, index): # 加载并解析原JSON文件 with open(json_path, "r") as f: json_data = json.load(f) # 根据你的JSON实际结构提取预期值(这里假设JSON是列表格式,每个元素是带目标字段的对象,可按需调整) return json_data[index][target_key] def test_headerdftrue_S(): json_path = "sample_jsondata" # 调用转换器获取DataFrame var_a, var_b, var_c, var_d = je.json_to_df(json_path) # 从原JSON中动态获取预期的id值 expected_id = get_expected_value(json_path, "id", 10) # 对比DataFrame对应位置的值(用iloc更安全,避免索引混乱) assert var_a["id"].iloc[10] == expected_id
如果你的JSON是嵌套字典结构,只需要调整get_expected_value里的取值路径就行,比如json_data["header"]["items"][index][target_key]。
2. 用pytest参数化适配多文件场景
pytest的参数化功能可以让你用同一个测试逻辑遍历所有测试文件,不用重复写多个测试函数。只需要用@pytest.mark.parametrize装饰器,把要测试的文件(甚至不同的检查点)传进去即可。
基础多文件测试示例
# 定义所有要测试的JSON文件路径 TEST_FILES = [ "sample_jsondata", "sample_jsondata_2", "sample_jsondata_3" ] @pytest.mark.parametrize("json_path", TEST_FILES) def test_json_to_df_multiple_files(json_path): # 调用转换器 var_a, var_b, var_c, var_d = je.json_to_df(json_path) # 获取当前文件的预期id值(这里统一检查索引10的id,可按需修改) expected_id = get_expected_value(json_path, "id", 10) # 执行断言 assert var_a["id"].iloc[10] == expected_id
进阶:不同文件对应不同检查点
如果不同测试文件需要检查不同的字段或索引,可以把参数改成元组,灵活性更高:
# 定义测试用例:(文件路径, 目标字段, 检查索引) TEST_CASES = [ ("sample_jsondata", "id", 10), ("sample_jsondata_2", "name", 5), ("sample_jsondata_3", "value", 0) ] @pytest.mark.parametrize("json_path, target_key, index", TEST_CASES) def test_json_to_df_multiple_cases(json_path, target_key, index): var_a, var_b, var_c, var_d = je.json_to_df(json_path) expected_value = get_expected_value(json_path, target_key, index) assert var_a[target_key].iloc[index] == expected_value
额外小技巧:全DataFrame对比
如果想确保整个转换的准确性(而不只是单个值),可以用pytest-pandas插件做完整的DataFrame对比:
from pytest_pandas import assert_frame_equal import pandas as pd def test_full_df_match(json_path): # 获取转换后的DataFrame df = je.json_to_df(json_path)[0] # 假设var_a是你要校验的目标DataFrame # 自己把原JSON转换成预期的DataFrame with open(json_path, "r") as f: json_data = json.load(f) expected_df = pd.DataFrame(json_data) # 对比整个DataFrame的结构和值 assert_frame_equal(df, expected_df)
内容的提问来源于stack exchange,提问作者Siddharth Iyer
相关产品推荐
相关产品推荐

