gpt4 book ai didi

python-hypothesis - 使用 pytest.raises 的假设状态测试不报告步骤顺序

转载 作者:行者123 更新时间:2023-12-02 01:00:23 24 4
gpt4 key购买 nike

我想写一个hypothesis.stateful.RuleBasedStateMachine它断言在某些情况下会引发异常。 pytest提供 raises用于编写异常测试的上下文管理器。如果我使用 pytest.raiseshypothesis.stateful.rule 里面,导致测试失败的步骤顺序报告。

不使用 pytest.raises 重写规则产生所需的行为:显示步骤的顺序。

下面是一些示例代码:

from os import getenv

from pytest import raises

from hypothesis.stateful import RuleBasedStateMachine, rule

SHOW_PROBLEM = getenv('SHOW_PROBLEM') == 'yes'


# A state machine which asserts that an exception is raised in under some condition
class FifthCallShouldRaiseValueError(RuleBasedStateMachine):

def __init__(self):
super().__init__()
self.model = Model()
self.count = 0

if SHOW_PROBLEM:

# This version does NOT report the rule sequence
@rule()
def the_rule(self):
self.count += 1
if self.count > 4:
with raises(ValueError):
self.model.method()

else:

# This version DOES report the rule sequence
@rule()
def the_rule(self):
self.count += 1
if self.count > 4:
try:
self.model.method()
except ValueError: assert True
except : assert False
else : assert False


T = FifthCallShouldRaiseValueError.TestCase


# A model that deliberately fails the test, triggering reporting of
# the sequence of steps which lead to the failure.
class Model:

def __init__(self):
self._count = 0

def method(self):
self._count += 1
if self._count > 4:
# Deliberate mistake: raise wrong exception type
raise TypeError

要观察行为的差异,请执行测试

  • SHOW_PROBLEM=yes pytest <...>
  • SHOW_PROBLEM=no pytest <...>

在第二种情况下,输出将显示

state = FifthCallShouldRaiseValueError()
state.the_rule()
state.the_rule()
state.the_rule()
state.the_rule()
state.the_rule()
state.teardown()

第一种情况的输出中缺少这一系列步骤。这是我们所希望的:在两种情况下都应显示序列。

pytest.raises提高 Failed: DID NOT RAISE <class 'ValueError'>而手写版提高了AssertionError .前者在未能引发所需的异常时提供更多信息,但不知何故似乎阻止了 hypothesis.stateful来自报告步骤的顺序,它告诉我们如何进入该状态,并且通常是输出中最有趣的部分。

除了不使用 pytest.raises 之外,还可以做些什么来缓解这种情况,即确保打印出步骤顺序?

最佳答案

事实证明,如果规则引发 BaseException 或非 Exception 子类,则不会打印这些步骤。 pytest.raises(...) 如果它没有得到预期的异常,就会引发这样的错误,而你就是这样。

https://github.com/HypothesisWorks/hypothesis/issues/1372

既然它已经被识别出来,这并不是一个特别棘手的错误 - 感谢您通过报告可重现的案例参与其中! - 所以我们应该尽快修复。

更新:此错误已在 Hypothesis 3.65.1 中修复, 于 2018-07-03.

关于python-hypothesis - 使用 pytest.raises 的假设状态测试不报告步骤顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51068206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com