参数化测试 SCIO (JobTest) 和 Scala 测试 (forAll)

Parameterized tests SCIO (JobTest) and Scala test (forAll)

我想用 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()
    }
  }

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

当我单独执行所有组参数时(单独且没有其他),它有效。

为什么会有这种行为?

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

在此先感谢您的帮助。

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

我终于重现了这个问题,在一个小作业中。

我同时使用了 contextAndArgs 和 PipelineOptionFactory :

  val (sc, args) = ContextAndArgs(cmdlineArgs)

  val options = PipelineOptionsFactory
      .fromArgs(cmdlineArgs: _*)
      .withValidation
      .as(classOf[JobOptions])

    options.setStreaming(true)

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