如何在Hypothesis中设置DataFrame的最小与最大生成长度?
调整Hypothesis生成的基因组DataFrame大小:最小1行,更大平均长度
要解决你的需求——禁止空DataFrame、生成更长的平均长度DataFrame——只需要在data_frames的行策略外层包裹st.lists,并通过min_size、average_size(可选max_size)参数来精确控制行数范围。
修改后的完整代码
from hypothesis.extra.pandas import columns, data_frames, column import hypothesis.strategies as st def mysort(tp): key = [-1, tp[1], tp[2], int(1e10)] return [x for _, x in sorted(zip(key, tp))] positions = st.integers(min_value=0, max_value=int(1e7)) strands = st.sampled_from("+ -".split()) chromosomes = st.sampled_from(elements=["chr{}".format(str(e)) for e in list(range(1, 23)) + "X Y M".split()]) # 核心调整:用st.lists包裹行策略,控制行数 row_strategy = st.tuples(chromosomes, positions, positions, strands).map(mysort) genomics_data = data_frames( columns=columns(["Chromosome", "Start", "End", "Strand"], dtype=int), rows=st.lists(row_strategy, min_size=1, average_size=50, max_size=200) )
关键调整说明
min_size=1:强制生成的DataFrame至少有1行,彻底避免空DataFrame的情况。average_size=50:告诉Hypothesis你期望生成的DataFrame平均有50行(可以根据你的测试需求调整这个数值,比如改成100、200)。max_size=200(可选):限制生成的DataFrame最大行数,防止出现过大的数据集拖慢测试速度,如果不需要限制可以去掉这个参数。
为什么这样有效?
Hypothesis的data_frames函数的rows参数既可以接受单个行策略(此时会默认生成长度随机的列表,平均长度约10),也可以直接接受一个列表策略(st.lists返回的对象),这让我们能完全掌控生成的行数范围和分布。
通过st.lists的这些参数,你可以精准平衡测试的覆盖性(足够多的行来模拟真实场景)和测试效率(不会生成过大的数据集)。
内容的提问来源于stack exchange,提问作者The Unfun Cat
相关产品推荐
相关产品推荐

