问题描述
我目前正在为 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
,这可能不视为前者的缩小版本。
解决方法
收缩延迟策略与收缩任何其他策略的效果相同,因为假设中的收缩对底层表示一致地起作用,而无需了解有关所用策略的任何信息。
假设不是操纵生成的值,而是修改用于构造它们的选择。您可以将其视为进行一系列的硬币翻转。例如(True,False)
可能由序列 10100
生成,它是 1
(选择 |
的第二个分支),然后是选择第一个分支的 01
然后生成一个 True
和 00
,它选择第一个分支然后生成一个 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}} 收缩!毕竟它更小更简单。