如何让Pytest自动生成并复用Pickle存储的耗时问题解决方案
自动生成并复用Pytest测试所需的Pickle结果文件
开发依赖耗时问题解决方案的项目时,我们可以通过Pickle保存求解结果,避免重复执行耗时步骤。要实现Pytest首次运行自动生成结果文件、后续直接复用,无需手动调整代码,可按以下方式处理:
基础实现方案
核心思路是在测试逻辑中先检查结果文件是否存在,不存在则自动执行求解并保存:
修改后的完整代码如下:
import time import pickle import os # 新增导入文件检查模块 class Solution: """ 代表耗时问题的解决方案类 """ def solve_difficult_problem() -> Solution: time.sleep(1) # 模拟耗时求解过程 return Solution() def prepare_solution() -> None: """ 仅执行一次耗时求解,保存结果供后续测试复用 """ solution = solve_difficult_problem() with open('solved.pickle', 'wb') as file: pickle.dump(solution, file) def my_feature(solution: Solution) -> None: """ 基于解决方案实现的新功能 """ print(solution) def test_my_feature() -> None: # 自动判断:文件不存在时生成结果,存在则直接加载 if not os.path.exists('solved.pickle'): prepare_solution() with open('solved.pickle', 'rb') as file: solution = pickle.load(file) assert my_feature(solution) is None
关键说明
- 通过
os.path.exists('solved.pickle')检查文件状态,确保只有首次运行(文件不存在)时才执行耗时的solve_difficult_problem() - 生成的
solved.pickle会长期保留在项目中,除非手动删除或移除项目,后续测试直接加载复用 - 无需再手动注释/取消注释
prepare_solution()调用,完全自动化处理
进阶优化:使用Pytest Fixture
如果项目中有多个测试函数需要用到这个解决方案,可以用Pytest的session级fixture封装,进一步提升代码复用性:
import time import pickle import os import pytest class Solution: """ 代表耗时问题的解决方案类 """ def solve_difficult_problem() -> Solution: time.sleep(1) # 模拟耗时求解过程 return Solution() def prepare_solution() -> None: """ 仅执行一次耗时求解,保存结果供后续测试复用 """ solution = solve_difficult_problem() with open('solved.pickle', 'wb') as file: pickle.dump(solution, file) def my_feature(solution: Solution) -> None: """ 基于解决方案实现的新功能 """ print(solution) @pytest.fixture(scope="session") def shared_solution(): """ 会话级fixture:整个Pytest运行周期内仅初始化一次 """ if not os.path.exists('solved.pickle'): prepare_solution() with open('solved.pickle', 'rb') as file: return pickle.load(file) def test_my_feature(shared_solution): assert my_feature(shared_solution) is None # 其他需要用到解决方案的测试函数也可直接注入shared_solution fixture def test_another_feature(shared_solution): # 测试逻辑 pass
Fixture优势
scope="session"确保整个Pytest运行会话中,仅执行一次文件检查和结果加载,不管有多少测试函数依赖该fixture- 代码结构更清晰,避免在每个测试函数中重复编写文件检查逻辑
内容的提问来源于stack exchange,提问作者Paweł Wójcik
相关产品推荐
相关产品推荐

