如何为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
相关产品推荐
相关产品推荐

