如何在行为步骤实现中明确地使步骤失败

时间:2017-09-18 07:56:44

标签: python python-behave

当我遇到异常

时,我想明确地使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 ...这很奇怪。

2 个答案:

答案 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,它将使步骤失败,显示用于实例化错误的消息,但不显示其他异常内容。