python-hypothesis 如何缩小延迟策略

我目前正在为 Matlab 实现 PBB,并且在某种程度上受到假设的影响。

我不明白假设如何处理递延策略的缩减。 在文档中有代码片段

import hypothesis.strategies as st
x = st.deferred(lambda: st.booleans() | st.tuples(x,x))
x.example()
>>> (((False,(True,True)),(False,True))

现在,这个例子应该很可能通过减少递归深度来缩小。但是,假设如何知道如何操纵 lambda 以使示例缩小?


DRMacIver 回答后的问题:

  • 假设是否存储了哪些选择属于哪种策略?例如:(False,False)) 可以构造为 10010000(深度优先)。如果我们采用子序列 01(其中第一个 0 属于策略 booleans 而不是 tuples),我们将得到示例 True,这可能不视为前者的缩小版本。
q58603432 回答:python-hypothesis 如何缩小延迟策略

收缩延迟策略与收缩任何其他策略的效果相同,因为假设中的收缩对底层表示一致地起作用,而无需了解有关所用策略的任何信息。

假设不是操纵生成的值,而是修改用于构造它们的选择。您可以将其视为进行一系列的硬币翻转。例如(True,False) 可能由序列 10100 生成,它是 1(选择 | 的第二个分支),然后是选择第一个分支的 01 然后生成一个 True00,它选择第一个分支然后生成一个 False。我们可以通过将 (True,False) 替换为 True 来将 10100 减少到 01,或者通过将其替换为 False 来将 00 减少到 True,我们都可以找到原始选择序列的子序列。

如果您想了解更多相关信息,可以阅读相关论文(或观看演讲):https://2020.ecoop.org/details/ecoop-2020-papers/13/Test-Case-Reduction-via-Test-Case-Generation-Insights-From-the-Hypothesis-Reducer

假设存储哪些选择属于哪种策略?例如:(False,(False,False)) 可以构造为 10010000(深度优先)。如果我们取子序列 01(其中第一个 0 属于策略布尔值而不是现在的元组),我们将得到示例 True,这可能不算作前者的缩小版本。

不,假设没有任何关于选择的“所有权”的特定概念,并且认为 (False,False)) 是完全有效的 {{1}} 收缩!毕竟它更小更简单。

本文链接:https://www.f2er.com/1062623.html

大家都在问