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

如何为allure-pytest报告添加未使用marker对应的跳过测试条目

问题

我正在使用allure-pytest,通过stories/markers表示测试计划需求,已在pytest.ini中添加marker列表。在conftest.py中生成了未被使用的marker集合,希望将每个未使用的marker作为跳过测试添加到allure报告中,请问是否有可行方法?

已尝试的代码

import pytest
import allure

import allure_commons
from allure_commons.model2 import TestResult, Status, Label, Parameter
from allure_commons.types import AttachmentType
from allure_commons.reporter import AllureReporter
from allure_commons.utils import uuid4

def pytest_collection_finish(session):
    # 获取pytest.ini中定义的所有marker
    marker_dict = session.config.getini('markers')
    markers = set(marker_dict)

    # 获取所有已收集测试中使用到的marker
    used_markers = set()
    for item in session.items:
        used_markers.update(set([m.name for m in item.iter_markers()]))

    # 找出定义了但未被使用的marker
    unused_markers = markers - used_markers

    item = session.items[0]

    # 为未使用的marker添加跳过测试
    if unused_markers and item:
        print(item.parent)
        for marker in unused_markers:
            print("adding skipped test: ", marker)
            args = marker.split(":")
            name = args[0]
            add_external_test_result(name, "skipped")

            session.items.append(create_skipped_test(name, marker)) # 报错:缺少config

            #skipped_test = pytest.Function(name=f"test_missing_{name}", parent=None, config=item.config) # 报错:方法已废弃
            #skipped_test = item.from_parent(parent=item.parent, name=f"test_missing_{name}")
            #skipped_test.add_marker(pytest.mark.skip(reason=f"No test created for marker({marker})"))
            #session.items.append(skipped_test) # 报错:父对象不存在该方法

def create_skipped_test(name, marker):
    # 创建带跳过标记的虚拟测试函数
    @pytest.mark.skip(reason=f"unmarked marker: {name}")
    @pytest.mark.usefixtures() # 添加必要的fixtures
    def test_dummy():
        pass

    # 给测试函数添加marker
    test_dummy = pytest.mark.parametrize(name, [marker])(test_dummy)

    return test_dummy

可行方案

直接通过allure底层API向报告中添加跳过的测试结果,无需修改pytest的测试集合(session.items),具体实现如下:

import pytest
from allure_commons.reporter import AllureReporter
from allure_commons.model2 import TestResult, Status, Label
from allure_commons.utils import uuid4

def pytest_collection_finish(session):
    # 1. 获取所有定义的marker和已使用的marker
    defined_markers = set(session.config.getini('markers'))
    used_markers = set()
    for item in session.items:
        used_markers.update(m.name for m in item.iter_markers())
    unused_markers = defined_markers - used_markers

    if not unused_markers:
        return

    # 2. 获取allure的reporter实例
    allure_reporter = session.config.pluginmanager.get_plugin("allure_reporter")
    if not isinstance(allure_reporter, AllureReporter):
        return

    # 3. 为每个未使用的marker生成跳过的测试结果
    for marker in unused_markers:
        marker_name = marker.split(":")[0]
        test_uid = uuid4()
        # 构造测试结果
        test_result = TestResult(
            uuid=test_uid,
            name=f"未实现测试需求: {marker_name}",
            fullName=f"unused_markers.test_{marker_name}",
            status=Status.SKIPPED,
            statusDetails={
                "message": f"该marker已在pytest.ini中定义,但未关联任何测试用例: {marker}"
            },
            labels=[
                Label(name="story", value=marker_name),
                Label(name="tag", value="unused_marker")
            ]
        )
        # 向allure报告中添加测试
        allure_reporter.start_test(test_result)
        allure_reporter.stop_test(test_result)

说明

  • 该方案直接操作allure报告生成逻辑,绕过pytest测试收集流程,避免手动创建测试项的兼容性问题
  • 生成的跳过测试会在allure报告中显示,包含marker名称、未使用原因,还可通过label关联对应story/tag
  • 无需修改原有测试代码,仅在conftest.py中添加该钩子函数即可

内容的提问来源于stack exchange,提问作者Gaurav Mittal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:05:14