8

故事:

我目前正在使用hypothesis自定义生成策略对函数进行单元测试,试图找到一个特定的输入来“破坏”我当前的解决方案。这是我的测试的样子:

from solution import answer

# skipping mystrategy definition - not relevant

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

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

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

  • 运行测试
  • hypothesis找到一个产生 的输入AssertionError

    $ pytest test.py 
    =========================================== test session starts ============================================
    ...
    ------------------------------------------------ Hypothesis ------------------------------------------------
    Falsifying example: test(l=[[0], [1]])
    
  • 使用此特定输入调试函数,尝试了解此输入/输出是否合法并且该函数是否正常工作

问题:

我怎样才能跳过这个伪造的生成示例([[0], [1]]在这种情况下)并要求hypothesis生成一个不同的示例?


该问题也可以解释为:hypothesis如果发现伪造示例,我可以要求不终止并生成更多伪造示例吗?

4

1 回答 1

7

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

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

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

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

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

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

于 2016-09-21T17:56:50.677 回答