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

如何实现pytest fixture仅单次读取文件并在多测试用例间复用

pytest fixture 单次读取文件常驻内存实现方案

直接利用pytest fixture原生的作用域(scope)配置即可实现,不需要额外编写自定义缓存逻辑。

pytest fixture默认作用域为function,规则是每个调用该fixture的测试函数执行前,都会完整重跑一次fixture逻辑,这就是重复读取文件产生性能开销的根本原因。根据需要共享数据的范围,调整scope参数即可控制fixture的执行频次:

  • scope="session":整个测试执行周期(从pytest进程启动到所有用例执行完毕)仅执行1次读取逻辑,生成的dataframe会常驻内存,所有测试文件、测试类、测试用例调用时拿到的都是同一个缓存对象,性能开销最低。
  • scope="module":单个测试.py文件内的所有用例共享一次读取结果,不同.py文件的用例分别独立读取一次。
  • scope="class":单个测试类内的所有用例共享一次读取结果。

针对全量测试共享读文件结果的需求,直接将fixture的scope设置为session即可,修改后的代码如下:

注意:跨用例、跨文件共享的fixture建议放到测试目录下的conftest.py文件中,pytest会自动识别该文件内的fixture,不需要手动导入;同时去掉原代码里多余的self参数(self是测试类实例方法的绑定参数,公共fixture不属于测试类,不需要该参数)。

@pytest.fixture(scope="session")
def read_file():
    df = pd.read_excel(Path + file_name)
    return df

使用注意事项

  • 非function作用域的fixture返回的是同一个内存对象,禁止在测试用例中直接修改返回的df原始数据,如果测试逻辑需要修改df做校验,请先调用df_copy = read_file.copy()拿到数据副本再操作,避免原始数据被篡改,导致其他依赖该fixture的用例运行结果异常。
  • 如果测试逻辑需要根据不同用例参数读取不同的目标文件,session级作用域不适用,需要结合fixture参数化逻辑动态调整读取规则。

内容的提问来源于stack exchange,提问作者Alex。

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:51:13