应使用专用断言工具替代普通assert:对浮点数组用numpy.testing.assert_allclose,JSON/CSV用标准化后哈希比对,HDF5一致性测试统一用h5py读写并显式控制参数。

为什么直接用 assert 比较大型数据会失败
因为 Python 的默认 assert 在遇到嵌套深、元素多的结构(比如含百万级浮点数的 numpy.ndarray 或嵌套字典列表)时,报错信息极长且不聚焦;更关键的是,浮点数比较会因精度丢失导致误判,而 == 不会自动处理容差。你看到的不是逻辑错误,而是数值抖动被当成断言失败。
- 用
numpy.testing.assert_allclose(a, b, rtol=1e-5)替代assert a == b处理数组 - 对 JSON/CSV 读写一致性,先用
json.loads()和json.dumps(..., sort_keys=True)标准化后再比字符串哈希,避免字段顺序干扰 - 跳过非核心字段(如时间戳、UUID):在断言前用
pop()或deepcopy构造精简版数据
如何让 pytest 快速跳过已验证的中间文件
大型数据测试常涉及生成临时文件(如 test_output.h5),重复运行时重写既慢又掩盖 I/O 问题。pytest 本身不缓存文件内容,但你可以用 pytest-cache 衍生思路 —— 把文件哈希作为 fixture 的 key。
- 定义 fixture:
@pytest.fixture(scope="session")+hashlib.md5(open(path,"rb").read()).hexdigest() - 在测试函数中加参数
cached_hash,若当前文件哈希匹配,则跳过写入步骤,直接读取校验 - 注意:必须确保输入数据未变(例如用
input_data_hashfixture 控制源头),否则缓存会失效
读写一致性测试中 h5py 和 pandas 的行为差异
h5py.File 默认以只读模式打开,而 pandas.read_hdf() 可能隐式创建索引或调整 dtype;同一份 HDF5 文件,两种方式读出的 pd.DataFrame 和 np.array 可能 shape 一致但值微异(尤其含字符串列时)。
- 统一用
h5py读写原始数据,pandas仅用于后续分析,不在一致性断言链中参与 - 若必须用
pandas,显式指定dtype和encoding,并用pd.testing.assert_frame_equal(df1, df2, check_exact=False, atol=1e-8) - HDF5 中字符串需用
vlen或固定长度S256,否则pandas读取可能截断或填充空格
怎样在 CI 环境里安全地运行大数据测试
本地跑得通的测试,在 CI(如 GitHub Actions)上常因磁盘空间不足、内存超限或超时被杀。pytest 默认不限制资源,也不会主动清理临时文件。
立即学习“Python免费学习笔记(深入)”;
- 用
tmp_pathfixture 而非/tmp手动路径,pytest 会在会话结束自动清空 - 加
@pytest.mark.timeout(60)(需装pytest-timeout),防止单测卡死 - 对 >100MB 的测试数据,改用
pytest.skipif("CI" in os.environ and not Path("test_data/large_sample.h5").exists())跳过下载步骤


















