如何查看并保存Hypothesis生成的假设测试输入数据?
Hypothesis生成输入数据的保存与复用方案
直接捕获生成用例并持久化
你可以在@given装饰的测试函数内部,直接将每次生成的输入参数序列化后存储,支持导出为Python原生兼容的pickle格式,或者跨语言通用的JSON格式,适配Matlab读取需求。
示例实现:
import hypothesis.strategies as st from hypothesis import given import pickle import json # 全局容器存储所有测试用例 generated_cases = [] # 替换成你实际需要的输入数据生成策略 @given(st.integers(min_value=0, max_value=1000), st.lists(st.floats(allow_nan=False, allow_infinity=False), min_size=1, max_size=100)) def test_implementation_consistency(input_a, input_b): # 先存储当前生成的用例 generated_cases.append({ "input_a": input_a, "input_b": input_b }) # 执行新旧实现的结果对比 python_res = your_python_function(input_a, input_b) matlab_res = your_matlab_call_wrapper(input_a, input_b) # 浮点数对比建议加误差容忍,比如abs(python_res - matlab_res) < 1e-6 assert python_res == matlab_res if __name__ == "__main__": # 执行测试生成用例 test_implementation_consistency() # 导出为pickle格式,可直接在Python环境复用 with open("hypothesis_generated_cases.pkl", "wb") as f: pickle.dump(generated_cases, f) # 导出为JSON格式,方便Matlab读取处理 with open("hypothesis_generated_cases.json", "w") as f: json.dump(generated_cases, f)
固定用例生成序列
如果你不需要单独导出用例文件,只需要每次运行都生成完全相同的输入序列做回归验证,可以直接固定Hypothesis的生成随机源:
- 方式1:运行脚本前设置环境变量
HYPOTHESIS_SEED=你自定义的固定整数值 - 方式2:在测试的settings配置中开启
derandomize=True参数,即可实现稳定的用例生成
注意事项
- 若生成的输入包含自定义类、字节流等不可直接JSON序列化的类型,需提前编写转换逻辑转为基础类型后再存储
- 跨语言对比浮点数结果时,不要直接做全等判断,建议根据业务精度要求设置误差阈值
- 如需单独存储触发错误的用例,可以在断言失败的异常捕获分支中单独导出对应用例,方便后续调试
内容的提问来源于stack exchange,提问作者natemcintosh
相关产品推荐
相关产品推荐

