学习 Spark 2(十一):单元测试

本文基于 Spark 大神 Holden Karau 开源的 Spark 单元测试库 spark-testing-base 编写单元测试。

环境:

  • Spark 2.4.3
  • Scala 2.11

依赖

编辑 pom.xml 文件添加依赖:

<dependency>  
    <groupId>com.holdenkarau</groupId>
    <artifactId>spark-testing-base_2.11</artifactId>
    <version>2.4.3_0.12.0</version>
    <scope>test</scope>
</dependency>  

提示:

Artifact Id 格式为spark-testing-base_${scala_version},其中 scala_version 为 Scala 版本,当前支持 2.11 和 2.12;

Version 格式为 ${spark_version}_${jar_version},其中 spark_version 为 Spark 版本,jar_version 为库版本。

举🌰

共享 SparkContext 实例:

class SparkContextTest extends FunSuite with SharedSparkContext {

  override implicit def reuseContextIfPossible: Boolean = true // ①

  test("spark context version") {
    println(sc.version)
  }

}

① 值为 true,在多个单元测试之间共享 SparkContext。

DataFrame 单元测试:

class DataFrameTest extends FunSuite with DataFrameSuiteBase {

  test("spark session version") {
    val spark = sqlContext.sparkSession
    println(spark.version)
  }

  test("dataframe equal") {
    val spark = sqlContext.sparkSession
    import spark.implicits._

    val df1 = List(1, 2, 3).toDF()
    val df2 = List(1, 2, 3).toDF()
    assertDataFrameEquals(df1, df2) // ①
  }

  test("dataframe approximate equal") {
    val spark = sqlContext.sparkSession
    import spark.implicits._

    val df1 = List((1, 1.1), (2, 2.2), (3, 3.3)).toDF()
    val df2 = List((1, 1.2), (2, 2.3), (3, 3.4)).toDF()
    assertDataFrameApproximateEquals(df1, df2, 0.11) // ②
  }

}

① 断言 DataFrame 相等;

② 针对 Double 类型,断言 DataFrame 近似相等,第三个参数为允许的误差大小。