11

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

就像是:

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

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

4

3 回答 3

14

让我改进@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(alongside 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
于 2015-04-12T13:12:19.590 回答
5

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

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()

Feature, Scenario,ScenarioOutline都有一个mark_skipped()方法。

于 2014-12-02T20:59:31.573 回答
3

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

如果您想要的效果是将步骤及其整个场景标记已跳过,那么这是可能的。如果您对此没意见,那么Barry 的答案就是您在 1.2.5 之前必须做的行为:用于before_feature扫描场景并将其标记为已跳过,然后再运行它们。这将有效地将您的步骤标记为已跳过。

正如m4tx 的回答所示,从行为 1.2.5 开始,您可以context.scenario.skip从步骤的实现函数中调用以跳过该场景。但是,同样,这会将整个场景标记为已跳过。确实,前面的步骤已经执行并且有可能失败,但是当场景出现在跳过的场景计数中时,它的所有步骤(包括那些在调用的步骤之前可能已经通过的步骤context.scenario.skip)将出现在跳过的步骤列表。而且,调用的步骤后面的步骤context.scenario.skip根本不会执行。

于 2015-07-20T12:02:50.680 回答