跳过假设中的伪造示例

Skipping falsifying examples in Hypothesis

故事:

我目前正在使用 hypothesis and a 尝试为 "break" 我当前的解决方案找到特定的输入来对函数进行单元测试。这是我的测试的样子:

from solution import answer

# skipping mystrategy definition - not relevant

@given(mystrategy)
def test(l):
    assert answer(l) in {0, 1, 2}

基本上,当 answer() 函数不是 return 0 或 1 或 2 时,我正在寻找可能的输入。

这是我的当前工作流程的样子:

问题:

如何跳过这个伪造生成的示例(在本例中为 [[0], [1]])并让 hypothesis 为我生成一个不同的示例?


这个问题也可以解释为:我可以要求 hypothesis 如果发现一个伪造的例子不终止并生成更多伪造的例子吗?

目前没有办法让 Hypothesis 在发现失败后继续尝试(它可能会在某个时候发生,但目前还不清楚正确的行为应该是什么,而且这不是优先事项),但您可以使用 assume 功能让它忽略特定的 类 失败。

例如你可以跳过这个例子:

@given(mystrategy)
def test(l):
    assume(l != [[0], [1]])
    assert answer(l) in {0, 1, 2}

Hypothesis 将跳过您使用 False 参数调用 assume 的任何示例,并且不会将它们计入您运行示例的预算。

您可能会发现这只会导致示例的细微变化,但您可以传递更复杂的表达式来假定忽略 类 个示例。

您在这里的实际用例是什么?她的正常预期使用模式是修复导致假设失败的错误,并让它以这种方式找到新的错误。我知道这并不总是实用,但我很想知道为什么。