简介
常规测试只能验证函数在特定输入下的表现。但如果你无法预知哪些输入会引发错误呢?Hypothesis 生成式测试能自动解决这个问题。
Hypothesis 是一个强大的 Python 属性测试(property-based testing)库,它彻底改变了测试方式。你无需手动构造测试数据,Hypothesis 会自动生成成千上万种不同的输入值,竭力寻找极端、错误或非典型的边界情况。你只需描述函数的属性和不变性,Hypothesis 就会尝试去破坏它们。
什么是 Hypothesis
Hypothesis 是一种基于属性测试(property-based testing)概念的生成式测试工具。该库旨在解决传统测试的根本问题:无法预见到所有可能的输入数据。
核心工作原理
该库遵循“寻找反例”的原则。当你定义函数的某个属性(例如,两个数相加的结果总是大于每个加数),Hypothesis 会生成大量不同的输入数据,并验证该属性是否对每组数据都成立。
相比传统测试的优势
- 自动覆盖边界情况:Hypothesis 能自主发现罕见且复杂的数据组合
- 错误最小化:一旦发现测试失败,系统会自动将输入简化到最小的可复现示例
- 高性能:快速生成数千个测试用例
- 可复现性:发现的错误可以轻松复现
安装与快速上手
安装库
pip install hypothesis
如需额外功能,可安装扩展版本:
pip install hypothesis[numpy,pandas,django]
基础使用示例
from hypothesis import given
import hypothesis.strategies as st
@given(st.integers(), st.integers())
def test_addition_commutative(a, b):
assert a + b == b + a
@given(st.integers(), st.integers())
def test_addition_associative(a, b, c):
assert (a + b) + c == a + (b + c)
运行测试
你可以通过 pytest、unittest 或直接运行测试:
pytest test_file.py
python -m unittest test_file.py
python test_file.py
数据生成基础
@given 装饰器
@given() 装饰器是 Hypothesis 的核心。它指定使用哪些生成策略来创建测试数据。
@given(st.integers())
def test_absolute_value(x):
assert abs(x) >= 0
@given(st.text(), st.integers(min_value=0))
def test_string_multiplication(s, n):
result = s * n
assert len(result) == len(s) * n
hypothesis.strategies 模块
所有数据生成策略都位于 hypothesis.strategies 模块中,通常导入为 st。该模块提供了丰富的预定义策略,适用于各种数据类型。
数据生成策略
基础策略
Hypothesis 提供了大量内置策略,用于生成不同类型的数据:
# 数值类型
st.integers() # 整数
st.floats() # 浮点数
st.decimals() # 十进制数
# 文本数据
st.text() # Unicode 字符串
st.binary() # 字节串
st.characters() # 单个字符
# 逻辑