
背景在使用 pytest 框架执行测试用例时可能会遇到各种情况例如测试环境异常、自动化测试卡死或任务异常中断这些问题可能导致自动化测试任务被迫中断。当问题修复后期望能够继续自动化执行测试但直接重新执行会导致之前已执行的用例被重复执行。为了提高测试的执行效率本文将介绍一种使用 pytest 自带的pytest_collection_finish钩子函数结合 pytest 测试缓存机制 pytest测试缓存构造 的方法以实现只执行中断前未执行的测试用例。钩子介绍pytest_collection_finish是一个钩子函数用于在 pytest 完成测试收集后执行自定义操作。这个钩子是在所有测试用例收集完毕之后调用的适合用于处理收集后的一些逻辑比如打印统计信息、处理测试用例等。解决方案概述利用pytest_collection_finish钩子: 在收集测试用例阶段通过该钩子判断并筛选出需要执行的测试用例。使用 pytest 测试缓存: 利用 pytest 提供的测试缓存机制来记录每个测试用例的执行状态从而在测试执行异常中断后恢复未执行的用例。实现将钩子在conftest.py文件中实现# -*- coding: utf-8 -*-# conftest.pyimportosimportjsondefupload_target_cases(target_cases):print(本次测试命中 {} 个用例.format(len(target_cases)))case_data{cases:target_cases}host_port10.132.1.127:8123# 文件服务器地址pipeline_idos.getenv(CI_PIPELINE_CONFIG_ID,10000)# 流水线idtask_idos.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,indent4)# 文件上传至文件服务器中保存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报告合并