参数化测试SCIO(JobTest)和Scala测试(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需要以不同的方式初始化。比如新的工作测试什么的

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

我同时使用了contextAndArgs和PipelineOptionFactory:

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

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

最新更新