如何在pytest_bdd_apply_tag方法中获取Scenario名称以对接Zephyr Scale
解决方案
方案一:直接在pytest_bdd_apply_tag中获取Scenario信息
pytest-bdd生成的测试函数会自带__scenario__属性,指向对应的Scenario对象,通过它就能直接获取场景名称。修改你的代码如下:
import re import os import pytest from your_module import ZephyrScale # 替换为ZephyrScale类的实际导入路径 ENV_VARIABLE = "YOUR_ENV_VAR_NAME" # 替换为实际环境变量名 def pytest_bdd_apply_tag(tag, function): env = os.environ.get(ENV_VARIABLE) if tag == 'todo': # 添加skip标记 marker = pytest.mark.skip(reason="Not implemented yet") marker(function) # 获取Scenario对象与名称 scenario = function.__scenario__ scenario_name = scenario.name # 提取issue编号并发送请求 match = re.search(r'\[([A-Z]+-[^\]]+)\]', scenario_name) if match and env: issue_key = match.group(1) ZephyrScale(issue_key).set_skipped() return True else: # 回退到pytest-bdd默认标签处理逻辑 return None
注意事项:
__scenario__属性在pytest_bdd_apply_tag钩子中必然存在,因为该钩子仅处理绑定到pytest-bdd场景的标签。- 增加了匹配结果判断,避免因场景名称无issue编号导致的
AttributeError。 - 保留环境变量判断,仅在指定环境下发送请求(若无需环境限制可移除该判断)。
方案二:使用pytest_runtest_setup钩子分离逻辑
如果希望将标记逻辑与请求逻辑分开,可以借助pytest_runtest_setup钩子——该钩子会在测试执行前触发,即使测试被skip也会运行:
import re import os from your_module import ZephyrScale ENV_VARIABLE = "YOUR_ENV_VAR_NAME" def pytest_runtest_setup(item): env = os.environ.get(ENV_VARIABLE) # 检查测试是否带有todo标记 if item.get_closest_marker("todo") and env: # 获取Scenario对象 scenario = item.function.__scenario__ scenario_name = scenario.name match = re.search(r'\[([A-Z]+-[^\]]+)\]', scenario_name) if match: issue_key = match.group(1) ZephyrScale(issue_key).set_skipped()
这种方式逻辑更清晰,适合需要在测试执行前统一处理的场景。
内容的提问来源于stack exchange,提问作者FieryCat
相关产品推荐
相关产品推荐

