pytest逐文件执行是否重复初始化Spark 如何复用同一会话
pytest执行Spark测试相关问题答复
逐文件单独调用pytest的方式是否合理
这种方式可以正常执行测试,但不属于最优实践。你写的shell脚本每一行命令都会启动一个完全独立的pytest进程,进程之间没有上下文共享,虽然能完成单文件的测试执行,但整体执行效率低,也无法支持全局测试配置、全量测试覆盖率统计这类跨文件的需求。
逐次调用单文件时是否每次都会新建Spark会话
你的猜测完全成立。
每执行一次pytest 单文件路径命令,操作系统都会拉起一个全新的Python进程,pytest会在这个新进程内重新加载conftest配置、初始化对应fixture。上一个进程执行结束退出时,进程内创建的Spark会话会被直接销毁,三次命令调用就会完整走三次「Spark初始化->执行测试->销毁Spark」的流程,Spark初始化本身开销不小,这种写法会大幅拉长全量测试的总耗时。
所有测试用例共用同一个Spark会话的实现方案
不需要复杂配置,两步就能实现:
- 调整conftest中Spark fixture的作用域
默认pytest fixture是function级别,每个测试函数执行时都会重新初始化。把Spark相关fixture的作用域改成session,同一个pytest进程内的所有测试用例只会初始化一次Spark会话,示例写法:import pytest from pyspark.sql import SparkSession @pytest.fixture(scope="session") def spark(): # 初始化Spark逻辑 spark = SparkSession.builder \ .appName("unit_test") \ .getOrCreate() yield spark # 所有测试跑完后再停止Spark spark.stop() - 替换逐文件调用的执行逻辑
不要在shell脚本里逐次启动pytest进程,直接单次调用pytest指定整个测试目录即可,所有测试文件会在同一个pytest进程内执行,自然可以复用session级别的Spark会话:
如果你有特殊需求必须跨pytest进程复用Spark,可以额外配置常驻Spark服务(比如开启Spark Connect、启动独立Standalone集群),让fixture每次初始化时直接连接已启动的常驻服务而非新建会话,但这种方案配置成本高,常规单元测试场景用session作用域fixture+单进程执行全量测试的方案就足够满足需求。# 替换原来三行逐文件调用的命令 pytest ./tests/ --emr
内容的提问来源于stack exchange,提问作者Xi12
相关产品推荐
相关产品推荐

