【问题标题】:Can you run test suites more than once in ScalaTest?您可以在 ScalaTest 中多次运行测试套件吗?
【发布时间】:2020-04-07 04:54:46
【问题描述】:

我的 Spark ETL 流程中有许多步骤,并且我创建了套件来测试每个步骤的功能,并且我的步骤的输出是下一步的输入。

但是,我想创建一个通过 ETL 过程运行两次的测试,例如:

原始数据 >> ETL_Step_1 >> ETL_Step_2 >> ETL_Step_3 >> 增量数据 >> ETL_Step_1 >> ETL_Step_2 >> ETL_Step_3

我从 Reporter 收到错误消息,因为它无法运行与以前运行过的套件同名的套件(例如,我无法两次运行名为 ETL_Step_1 的套件)。如果复制套件并重命名重复项以执行以下操作,问题就会消失:

原始数据 >> ETL_Step_1 >> ETL_Step_2 >> ETL_Step_3 >> 增量数据 >> ETL_Step_1_2 >> ETL_Step_2_2 >> ETL_Step_3_2

有没有更好的方法来运行我的测试而无需复制和重命名测试套件?

【问题讨论】:

    标签: scala scalatest


    【解决方案1】:

    您可以将所有 ETL 步骤放入定义(集合)并运行它们

    import org.scalatest.FunSpec
    import com.github.mrpowers.spark.fast.tests.DataFrameComparer
    import com.github.mrpowers.spark.daria.sql.SparkSessionExt._
    import org.apache.spark.sql.types.{IntegerType, StringType}
    
     describe("etl collection") {
    
        it("can run etls that are organized in a map") {
    
          val sourceDF = spark.createDF(
            List(
              ("bob", 14),
              ("liz", 20)
            ), List(
              ("name", StringType, true),
              ("age", IntegerType, true)
            )
          )
    
        val etlDefinition = new EtlDefinition(
           name =  "example",
           sourceDF = sourceDF, // etl step 1
           transform = someTransform(), // etl step 2
           write = someWriter(), // etl step 3
          hidden = false
        )
    
    
          val etls = scala.collection.mutable.Map[String, EtlDefinition]("example" -> etlDefinition)
    
          etls += ("ex2" -> etlDefinition)
    
          etls("example").process()
    
        }
    
    }
    

    另一个选项可能是来自 scalatest 的 eventually。最终的一个小例子:

     Post("/something", body) ~> routes ~> check {
          response should be a pendingResponse
    
          eventually {
            Post("/something", body) ~> routes ~> check {
              response should be a expectedResponse
            }
          }
        }
    

    你可以调用一些方法来代替 Post。

    你可以在这里herescalatest

    更新:

    it ("your definition") {
       eventually { Thread.sleep(50); step1() should be A // assertion }
       eventually { Thread.sleep(50); step2() should be B }
       eventually { Thread.sleep(50); step3() should be C }
    }
    

    如果你愿意,你可以让它们嵌套

    【讨论】:

    • 非常感谢 Bob 的及时回复。问题是,我为每个 ETL 步骤都有一个测试套件。所以我的第一个 ETL 步骤从一些原始文本文件创建了一些 parquet,然后我有一个带有一些测试的套件,以检查 parquet 文件中的行数是否与原始文本文件匹配。也许最终的选择更适合我的问题?我可以测试最初的 ETL 运行,然后最终运行第二次 ETL?
    • 在您的情况下,ETL 步骤的返回类型是什么?
    • 我期待您对每个步骤分别进行单元测试,这是一种集成/测试测试,用于测试步骤是如何集成/功能的。因此,我更喜欢第一个示例,所有步骤都定义为 ETL 定义,然后您在运行流程时,可以测试所有步骤。您可以针对不同的场景进行单独的测试,例如:所有 seccuss、第一步失败、第二步失败、第三步失败等
    猜你喜欢
    • 1970-01-01
    • 2014-04-28
    • 2015-09-20
    • 1970-01-01
    • 2017-05-22
    • 2020-05-30
    • 2014-10-13
    • 1970-01-01
    • 2019-06-09
    相关资源
    最近更新 更多