Hypothesis多字段对象生成:组合数限制与搜索树形态问询
嘿,我来帮你把Hypothesis相关的这几个问题理清楚~
Hypothesis本身没有硬编码的组合数上限,它不会因为你字段多、值域大就直接“罢工”。毕竟它是属性测试工具,核心思路不是枚举所有可能的组合,而是通过智能采样和自适应探索来覆盖关键场景。
举个例子:哪怕你有10个字段,每个字段有100种可能值,理论组合是100^10这种天文数字,Hypothesis也不会傻到去挨个枚举。它会随机生成不同的对象实例,同时优先去碰那些容易出问题的边界值、极端值,或者之前测试中触发过异常的字段组合。
当然实际中会有间接限制:比如你的测试超时时间、机器内存,或者某个字段的生成器本身效率很低(比如生成超大字符串),这些会影响实际能生成的组合数量,但这不是Hypothesis本身的限制。
Hypothesis的“搜索树”其实更像一棵动态生长、依赖反馈的探索树,不是固定的静态结构:
- 每个节点代表一个生成的测试用例(你的对象实例)。
- 子节点是对父节点用例做微小修改得到的新用例:比如调整某个字段的值、修改列表里的一个元素,或者切换枚举类型的选项。
- 树的生长完全跟着测试反馈走:如果某个分支的用例触发了失败,Hypothesis会在这个分支上投入更多精力,不断缩小用例(也就是shrink过程),找到能复现失败的最小版本;如果某个分支一直没发现问题,它会减少在这个分支的探索,转向其他未尝试过的区域。
简单说,它不是预先规划好树的结构,而是边测试边调整,哪里有问题就往哪里钻,没问题就换方向探索。
你完全不用怕Hypothesis会执着于DFS直到穷尽组合——它的默认策略是随机采样+自适应探索,根本不会走“一条路走到黑”的路子。
比如测试你的多字段对象时,它会先随机生成几个不同的完整对象,覆盖不同字段的不同值;如果某个用例出了问题,它会针对这个问题用例,逐个修改字段来简化,而不是先把第一个字段的所有值试完再碰第二个字段。
这正好契合你的需求:不需要覆盖所有组合,但能保证每个字段的多种不同值都被测试到,同时还能自动揪出那些容易出问题的组合。
内容的提问来源于stack exchange,提问作者curious_george

