Pytest-Bdd-Playwright 系列教程(17):标签管理(Tags)

时间:2024-12-18 07:28:41

Pytest-Bdd-Playwright 系列教程(17):标签管理(Tags)

  • 前言
  • 一、创建Feature文件
  • 二、创建步骤定义文件
  • 三、pytest.ini 配置文件
  • 四、conftest.py文件
  • 五、运行测试
    • 5.1 运行带有特定标签的测试
    • 5.2 运行带有多个标签的测试
    • 5.3 运行带有任意标签的测试
    • 5.4 排除特定标签的测试
    • 5.5 使用 -k 参数筛选运行测试
  • 总结

前言

  • 为了有效地管理和执行大量的测试用例,我们需要一种灵活的方式来控制哪些测试用例应该执行,哪些可以跳过;
  • Pytest-BDD作为一种基于 Behavior Driven Development(BDD)的测试框架,提供了标签(Tags)功能,允许我们在Feature文件和Scenario中添加标签,从而灵活地控制测试的执行顺序与范围。

一、创建Feature文件

新增features/tag_demo.feature文件,内容如下:

@feature_tag_1 @feature_tag_2
Feature: Tags

    @scenario_tag_1 @scenario_tag_01
    Scenario: Tags 1
        Given 这是一个前置条件步骤

    @scenario_tag_2 @scenario_tag_02
    Scenario: Tags 2
        Given 这是一个前置条件步骤

    @todo
    Scenario: To-do

在这个示例中,我们为Feature和每个Scenario都添加了标签。Feature和Scenario均可以添加一个或多个标签。标签可以帮助我们在运行时选择性地执行某些特定的功能或场景。

注:@todo标签表示该场景尚未实现,可以在测试运行时将其跳过。

二、创建步骤定义文件

新增test_tag_demo.py文件,内容如下:

from pytest_bdd import given, scenarios

@given('这是一个前置条件步骤')
def _():
    return 'given'

scenarios('tag_demo.feature')

在这段代码中,@given装饰器将这是一个前置条件步骤与Python函数进行了关联。当pytest-bdd执行测试时,遇到这个步骤时将调用该函数。在这个简单的例子中,我们只是返回了字符串’given’,实际应用中可以根据需求进行更复杂的操作。

此外,scenarios(‘tag_demo.feature’)用于加载tag_demo.feature文件中的所有场景。如果Feature文件中有多个场景,我们可以在步骤定义文件中统一加载它们,并根据需要定义相应的步骤。

三、pytest.ini 配置文件

为了让pytest-bdd识别和执行Feature文件中的标签,我们需要在pytest.ini配置文件中为标签添加标记。通过在配置文件中定义markers,我们可以告知pytest哪些标签是有效的,并可以根据这些标签来选择性地运行特定的功能或场景。

[pytest]
markers =
    feature_tag_1
    feature_tag_2
    rule_tag_01
    scenario_tag_1
    scenario_tag_01
    scenario_tag_2
    scenario_tag_02

在上面的配置文件中,我们为每个标签添加了标记,确保pytest能够识别并根据这些标签来执行相应的测试。例如,当我们只希望运行带有@scenario_tag_1标签的场景时,可以使用pytest命令行选项来过滤标签。

四、conftest.py文件

在项目根目录的conftest.py文件,新增内容如下:

def pytest_bdd_apply_tag(tag, function):
    if tag == 'todo':
        marker = pytest.mark.skip(reason="该用例尚未实现")
        marker(function)
        return True
    else:
        # 回退到pytest-bdd的默认行为
        return None

在这段代码中,pytest_bdd_apply_tag钩子函数会检查每个场景的标签。如果场景的标签是@todo,则会使用pytest.mark.skip标记该场景为跳过,并在测试执行时跳过该场景。通过这种方式,我们可以灵活地控制测试用例的执行,确保未实现的场景不会被执行。

五、运行测试

5.1 运行带有特定标签的测试

假设我们希望只运行带有 @scenario_tag_1 标签的场景,可以使用以下命令:

pytest -m scenario_tag_1

在这里插入图片描述

5.2 运行带有多个标签的测试

如果我们希望运行带有多个标签的测试,例如 @scenario_tag_2 和 @scenario_tag_02,可以使用 and 操作符:

pytest -m "scenario_tag_2 and scenario_tag_02"

在这里插入图片描述

5.3 运行带有任意标签的测试

如果我们希望运行带有任意标签的测试,例如 @scenario_tag_1 或 @scenario_tag_2,可以使用 or 操作符:

pytest -m "scenario_tag_1 or scenario_tag_2"

在这里插入图片描述

5.4 排除特定标签的测试

如果我们希望排除某些标签,例如排除 @scenario_tag_1 标签的场景,可以使用 not 操作符:

pytest -m "not scenario_tag_1"

5.5 使用 -k 参数筛选运行测试

与 -m 参数不同,-k 可以通过匹配Feature、Scenario、函数名、标签等来进行更精细的筛选。

如果我们想要运行所有包含 feature_tag_1 标签的场景,可以使用以下命令:

pytest -k "feature_tag_1"

在这里插入图片描述

-k 的更多使用方式
按名称部分匹配:我们还可以通过 -k 参数部分匹配测试名称,例如,如果我们只想运行名称中包含“Tag”的测试,可以使用:

pytest -k "Tags"

这会匹配所有名称中包含"Tags"的测试,无论它们是否包含具体的标签。
在这里插入图片描述

组合使用 -m 和 -k:如果我们希望根据标签和测试名称的组合进行筛选,可以同时使用 -m 和 -k,例如,运行带有 scenario_tag_1 标签且名称中包含“Tags”的测试:

pytest -m "scenario_tag_1" -k "Tags"

总结

通过标签化管理,我们可以更加灵活和高效地控制 Pytest-BDD 测试的执行。