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
相关产品推荐
相关产品推荐

