You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 14:32:18