pytest pytest_collection_finish钩子函数收集测试命中用例数据
2026/8/5 14:47:07 网站建设 项目流程

背景

在使用 pytest 框架执行测试用例时,可能会遇到各种情况,例如测试环境异常、自动化测试卡死或任务异常中断,这些问题可能导致自动化测试任务被迫中断。当问题修复后,期望能够继续自动化执行测试,但直接重新执行会导致之前已执行的用例被重复执行。为了提高测试的执行效率,本文将介绍一种使用 pytest 自带的pytest_collection_finish钩子函数结合 pytest 测试缓存机制 pytest测试缓存构造 的方法,以实现只执行中断前未执行的测试用例。

钩子介绍

pytest_collection_finish是一个钩子函数,用于在 pytest 完成测试收集后执行自定义操作。这个钩子是在所有测试用例收集完毕之后调用的,适合用于处理收集后的一些逻辑,比如打印统计信息、处理测试用例等。

解决方案概述

  1. 利用pytest_collection_finish钩子: 在收集测试用例阶段,通过该钩子判断并筛选出需要执行的测试用例。
  2. 使用 pytest 测试缓存: 利用 pytest 提供的测试缓存机制来记录每个测试用例的执行状态,从而在测试执行异常中断后恢复未执行的用例。

实现

将钩子在conftest.py文件中实现

# -*- coding: utf-8 -*-# conftest.pyimportosimportjsondefupload_target_cases(target_cases):print("本次测试命中 {} 个用例".format(len(target_cases)))case_data={"cases":target_cases}host_port='10.132.1.127:8123'# 文件服务器地址pipeline_id=os.getenv('CI_PIPELINE_CONFIG_ID',10000)# 流水线idtask_id=os.getenv('CI_PIPLINE_HISTORY_NUMBER',10001)# 任务idfile_name='{}_{}_cases.json'.format(pipeline_id,task_id)# 将数据写入 JSON 文件withopen(file_name,'w')asjson_file:json.dump(case_data,json_file,indent=4)# 文件上传至文件服务器中保存os.system('curl -X POST http://{}/files/Test -F file=@{}'.format(host_port,file_name))print("本次测试命中用例集下载地址:http://{}/Test/{}".format(host_port,file_name))defpytest_collection_finish(session):target_cases=[]foriteminsession.items:target_cases.append(item.nodeid)upload_target_cases(target_cases)

这里将测试命中的数据进行持久化保存,后续可以将这里采集的数据与测试报告中的数据取差集得到未执行的用例,构造出新的缓存,使用缓存执行测试即可

相关教程

  • pytest缓存构造
  • 动态allure报告生成
  • allure报告合并

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询