找不到用于测试的现有数据 Scala Specs2
Existing data for tests is not found Scala Specs2
我正在构建集成测试,它会读取在之前的测试用例之后生成的数据,并根据预期结果对其进行检查。当我 运行 测试时,生成的数据在下一个测试用例的目录中不可见,尽管它位于那里。当我重新 运行 测试时,数据被拾取并从目录中读取。可能是什么原因呢?测试执行的顺序会不会有问题?
我的测试是这样的:
class LoaderSpec extends Specification{
sequential
"Loader" should {
"run job from assembled .jar" in {
val res = "sh ./src/test/runLoader.sh".!
res must beEqualTo(0)
}
"write results to the resources" in {
val resultsPath = "/results/loader_result"
resourcesDirectoryIsEmpty(resultsPath) must beFalse
}
"have actual result same as expected one" in {
val expected: Set[String] = readFilesFromDirs("source/loader_source")
println(expected)
val result: Set[String] = readFilesFromDirs("/results/loader_result")
println(result)
expected must beEqualTo(result)
}
}
}
第一次测试成功,接下来的 2 次测试失败,因为找不到数据。当我重新 运行 相同的测试套件而不做任何更改时 - 所有测试都成功。
runLoader.sh脚本:
$SPARK_HOME/bin/spark-submit \
--class "loader.LoaderMain" \
\
--conf "spark.hadoop.fs.gs.impl=com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem" \
--conf "spark.hadoop.fs.AbstractFileSystem.gs.impl=com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS" \
--conf "spark.hadoop.fs.gs.project.id=loader-files" \
--conf "spark.hadoop.fs.gs.implicit.dir.repair.enable=false" \
\
--conf "spark.loader.Config.srcPaths=;src/test/resources/source/loader" \
--conf "spark.loader.Config.dstPath=src/test/resources/results/loader_result" \
--conf "spark.loader.Config.filesPerPartner=10" \
\
--conf "spark.shuffle.memoryFraction=0.4" \
--conf "spark.task.maxFailures=20" \
--conf "spark.executor.extraJavaOptions=${EXTRA_JVM_FLAGS}" \
\
--master "local[8]" \
--driver-memory 1500M \
--driver-java-options "${EXTRA_JVM_FLAGS}" \
$(find "$(pwd)"/target/scala-2.11 -name 'loader-assembly-*.jar')
我有两个想法可以帮助您解决问题:
利用eventually matcher多次重试断言——确保设置合理的超时和重试次数,否则你的测试可能会变得不稳定。
使用 !!
而不是 !
来查看控制台输出——可能会让您深入了解在您的 spark-submit 运行 之后可能执行的异步任务.
希望对您有所帮助!
我试图改变我阅读文件的方式。事实证明,从资源中读取可能会产生此错误,因为在所有测试之前读取了内容。虽然当我只是从目录中读取数据时,内容会更新并且不会发生此错误。
这是我更改测试的方式:
"write results to the resources" in {
val resultsPath = "./src/dockerise/resource/results/loader_result"
resourcesDirectoryIsEmpty(resultsPath) must beFalse
}
我正在构建集成测试,它会读取在之前的测试用例之后生成的数据,并根据预期结果对其进行检查。当我 运行 测试时,生成的数据在下一个测试用例的目录中不可见,尽管它位于那里。当我重新 运行 测试时,数据被拾取并从目录中读取。可能是什么原因呢?测试执行的顺序会不会有问题?
我的测试是这样的:
class LoaderSpec extends Specification{
sequential
"Loader" should {
"run job from assembled .jar" in {
val res = "sh ./src/test/runLoader.sh".!
res must beEqualTo(0)
}
"write results to the resources" in {
val resultsPath = "/results/loader_result"
resourcesDirectoryIsEmpty(resultsPath) must beFalse
}
"have actual result same as expected one" in {
val expected: Set[String] = readFilesFromDirs("source/loader_source")
println(expected)
val result: Set[String] = readFilesFromDirs("/results/loader_result")
println(result)
expected must beEqualTo(result)
}
}
}
第一次测试成功,接下来的 2 次测试失败,因为找不到数据。当我重新 运行 相同的测试套件而不做任何更改时 - 所有测试都成功。
runLoader.sh脚本:
$SPARK_HOME/bin/spark-submit \
--class "loader.LoaderMain" \
\
--conf "spark.hadoop.fs.gs.impl=com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem" \
--conf "spark.hadoop.fs.AbstractFileSystem.gs.impl=com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS" \
--conf "spark.hadoop.fs.gs.project.id=loader-files" \
--conf "spark.hadoop.fs.gs.implicit.dir.repair.enable=false" \
\
--conf "spark.loader.Config.srcPaths=;src/test/resources/source/loader" \
--conf "spark.loader.Config.dstPath=src/test/resources/results/loader_result" \
--conf "spark.loader.Config.filesPerPartner=10" \
\
--conf "spark.shuffle.memoryFraction=0.4" \
--conf "spark.task.maxFailures=20" \
--conf "spark.executor.extraJavaOptions=${EXTRA_JVM_FLAGS}" \
\
--master "local[8]" \
--driver-memory 1500M \
--driver-java-options "${EXTRA_JVM_FLAGS}" \
$(find "$(pwd)"/target/scala-2.11 -name 'loader-assembly-*.jar')
我有两个想法可以帮助您解决问题:
利用eventually matcher多次重试断言——确保设置合理的超时和重试次数,否则你的测试可能会变得不稳定。
使用
!!
而不是!
来查看控制台输出——可能会让您深入了解在您的 spark-submit 运行 之后可能执行的异步任务.
希望对您有所帮助!
我试图改变我阅读文件的方式。事实证明,从资源中读取可能会产生此错误,因为在所有测试之前读取了内容。虽然当我只是从目录中读取数据时,内容会更新并且不会发生此错误。 这是我更改测试的方式:
"write results to the resources" in {
val resultsPath = "./src/dockerise/resource/results/loader_result"
resourcesDirectoryIsEmpty(resultsPath) must beFalse
}