如何实现pytest执行每个测试函数时同步运行record_video录屏函数
pytest 逐测试用例绑定录屏实现方案
实现思路
无侵入耦合录屏逻辑,不需要修改每个测试函数的内部代码,依托pytest自身的fixture机制自动在每个测试用例执行前后触发录屏启停,录屏文件和测试用例一一对应,完全不影响pytest原生测试报告的正常生成。
具体实现代码
在测试项目根目录新建conftest.py文件,pytest会自动加载该文件中的全局配置,写入以下内容:
import pytest import os # 若使用自定义录屏方法,导入你的record_video即可 # from your_utils import record_video # 配置录屏文件存储目录 VIDEO_DIR = "./test_record_videos" os.makedirs(VIDEO_DIR, exist_ok=True) @pytest.fixture(autouse=True) def auto_record_video(request): # 生成当前测试用例对应的录屏文件路径,文件名和测试函数名绑定 test_func_name = request.node.name video_file_path = os.path.join(VIDEO_DIR, f"{test_func_name}.mp4") # 启动录屏:替换为你自己的record_video启动逻辑 # 示例为通用录屏启动逻辑,若你已有封装好的record_video,直接传入保存路径启动即可,拿到录屏控制句柄 # recorder = record_video(save_path=video_file_path) import subprocess recorder = subprocess.Popen( ["ffmpeg", "-f", "gdigrab", "-framerate", "15", "-i", "desktop", video_file_path], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, shell=True ) # 断点,执行当前测试函数 yield # 测试函数执行完成,停止录屏,完成mp4文件写入 recorder.terminate() recorder.wait() # 若你自定义的record_video有单独停止方法,替换为 recorder.stop() 即可
配置说明
- fixture的
autouse=True参数表示该逻辑对所有收集到的测试函数自动生效,执行test_function1、test_function2等任意测试函数时,都会自动启动对应录屏,用例结束自动停止生成mp4文件,不需要在测试代码里手动调用录屏方法。 - 所有录屏文件统一保存在
./test_record_videos目录下,文件名和测试函数名一一对应,执行完所有测试后直接到该目录取对应mp4文件即可。 - 原有pytest的终端输出、html报告、allure报告等标准测试报告不受任何影响,正常生成。
可选优化
- 若只需要保存执行失败用例的录屏,可以搭配pytest的
pytest_runtest_makereport钩子获取用例执行结果,用例执行成功时直接删除对应录屏文件,节省存储空间。 - 若需要把录屏作为附件嵌入测试报告,可以在fixture结束逻辑里拿到
video_file_path,追加到报告的附件列表即可。
内容的提问来源于stack exchange,提问作者Anatoly Rozhkov
相关产品推荐
相关产品推荐

