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

如何在不同pytest测试函数间共享Spark DataFrame?

如何在多个pytest测试函数间共享Spark DataFrame?

方案一:将DataFrame封装为Module级Fixture(推荐)

把DataFrame的创建逻辑抽离成独立的pytest fixture,依赖已有的spark fixture并设置相同的module作用域,这样所有测试函数都能共享同一个DataFrame实例,同时保持测试的独立性。

修改后的完整代码:

import pytest
from pyspark.sql import SparkSession, Row
import os
import tempfile

@pytest.fixture(scope="module")
def spark() -> SparkSession:
    builder = SparkSession.builder \
        .appName('we_pipeline_test') \
        .config('spark.ui.showConsoleProgress', 'false') \
        .config('spark.sql.debug.maxToStringFields', '200')

    if 'SPARK_MASTER' in os.environ:
        builder = builder.master(os.environ['SPARK_MASTER'])
    else:
        builder = builder.master('local[1]')

    s = builder.getOrCreate()

    with tempfile.TemporaryDirectory("we_pipeline") as dir:
        s.sparkContext.setCheckpointDir(dir)
        yield s
        s.stop()

# 新增共享DataFrame的fixture,作用域与spark一致
@pytest.fixture(scope="module")
def shared_test_df(spark):
    # 替换为你实际的DataFrame创建逻辑
    data = [Row(id=1, name="Alice"), Row(id=2, name="Bob")]
    schema = "id INT, name STRING"
    df = spark.createDataFrame(data, schema)
    return df

def test_func1(spark, shared_test_df):
    # 直接使用共享的DataFrame进行测试
    assert shared_test_df.count() == 2

def test_func2(spark, shared_test_df):
    # 访问共享的DataFrame
    shared_test_df.show()

方案二:通过临时视图传递(不推荐)

如果必须依赖test_func1的执行结果,可以通过Spark临时视图共享DataFrame,但这种方式会让测试耦合,依赖执行顺序,仅适合特殊场景:

def test_func1(spark, request):
    # 创建DataFrame
    data = [Row(id=1, name="Alice"), Row(id=2, name="Bob")]
    schema = "id INT, name STRING"
    df = spark.createDataFrame(data, schema)
    # 注册为临时视图
    df.createOrReplaceTempView("test_temp_view")
    # 标记测试已执行
    request.config.cache.set("test_func1_completed", "True")

def test_func2(spark, request):
    # 确保test_func1已执行
    assert request.config.cache.get("test_func1_completed", "False") == "True"
    # 从临时视图读取DataFrame
    df = spark.sql("SELECT * FROM test_temp_view")
    df.show()

总结

优先选择方案一,用fixture封装DataFrame,既保证了数据共享,又遵循了测试独立的原则,让代码更易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:07:58