You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:35:14