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

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

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

前言

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

一、创建Feature文件

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

gherkin 复制代码
@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文件,内容如下:

python 复制代码
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哪些标签是有效的,并可以根据这些标签来选择性地运行特定的功能或场景。

text 复制代码
[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文件,新增内容如下:

python 复制代码
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 标签的场景,可以使用以下命令:

bash 复制代码
pytest -m scenario_tag_1

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

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

bash 复制代码
pytest -m "scenario_tag_2 and scenario_tag_02"

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

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

bash 复制代码
pytest -m "scenario_tag_1 or scenario_tag_2"

5.4 排除特定标签的测试

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

bash 复制代码
pytest -m "not scenario_tag_1"

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

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

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

bash 复制代码
pytest -k "feature_tag_1"

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

bash 复制代码
pytest -k "Tags"

这会匹配所有名称中包含"Tags"的测试,无论它们是否包含具体的标签。

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

bash 复制代码
pytest -m "scenario_tag_1" -k "Tags"

总结

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

相关推荐
互联网杂货铺8 小时前
单元测试总结
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
大霞上仙18 小时前
pytest入门十:配置文件
pytest
大霞上仙18 小时前
pytest入门九:feature
pytest
测试杂货铺20 小时前
Selenium操作指南
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
天天要nx20 小时前
D99【python 接口自动化学习】- pytest进阶之fixture用法
python·pytest
互联网杂货铺21 小时前
如何实现基于场景的接口自动化测试用例?
自动化测试·软件测试·python·测试工具·程序人生·职场和发展·测试用例
blues_C1 天前
Pytest-Bdd-Playwright 系列教程(16):标准化JSON报告&Gherkin格式命令行报告
自动化测试·json·pytest·bdd
测试19982 天前
树控件、下拉框、文本框常用测试用例
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例