在假设中跳过伪造的例子

时间:2016-09-21 17:31:51

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

故事:

我目前正在使用hypothesis进行单元测试功能,而custom generation strategy尝试查找特定输入以及#34; break"我目前的解决方案以下是我的测试结果:

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不终止吗?

1 个答案:

答案 0 :(得分:6)

目前还没有办法让假设在发现失败后继续尝试(它可能会在某个时刻发生,但它并不是很清楚这个应该是什么样的正确行为而且它并不是优先考虑的事情),但是你可以使用assume功能来忽略特定类别的失败。

e.g。你可以跳过这个例子:

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

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

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

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