使用MagicMock在PySpark中修补功能不会在火花运行中修补

时间:2019-04-10 13:06:54

标签: pyspark pytest magicmock

我有一个运行 PySpark 测试的单元测试(使用 PyTest )。 我有创建 SQLContext 的普通conftest.py。 我想在所有情况下都得到相同的uuid4,因此我在测试中修补了uuid4。 如果我从测试功能中调用uuid.uuid4(),那么一切都很好。

但是,当我运行PySpark作业(也称为uuid4)时,已修补:

我的PySpark功能(简体):

def create_uuid_if_needed(current, prev):
    if current > prev:
        return str(uuid.uuid4())
    else:
        return None


def my_df_func(df):
    my_udf = udf(create_uuid_if_needed, T.StringType())    
    my_window = Window.partitionBy(F.col(PARTITIONING_KEY)).orderBy(F.col(ORDER))
    return df.withColumn('new_col', my_udf(df.col, F.lag(df.col, 1)).over(my_window))

我的测试如下:

@patch.object(uuid, 'uuid4', return_value='1-1-1-1')
def test_add_activity_period_start_id(mocker, sql_context, input_fixture):
    input_df = sql_context.createDataFrame(input_fixture, [... schema...])    
    good_uuid = str(uuid.uuid4())
    another_goood_uuid = create_uuid_if_needed(2, 1)
    actual_df = my_df_func(input_df)
    ...

good_uuid得到正确的值-'1-1-1-1',another_good_uuid也得到正确的值,但是该函数的数据帧的udf版本仍然调用未修补的uuid4。

这是怎么了? udf()函数正在做什么? 谢谢!

0 个答案:

没有答案