【问题标题】:Skip a behave step in the step implementation跳过步骤实现中的行为步骤
【发布时间】:2014-10-22 09:14:08
【问题描述】:

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

类似:

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

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

【问题讨论】:

    标签: python python-behave


    【解决方案1】:

    让我改进@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.2.4 的人的利益(就像我几分钟前一样):此答案中引用的行为代码库中的代码来自 1.2.5。
    • 有没有办法为跳过的场景打印捕获的日志?似乎只有在场景失败时才会打印警告(即在scenario.skip() 之后放置assert False 以显示捕获的日志记录)。
    • 回答我自己的问题:我最终添加了一个日志处理程序,它只记录 msg 以“SKIP”开头的记录
    【解决方案2】:

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

    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() 方法。

    【讨论】:

      【解决方案3】:

      这取决于你追求的效果。 如果您想要的效果是让行为跳过一个步骤并且仅这一步,那么从版本 1.2.5 开始,行为不提供执行此操作的 API。如果您查看behave/model.py,您会发现Step 类没有skipmark_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后面的步骤根本不会执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2019-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多