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

Pytest中fixture每次测试重复运行 如何缓存返回结果降低云服务开销

解决方案

你只需修改pytest.fixture的作用域参数即可实现需求:pytest的fixture默认作用域为function,即每个测试函数执行前都会重新运行一次fixture逻辑,你可以根据需要把作用域调高,仅运行一次fixture逻辑复用返回值。

最简修改方案

将fixture的scope参数设为module(当前测试文件内所有用例共用,仅运行一次)或session(整个测试会话全局共用,仅运行一次)即可,修改后的代码如下:

@pytest.fixture(scope="module")
def prepare_data():
    (...)
    # 运行在云实例上的耗时操作
    return df1, df2

# 测试用例无需修改,正常调用fixture即可
def test_columns_are_equal(prepare_data):
    assert prepare_data[0].columns == prepare_data[1].columns

def test_schemas_are_equal(prepare_data):
    assert prepare_data[0].dtypes.equals(prepare_data[1].dtypes)

def test_something_else(prepare_data):
    assert(...)

可选补充:持久化缓存

如果你需要跨测试会话缓存结果,即下次重新执行测试时也不需要重新跑云侧的耗时逻辑,可以增加本地缓存判断,示例如下:

import pandas as pd
import pytest
from pathlib import Path

# 定义缓存文件路径
DF1_CACHE = Path("./df1_cache.parquet")
DF2_CACHE = Path("./df2_cache.parquet")

@pytest.fixture(scope="session")
def prepare_data():
    # 缓存存在则直接读取返回
    if DF1_CACHE.exists() and DF2_CACHE.exists():
        df1 = pd.read_parquet(DF1_CACHE)
        df2 = pd.read_parquet(DF2_CACHE)
        return df1, df2
    # 缓存不存在则执行耗时逻辑
    (...)
    # 生成结果后写入缓存
    df1.to_parquet(DF1_CACHE)
    df2.to_parquet(DF2_CACHE)
    return df1, df2

作用域说明

pytest fixture支持的作用域从小到大依次为:

  • function:默认值,每个测试函数执行前运行一次
  • class:每个测试类执行前运行一次,类内所有测试用例共用
  • module:每个.py测试文件执行前运行一次,文件内所有测试用例共用
  • session:整个测试任务从启动到结束仅运行一次,所有测试用例共用

内容的提问来源于stack exchange,提问作者Louis GRIMALDI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 04:06:03