跳过步骤实现中的行为步骤

时间:2014-10-22 09:14:08

标签: python python-behave

有没有办法告诉步骤实现中的行为跳过当前步骤?

类似的东西:

@given("bla bla bla")
def step():
    skip_current_step()

用例是我想检查是否安装了一些其他软件。如果没有,我希望跳过完整的场景。

3 个答案:

答案 0 :(得分:9)

让我改进@ Barry的回答:

基本上,他提出的建议(即scenario.mark_skipped())等于:

scenario.skip(require_not_executed=True)

确切地说,mark_skipped()的来源如下:

def mark_skipped(self):
    """Marks this scenario (and all its steps) as skipped.
    Note that this method can be called before the scenario is executed.
    """
    self.skip(require_not_executed=True)
    assert self.status == "skipped", "OOPS: scenario.status=%s" % self.status

skip()的定义如下:

def skip(self, reason=None, require_not_executed=False)

一些事情:

  • require_not_executed=True表示如果已经过了任何步骤,则无法跳过方案,即第二步或后续步骤中的mark_skipped()将抛出异常,然后跳过所有步骤,而不是仅仅跳过更远的步骤步骤
  • skip()允许提供跳过的原因,然后将其记录为WARN

此外,scenario对象在上下文中可用context.scenario(与context.feature一起)。

最终,简单的例子:

@given("test photos in upload directory")
def step_impl(context):
    if not connection_available():
        context.scenario.skip(reason='internet connection is unavailable')

结果:

Skipped: skipped
WARNING:behave:SKIP Scenario Retrieving uploaded photo details: internet connection is unavailable

答案 1 :(得分:3)

我不知道您是否可以跳过某个步骤,但是您可以跳过功能级别的整个场景:

def before_feature(context, feature):
    is_software_installed = some_foo_magic()

    if not is_software_installed:
        for scenario in feature.scenarios:
            if depends_on_software(scenario):
                scenario.mark_skipped()

FeatureScenarioScenarioOutline都有mark_skipped()方法。

答案 2 :(得分:3)

这取决于你要去的效果。 如果你想要的效果是跳过一个步骤而只跳过这一步,那么从版本1.2.5开始就不提供API来执行此操作。如果您查看behave/model.py,您会发现skip类没有mark_skippedStep方法。没有提供替代机制来执行此操作。

如果你想要的效果是表现为将步骤标记为跳过的整个场景,那么这是可能的。如果你对此没问题,那么answer by Barry实际上是您在1.2.5之前必须执行的操作:使用before_feature扫描方案并在运行之前将其标记为已跳过。这样可以有效地将您的步骤标记为已跳过。

作为m4tx's answer shows,从行为1.2.5开始,您可以从步骤的实现函数中调用context.scenario.skip来跳过该场景。但是,这将再次将整个场景标记为已跳过。确实,早期的步骤已经执行并且有可能失败但是当场景出现在跳过的场景计数中并且所有它的步骤(包括那些可能已经过去的那些步骤)名为context.scenario.skip的步骤将出现在跳过的步骤列表中。此外,调用context.scenario.skip的步骤之后的步骤根本不会执行。