【问题标题】:Existing data for tests is not found Scala Specs2未找到用于测试的现有数据 Scala Specs2
【发布时间】:2020-01-15 12:41:17
【问题描述】:

我正在构建集成测试,它将读取在之前的测试用例之后生成的数据,并根据预期结果进行检查。当我运行测试时,生成的数据在下一个测试用例的目录中不可见,尽管它驻留在那里。当我重新运行测试时,会从目录中提取并读取数据。可能是什么原因?测试执行顺序会不会有问题?

这是我的测试的样子:

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')

【问题讨论】:

  • 能把runLoader.sh的内容贴出来吗?
  • 这可能更像是一个 Spark 问题。感觉好像spark-submitloader.LoaderMain 的工作完成之前就退出了。但是from what I've read,Spark 应该等待类完成运行后再退出。

标签: scala apache-spark testing specs2


【解决方案1】:

我试图改变我阅读文件的方式。结果从资源读取可能会产生此错误,因为在所有测试之前读取内容。虽然当我只是从目录中读取数据时,内容会更新并且不会发生此错误。 这是我更改测试的方式:

"write results to the resources" in {
  val resultsPath = "./src/dockerise/resource/results/loader_result"
  resourcesDirectoryIsEmpty(resultsPath) must beFalse
}

【讨论】:

    【解决方案2】:

    我有两个想法可以帮助您解决问题:

    1. 利用eventually matcher 多次重试断言——确保设置合理的超时和重试次数,否则您的测试可能会变得不稳定。

    2. 使用 !! 而不是 ! 来查看控制台输出 - 可能会让您深入了解 spark-submit 运行后可能执行的异步任务。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 2014-08-26
      相关资源
      最近更新 更多