【问题标题】:How does python-hypothesis shrink a deferred strategypython-hypothesis如何缩小延迟策略
【发布时间】:2021-04-26 08:55:24
【问题描述】:

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

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

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,这可能不算是前者的缩小版本.

【问题讨论】:

    标签: python python-hypothesis property-based-testing


    【解决方案1】:

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

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

    如果您想了解更多信息,可以阅读有关它的论文(或观看演讲):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,这可能不算作前者的缩小版本。

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

    【讨论】:

    • 如果可能,也请查看我的“已编辑问题”。
    • 如果您计划实施类似假设的 PBT,我建议从 github.com/DRMacIver/minithesis 端口开始
    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多