【发布时间】:2014-10-22 09:14:08
【问题描述】:
有没有办法告诉执行步骤中的行为以跳过当前步骤?
类似:
@given("bla bla bla")
def step():
skip_current_step()
用例是我想检查是否安装了一些附加软件。如果没有,我希望跳过完整的场景。
【问题讨论】:
标签: python python-behave
有没有办法告诉执行步骤中的行为以跳过当前步骤?
类似:
@given("bla bla bla")
def step():
skip_current_step()
用例是我想检查是否安装了一些附加软件。如果没有,我希望跳过完整的场景。
【问题讨论】:
标签: python python-behave
让我改进@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
【讨论】:
scenario.skip() 之后放置assert False 以显示捕获的日志记录)。
我不知道您是否可以从步骤内部跳过,但您可以在功能级别跳过整个场景:
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,您会发现Step 类没有skip 和mark_skipped 方法。没有提供替代机制来执行此操作。
如果您想要的效果是将步骤和标记为已跳过,那么这是可能的。如果您对此没问题,那么answer by Barry 确实是您在 1.2.5 之前必须执行的操作:使用 before_feature 扫描场景并将其标记为已跳过,然后再运行它们。这将有效地将您的步骤标记为已跳过。
作为m4tx's answer shows,从行为1.2.5 开始,您可以从步骤的实现函数中调用context.scenario.skip 来跳过该场景。但是,这会将整个场景标记为已跳过。确实,前面的步骤已经执行并且有可能失败,但是当场景出现在跳过的场景计数中时,所有它的步骤(包括那些在名为context.scenario.skip) 的步骤将出现在跳过的步骤列表中。而且context.scenario.skip后面的步骤根本不会执行。
【讨论】: