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 测试的执行。