pytest-bdd中带参数的自定义标记无法被识别问题求助
pytest-bdd中带参数的自定义标记无法识别的解决方法
问题现象
在pytest.ini中声明带参数的自定义标记时,该标记无法在pytest-bdd的feature文件中被正常识别,无参数标记可正常使用。
配置与示例
pytest.ini配置:
[pytest] markers = swr(issue1): 关联软件需求链接 smoke: 冒烟测试组件
无参数标记@smoke可正常运行:
Feature: 简单示例 @smoke Scenario: 两数相加 Given 已设置数字7 When 加上数字9 Then 结果应为16
但使用带参数的@swr("123")标记时会触发警告:
Feature: 简单示例 @swr("123") Scenario: 两数相加 Given 已设置数字7 When 加上数字9 Then 结果应为16
警告信息:
../../../../../.local/lib/python3.10/site-packages/pytest_bdd/plugin.py:127 /home/parallels/.local/lib/python3.10/site-packages/pytest_bdd/plugin.py:127: PytestUnknownMarkWarning: Unknown pytest.mark.swr("123") - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html mark = getattr(pytest.mark, tag)
原因分析
pytest-bdd解析feature文件中的标记时,会把带参数的标记(如swr("123"))整体当作标签名,尝试调用getattr(pytest.mark, 'swr("123")')查找对应标记,而非识别为swr标记加参数,因此找不到已注册的swr标记,触发警告。
解决方案
方案1:自定义插件修改标记解析逻辑
编写conftest.py放在测试项目根目录,重写pytest-bdd的标记处理逻辑,拆分标记名与参数:
import pytest from pytest_bdd.plugin import pytest_bdd_apply_tag def pytest_bdd_apply_tag(tag, function): # 处理带参数的标记格式 if "(" in tag and ")" in tag: mark_name, args_part = tag.split("(", 1) # 提取参数(这里处理字符串参数,可根据需求调整) args = args_part.rstrip(")").strip('"') mark = getattr(pytest.mark, mark_name)(args) mark(function) return True # 调用原逻辑处理无参数标记 return pytest_bdd_apply_tag(tag, function)
方案2:标记映射关联
不在feature文件中直接使用带参数标记,改用无参数标记作为标识,再在代码中关联带参数的pytest标记:
- feature文件:
Feature: 简单示例 @swr_123 Scenario: 两数相加 Given 已设置数字7 When 加上数字9 Then 结果应为16
- conftest.py中添加映射逻辑:
def pytest_collection_modifyitems(items): for item in items: if "swr_123" in item.keywords: item.add_marker(pytest.mark.swr("123")) item.keywords.pop("swr_123")
内容的提问来源于stack exchange,提问作者amhest
相关产品推荐
相关产品推荐

