断言函数来测试像dataframes这样的spark集合。
spark-test的Python项目详细描述
一个断言函数集合,用于测试像dataframes这样的spark集合
-
在开发spark应用程序时,最终可以编写在spark数据帧上应用转换的方法。为了测试结果,您可以创建pandasdataframes并使用pandas提供的测试函数,因为pyspark不提供任何帮助测试的函数。
spark-test提供类似于pandas的测试函数,但面向spark集合。
假设您有一个函数可以在spark数据帧上应用一些转换(这个示例的完整代码可以在test s/test-example.py:
def transform(df): """ Fill nulls with 0, sum 10 to Age column and only return distinct rows """ df = df.na.fill(0) df = df.withColumn('Age', df['Age'] + 10) df = df.distinct() return df
然后,我们可以编写一个测试用例,其中包含所需的任意多个测试输入,并使用assert_dataframe_equal:
from spark_test.testing import assert_dataframe_equal def test_transform(spark, transform): input_df = spark.createDataFrame( [['Tom', 25], ['Tom', 25], ['Charlie', 24], ['Dan', None]], schema=['Name', 'Age'] ) expected = spark.createDataFrame( [['Tom', 35], ['Charlie', 34], ['Dan', 0]], schema=['Name', 'Age'] ) result = transform(input_df) assert_frame_equal(expected, result)
当然,测试失败时更有趣,所以让我们在transform函数中引入一个bug:
def bugged_transform(df): """ Fill nulls with 0, sum 10 to Age column and only return distinct rows """ df = df.na.fill(1) # Whoops! Should be 0! df = df.withColumn('Age', df['Age'] + 10) df = df.distinct() return df
使用pytest.mark.parametize将这两个函数传递给我们的测试,会产生以下输出,其中包含一条关于失败的消息:
$ pytest tests/example.py ============================= test session starts ============================= platform linux -- Python 3.7.3, pytest-5.0.0, py-1.8.0, pluggy-0.12.0 rootdir: /home/tfarias/repos/spark-test collected 2 items tests/example.py .F [100%] ================================== FAILURES =================================== _______________________ test_transform[bugged_transform] ________________________ assert left_d[key] == right_d[key], msg.format( > field=key, l_value=left_d[key], r_value=right_d[key] ) E AssertionError: Values for Age do not match: E Left=10 E Right=11
许可证
根据麻省理工学院的许可证发行。