当我遇到异常
时,我想明确地使behave
中的步骤失败
例如。我根据行为文档编写代码 -
from behave import *
@when('verify test fails.*?(?P<param_dict>.*)')
def test_logger(context, param_dict):
try:
logger.info("testing the logger. this is info message")
logger.info(1/0)
except Exception as e:
logger.error("arrived at exception: "+str(e))
fail("failed with exception: "+str(e))
但它会抛出此错误:
NameError:未定义名称“失败”
我也尝试了其他方法,但没有任何作用
例如。 context.failed = True
(也没用)
如果我没有尝试明确失败,即使它进入异常块,最终测试结果也会变为PASS ...这很奇怪。
答案 0 :(得分:4)
context.failed
只是由Behave设置的属性,不会按原样执行任何操作。它是一个信息属性,虽然您可以使用它来确定一个失败案例并抛出一个断言错误,但它不会对它自己做任何事情。见context.failed
对于您提到的fail
方法,它可能来自unittest
模块,如here所示。该模块也用于Behave的开发测试(参见他们的Github)。我同意,这应该在他们的文件中澄清。
要修复错误,您需要导入unittest
模块。要明确地使步骤失败,您只需在记录消息后引发异常,如下所示:
except Exception as e:
logger.error("arrived at exception: "+str(e))
fail("failed with exception: "+str(e))
raise
答案 1 :(得分:0)
正如@Verv在他们的答案中提到的,只要抛出异常,行为步骤就会被标记为失败,因此您可以重新引发该异常。
但是,行为将显示正常异常的回溯,而您可能只想显示特定的失败消息。
为此,请提出一个AssertionError
。在您的代码中,将如下所示:
except Exception as e:
logger.error("arrived at exception: " + str(e))
raise AssertionError("failed with exception: " + str(e))
如果行为遇到AssertionError
,它将使步骤失败,显示用于实例化错误的消息,但不显示其他异常内容。