【问题标题】:Parameterized tests SCIO (JobTest) and Scala test (forAll)参数化测试 SCIO (JobTest) 和 Scala 测试 (forAll)
【发布时间】:2019-12-12 18:38:19
【问题描述】:

我想用 SCIO JobTest 和 Scala Test 进行参数化测试。 我使用 TableDrivenPropertyChecks,它允许通过 forAll 进行参数化测试。

import org.scalatest.prop.TableDrivenPropertyChecks.{forAll => forAllParams, _}

 val jobArgs = Array(
        "--nullableCoders=true",
        "--inputSubscription=in",
        "--inputAvro=test",
        "--outputBq1=out-table-1",
        "--outputBq2=out-table-2"
      )
    }

val ioParams =
    Table(
      ("description", "inputRawPlusData", "expectedDigitalAvatars", "expectedDataRecords"),
      (
        "Desc1",
        getInputData1...,
        getExpectedOutput1...,
        getExpectedOutput2...
      ),
      (
        "Desc1",
        getInputData2...,
        getExpectedOutput...,
        getExpectedOutput...
      )
    )

forAllParams(ioParams) { (description: String,
                            inputData: Seq[String],
                            expectedOutput1: Seq[...],
                            expectedOutput2: Seq[...]) =>

    it should s"have $description..." in {
      JobTest[com.Job.type]
        .args(jobArgs: _ *)
        .input(PubsubIO[String]("in"), inputData)
        .input(AvroIO[GenericRecord]("test"), test)
        .output(BigQueryIO[Obj1]("out-table-1"))(result => shouldMatchExpectedOutput1(result, expectedOutput1))
        .output(BigQueryIO[Obj2]("out-table-2"))(result => shouldMatchExpectedOutput2(result, expectedOutput2))
        .run()
    }
  }

对于第一组参数,测试工作正常,但对于第二组,Job args 变为空。我不明白为什么(也许是一个状态..)。

当我单独执行所有组参数时(单独和没有其他人),它可以工作。

为什么会有这种行为?

是否可以使用 SCIO JobTest 进行参数化测试?

提前感谢您的帮助。

【问题讨论】:

    标签: scala google-cloud-dataflow apache-beam scalatest spotify-scio


    【解决方案1】:

    我敢打赌,.args 方法会以某种方式重置数组。将 jobArgs 重新定义为 def 而不是 val 有帮助吗?另一个猜测是 JobTest 需要以不同的方式初始化。比如新的 JobTest 什么的

    【讨论】:

    • 非常感谢您的回复。我尝试使用 def 方法而不是 val,但不幸的是我有相同的行为。我将尝试以不同的方式初始化 JobTest,但我认为 JobTest Builder 需要初始化为测试结构。
    • 我认为这是一个上下文问题。当测试驱动的 forAll 是执行循环(第二次迭代)时,可能会丢失 JobTest 的上下文。
    • 我有同样的行为,当分成多个测试时。
    【解决方案2】:

    我终于在一个小任务中重现了这个问题。

    我同时使用了 contextAndArgs 和 PipelineOptionFactory :

      val (sc, args) = ContextAndArgs(cmdlineArgs)
    
      val options = PipelineOptionsFactory
          .fromArgs(cmdlineArgs: _*)
          .withValidation
          .as(classOf[JobOptions])
    
        options.setStreaming(true)
    

    我删除了选项部分,这有效。 再次感谢:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多