0

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

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

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

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


DRMacIver 一个接一个的问题:

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

1 回答 1

3

收缩延迟策略与收缩任何其他策略的工作方式相同,因为假设中的收缩一致地作用于基础表示,而不需要了解有关正在使用的策略的任何信息。

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

如果您想了解更多信息,可以阅读有关它的论文(或观看演讲):https ://2020.ecoop.org/details/ecoop-2020-papers/13/Test-Case-Reduction-via-测试用例生成洞察 - 假设 - 归约器

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

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

于 2021-01-22T09:00:36.643 回答