
Allure-Pytest 当前不支持动态扩展内置 Severity 枚举(如添加 "high" 或 "low"),因其校验逻辑硬编码于源码中,仅接受预定义的 BLOCKER/CRITICAL/NORMAL/MINOR/TRIVIAL 值;尝试传入非法值将被静默降级为默认 normal,且自定义标签可能无法渲染。
allure-pytest 当前不支持动态扩展内置 severity 枚举(如添加 "high" 或 "low"),因其校验逻辑硬编码于源码中,仅接受预定义的 `blocker`/`critical`/`normal`/`minor`/`trivial` 值;尝试传入非法值将被静默降级为默认 `normal`,且自定义标签可能无法渲染。
Allure 的严重级别(Severity)是其报告中用于分类测试用例风险等级的核心元数据之一。然而,截至 allure-pytest 2.13.2 及对应 allure-python-commons 版本,Severity 是一个封闭的枚举类型(allure.constants.Severity),其校验逻辑位于 mapping.py:
if tag in [severity for severity in Severity]:
return Label(name=LabelType.SEVERITY, value=tag)
这意味着:
✅ 合法值(如 'critical', 'minor')会被正确识别并渲染为对应 severity 标签;
❌ 非法值(如 'high', 'low', 'urgent')不会抛出异常,而是被直接忽略,最终 fallback 到默认 severity —— 即 normal,且该 label 不会出现在报告的 Labels 区域。
✅ 正确使用内置 Severity 的方式
请始终使用枚举成员的字符串值(小写):
import allure
@allure.severity(allure.severity_level.CRITICAL) # 推荐:使用常量
def test_critical_flow():
pass
@allure.severity('blocker') # 等效:直接传字符串
def test_blocker_case():
pass
⚠️ 注意:
@allure.label('severity', '...')不是标准用法,应统一使用@allure.severity(...)装饰器或allure.dynamic.severity(...)运行时设置。
❌ 为什么不能“覆盖”或“扩展”Severity 枚举?
Python 的 Enum 类型在运行时不可变;即使你尝试 monkey patch 或继承 Severity,Allure 的映射逻辑仍只遍历原始枚举成员,新值不会被识别。
? 替代方案(推荐)
若业务需区分更细粒度的风险等级(如 high/low),建议采用 自定义标签(Custom Labels) 作为补充:
@allure.label('priority', 'high') # 自定义 priority 标签
@allure.label('risk-level', 'low') # 自定义 risk-level 标签
@allure.severity(allure.severity_level.NORMAL) # 保留合规的 severity
def test_with_custom_context():
pass
生成报告后,这些标签将显示在测试用例详情页的 Labels 区域(需 Allure 2.21+ 支持完整 label 渲染)。你还可以通过 Allure CLI 过滤:
allure serve ./allure-results --profile custom --label priority=high
? 总结与建议
- 不要尝试绕过 Severity 校验:硬编码限制无法通过配置或继承规避;
- 坚持使用官方 severity 值:确保报告兼容性与团队共识;
-
用
@allure.label()补充业务语义:priority、risk-level、layer、team等均为合法且灵活的扩展字段; -
提交 Feature Request:可前往 allure-python GitHub 提议开放 severity 扩展机制(例如支持
--allure-severity-allow=high,low参数)。
当前最佳实践是:用标准 severity 表达缺陷影响程度,用自定义 label 承载项目特定维度信息——二者协同,既合规又可扩展。










