如何实现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。
相关产品推荐
相关产品推荐

