有没有办法告诉在步骤实现中的行为以跳过当前步骤?
就像是:
@given("bla bla bla")
def step():
skip_current_step()
用例是我想检查是否安装了一些附加软件。如果没有,我希望跳过完整的场景。
有没有办法告诉在步骤实现中的行为以跳过当前步骤?
就像是:
@given("bla bla bla")
def step():
skip_current_step()
用例是我想检查是否安装了一些附加软件。如果没有,我希望跳过完整的场景。
让我改进@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
我不知道您是否可以从步骤内部跳过,但您可以在功能级别跳过整个场景:
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()
方法。
这取决于你追求的效果。如果您想要的效果是让行为跳过一个步骤并且只跳过这一步,那么从版本 1.2.5 开始,行为不提供执行此操作的 API。如果您查看,behave/model.py
您会发现该类没有skip
和mark_skipped
方法Step
。没有提供替代机制来执行此操作。
如果您想要的效果是将步骤及其整个场景标记为已跳过,那么这是可能的。如果您对此没意见,那么Barry 的答案就是您在 1.2.5 之前必须做的行为:用于before_feature
扫描场景并将其标记为已跳过,然后再运行它们。这将有效地将您的步骤标记为已跳过。
正如m4tx 的回答所示,从行为 1.2.5 开始,您可以context.scenario.skip
从步骤的实现函数中调用以跳过该场景。但是,同样,这会将整个场景标记为已跳过。确实,前面的步骤已经执行并且有可能失败,但是当场景出现在跳过的场景计数中时,它的所有步骤(包括那些在调用的步骤之前可能已经通过的步骤context.scenario.skip
)将出现在跳过的步骤列表。而且,调用的步骤后面的步骤context.scenario.skip
根本不会执行。