跳过假设中的伪造示例
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 时,我正在寻找可能的输入。
这是我的当前工作流程的样子:
- 运行 测试
hypothesis
找到产生 AssertionError
:
的输入
$ pytest test.py
=========================================== test session starts ============================================
...
------------------------------------------------ Hypothesis ------------------------------------------------
Falsifying example: test(l=[[0], [1]])
使用此特定输入调试函数,尝试了解此 input/output 是否合法以及函数是否正常工作
问题:
如何跳过这个伪造生成的示例(在本例中为 [[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 的任何示例,并且不会将它们计入您运行示例的预算。
您可能会发现这只会导致示例的细微变化,但您可以传递更复杂的表达式来假定忽略 类 个示例。
您在这里的实际用例是什么?她的正常预期使用模式是修复导致假设失败的错误,并让它以这种方式找到新的错误。我知道这并不总是实用,但我很想知道为什么。
故事:
我目前正在使用 hypothesis
and a
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 时,我正在寻找可能的输入。
这是我的当前工作流程的样子:
- 运行 测试
的输入hypothesis
找到产生AssertionError
:$ pytest test.py =========================================== test session starts ============================================ ... ------------------------------------------------ Hypothesis ------------------------------------------------ Falsifying example: test(l=[[0], [1]])
使用此特定输入调试函数,尝试了解此 input/output 是否合法以及函数是否正常工作
问题:
如何跳过这个伪造生成的示例(在本例中为 [[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 的任何示例,并且不会将它们计入您运行示例的预算。
您可能会发现这只会导致示例的细微变化,但您可以传递更复杂的表达式来假定忽略 类 个示例。
您在这里的实际用例是什么?她的正常预期使用模式是修复导致假设失败的错误,并让它以这种方式找到新的错误。我知道这并不总是实用,但我很想知道为什么。