参数化测试SCIO(作业测试)和Scala测试(forAll)

参数化测试SCIO(作业测试)和Scala测试(forAll),scala,google-cloud-dataflow,apache-beam,scalatest,spotify-scio,Scala,Google Cloud Dataflow,Apache Beam,Scalatest,Spotify Scio,我想用SCIO作业测试和Scala测试进行参数化测试。 我使用TableDrivenPropertyChecks,它允许通过一个forAll进行参数化测试 import org.scalatest.prop.TableDrivenPropertyChecks.{forAll=>forAllParams,} val jobArgs=数组( “--nullableCoders=true”, “--inputSubscription=in”, “--inputAvro=测试”, “--outputBq

我想用SCIO作业测试和Scala测试进行参数化测试。 我使用TableDrivenPropertyChecks,它允许通过一个forAll进行参数化测试

import org.scalatest.prop.TableDrivenPropertyChecks.{forAll=>forAllParams,}
val jobArgs=数组(
“--nullableCoders=true”,
“--inputSubscription=in”,
“--inputAvro=测试”,
“--outputBq1=out-table-1”,
“--outputBq2=out-table-2”
)
}
val ioParams=
桌子(
(“说明”、“输入数据”、“预期数字化身”、“预期数据记录”),
(
“说明1”,
getInputData1。。。,
getExpectedOutput1。。。,
GetExpectedOutput 2。。。
),
(
“说明1”,
getInputData2。。。,
getExpectedOutput。。。,
getExpectedOutput。。。
)
)
forAllParams(ioParams){(说明:字符串,
inputData:Seq[字符串],
预期输出1:Seq[…],
预期输出2:Seq[…])=>
在中应该是“have$description…”{
作业测试[com.Job.type]
.args(作业args:*)
.input(PubsubIO[String](“in”),inputData)
.输入(AvroIO[通用记录](“测试”),测试)
.output(BigQueryIO[Obj1](“out-table-1”)(结果=>shouldMatchExpectedOutput1(结果,expectedOutput1))
.output(BigQueryIO[Obj2](“out-table-2”)(结果=>shouldMatchExpectedOutput2(结果,expectedOutput2))
.run()
}
}
对于第一组参数,测试工作正常,但对于第二组,作业参数变为空。我不明白为什么(可能是一个州…)

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

为什么会有这种行为

是否可以使用SCIO作业测试进行参数化测试


提前感谢您的帮助。

我打赌.args方法会以某种方式重置数组。将jobArgs重新定义为def而不是val会有帮助吗?另一个猜测是JobTest需要以不同的方式初始化。就像新的工作测试或其他什么一样,我终于在一份小工作中重现了这个问题

我同时使用了contextAndArgs和PipelineOptionFactory:

val(sc,args)=ContextAndArgs(cmdlineArgs)
val选项=管道选项工厂
.fromArgs(cmdlineArgs:*)
.带验证
.as(类别为[JobOptions])
选项。设置流(真)
我删除了选项部分,这是有效的。
再次感谢:)

非常感谢您的回复。我尝试使用def方法而不是val,但实际上我也有同样的行为。我将尝试以不同的方式初始化JobTest,但我认为JobTest构建器需要初始化为测试结构。我认为这是一个上下文问题。当测试驱动的forAll是execute loop(第二次迭代)时,可能JobTest的上下文丢失了。当分离到多个测试时,我有相同的行为。