使用Hypothesis库创建pd.DataFrame时仅生成最小值的问题排查
解决方案
问题原因
st.text(min_size=0, max_size=)存在语法错误,未指定max_size参数,导致Hypothesis默认生成最小长度的字符串(空字符串)。st.datetimes()未限定时间范围,默认生成的时间区间偏窄,容易输出最早的边界值(如2001-01-01)。- Hypothesis默认优先生成边界值(如最小值)作为初始测试案例,若未调整策略或测试次数,会出现“始终只生成最小值”的错觉。
修正后的代码
import pandas as pd import hypothesis.strategies as st from datetime import datetime @st.composite def create_hypothesis_df(draw): num_rows = draw(st.integers(min_value=1, max_value=10)) # 预定义各列的生成策略 col1_strategy = st.text(min_size=0, max_size=100) # 修复语法错误,补充max_size date_strategy = st.datetimes(start=datetime(2000, 1, 1), end=datetime(2025, 12, 31)) float_strategy = st.floats( min_value=1, max_value=1000, allow_nan=False, allow_infinity=False, exclude_min=True # 可选:排除最小值1,确保数值大于1 ) text_strategy = st.text(min_size=0, max_size=100) data = [ ( draw(col1_strategy), '1750', draw(date_strategy), draw(date_strategy), draw(float_strategy), draw(float_strategy), draw(float_strategy), draw(text_strategy), draw(text_strategy), ) for _ in range(num_rows) ] columns = ["col1", "col2", "col3", "col4", "col5", "col6", "col7", "col8", "col9"] return pd.DataFrame(data, columns=columns)
关键修改说明
- 修复语法错误:给
st.text补充max_size参数,确保能生成0到100长度的随机字符串,而非仅空字符串。 - 限定时间范围:给
st.datetimes设置start和end,让生成的时间落在2000-2025区间内,避免仅输出最早的边界时间。 - 优化数值生成:给
st.floats添加allow_nan=False和allow_infinity=False,避免无效数值;可选exclude_min=True确保数值大于1,适配你new_column < col5的断言需求。 - 提升取值多样性:将策略单独定义,逻辑更清晰,同时Hypothesis会在多次测试中生成更广泛的取值范围。
额外优化建议
- 增加测试次数:在测试函数上添加
@st.settings(max_examples=100),让Hypothesis生成更多样的案例,避免只看到边界值:@st.settings(max_examples=100) @st.given(df=create_hypothesis_df()) def test_data_transform(df): # 你的转换函数测试逻辑 result_df = your_transform_function(df) assert (result_df['new_column'] < df['col5']).all() - 控制时间顺序:如果col3和col4有先后要求,可以在composite里添加逻辑约束,比如确保col3 <= col4:
col3 = draw(date_strategy) col4 = draw(date_strategy.filter(lambda dt: dt >= col3))
内容的提问来源于stack exchange,提问作者Myrthe
相关产品推荐
相关产品推荐

