如何跳过 behave python BDD 框架中的测试?

How do I skip a test in the behave python BDD framework?

我正在处理几个月前部分完成的代码分支,其中存在相互交织的依赖关系。因此,向前推进的最简单方法是将特定分支上的失败测试标记为挂起(rspec 方式)或跳过,并在所有内容合并后处理它们。

在其最终报告中,behave 报告了通过的测试数、# 失败的、# 跳过的和# 未测试的(当我按 Ctrl-C 来中止测试时,这些都是非零的) 运行)。所以 behave 作为跳过测试的概念。我如何 访问那个?

Behave 不会跳过测试,它会跳过已经失败的场景中的步骤。不直接支持跳过测试,但如果您只需要 运行 部分测试,则可以 control the execution with tags.

您可以为要跳过的场景或功能使用预定义的“@skip”标签,并且行为将自动跳过测试场景或整个功能。

如果您想在命令行中控制事物,那么您可以按照 suggested in another answer. In brief, you can use whatever tag you want to mark your features and scenarios and then use --tags to select or deselect features and scenarios based on the tags you used. The documentation gives the example of marking slow scenarios with @slow and then using behave --tags=slow to run just the slow tests, or using behave --tags=-slow to exclude the slow tests. Reading the documentation 的建议进行操作,以了解 --tags 允许的语法。

通过上述方法,您可以使用@skip并执行behave --tags=-skip。这将排除标有 @skip 的所有内容,但每次调用都必须包含额外的参数很烦人。 @skip 不能 本身 告诉 Behave 跳过,而不需要命令行上的任何参数吗?

如果你想要一个 @skip 标签来跳过用它标记的功能和场景,而不需要额外的参数,那么,从 Behave 1.2.5 开始,你 必须 将功能构建到您的 environment.py 文件中。 建议相反,它 不是 内置的。我们添加这样的功能:

def before_feature(context, feature):
    if "skip" in feature.tags:
        feature.skip("Marked with @skip")
        return

    # Whatever other things you might want to do in this hook go here.

def before_scenario(context, scenario):
    if "skip" in scenario.effective_tags:
        scenario.skip("Marked with @skip")
        return

    # Whatever other things you might want to do in this hook go here.

.skip 方法的参数是跳过的原因。

我总是使用.effective_tags在场景中进行标签测试。 .effective_tags 字段继承了在要素上设置的标签。在手头的情况下,这没有什么区别,因为如果该功能具有 @skip,那么将强制跳过其中的场景。但是,我更愿意坚持一般原则,即场景中的标签检查应使用 .effective_tags 以便标签继承有效。


等等! tutorial 不是说 @skip 是内置的吗?

不,本教程的介绍有点误导,因为它提供的列表显示 @wip 旁边的 @skip@wip 是内置的所以 @skip 也是内置的吧?不,它们在 "Predefined or often used tags" 的列表中。 @skip 只是 "often used"。之所以经常使用它,是因为以提供信息的方式使用 "skip" 一词来将某些内容标记为已跳过。它并不意味着标签内置于 Behave 中。

如何跳过 Python 中的场景及其应用示例:

所有函数必须在environment.py模块中声明:

environment.py

在 before_all()

中声明 skip_scenario = True

添加一个skip_scenarios=True来控制跳过各种功能文件中的特定场景。,控制器设置在before_all函数在environment.py**

def before_all(context):
    pass

    context.scenario_metadata_dict = {}
    context.feature_metadata = {'skip_scenario': True}

在 before_scenario() 中添加条件:

如果功能文件中的任何场景包含标签“environmentSkip”并且 skip_scenario = True 则仅跳过这些场景。

def before_scenario(context, scenario):
    if context.feature_metadata['skip_scenario'] and "environmentSkip" in scenario.effective_tags:
        scenario.skip("Marked with skip from environment Control")
        return
    elif "skip" in scenario.effective_tags:
        scenario.skip("Marked with @skip tag in feature File")
        return

专题文件:

如果您希望在特定情况下跳过该标签,将具有标签@environmentSkip 标签。

  @system-testing @regression @environmentSkip
  Scenario: validate  Global Exclusion Rules for PrimaryEarlyLifeCLI Strategy
   When  derive the expected Results for global Exclusion rule NEGESTAT
      | KEY             | VALUE                                                                                              |
      |test_scenario_id |TS1_GlobalExclusion_NEGESTAT|

注意:以上示例同时处理跳过场景、处理跳过的自然方式和受控处理跳过。

应用程序

自然方式:将帮助开发人员跳过用于调试目的的场景。

受控方式:将有助于控制特定环境的场景。

如果需要,也可以为 before_feature() 添加相同的控件。

老问题,新答案。

Behave 目前支持过滤掉标签,如下例所示,执行所有未标记为@my_tag_name 的测试:

behave --tags=~@my_tag_name path/to/my_tests.feature

来源:来自行为帮助

# behave --tags-help
Scenarios inherit tags declared on the Feature level. The simplest
TAG_EXPRESSION is simply a tag::

    --tags @dev

You may even leave off the "@" - behave doesn't mind.

When a tag in a tag expression starts with a ~, this represents boolean NOT::

    --tags ~@dev

A tag expression can have several tags separated by a comma, which represents
logical OR::

    --tags @dev,@wip

The --tags option can be specified several times, and this represents logical
AND, for instance this represents the boolean expression
"(@foo or not @bar) and @zap"::

    --tags @foo,~@bar --tags @zap.

Beware that if you want to use several negative tags to exclude several tags
you have to use logical AND::

    --tags ~@fixme --tags ~@buggy.