【问题标题】:How to avoid 'null' when use scalatest with before/after?在之前/之后使用scalatest时如何避免'null'?
【发布时间】:2015-07-25 03:46:27
【问题描述】:

来自这个article about spark testing,有一些示例代码:

class SparkExampleSpec extends FlatSpec with BeforeAndAfter {

  private val master = "local[2]"
  private val appName = "example-spark"

  private var sc: SparkContext = _

  before {
    val conf = new SparkConf()
      .setMaster(master)
      .setAppName(appName)

    sc = new SparkContext(conf)
  }

  after {
    if (sc != null) {
      sc.stop()
    }
  }
  (...)

它可以工作,但是有一个可以为空的变量sc。这里是合理的,但我还是想避免它。

我尝试使用:

private var sc: Option[SparkContext] = None

  before {
    sc = Some(new SparkContext(conf))
  }

  after {
    sc.foreach(_.stop())
  }
  (...)

但问题是,我必须在测试中使用sc作为Option[SparkContext],这不像普通的SparkContext那样方便

有没有办法让测试继续进行,但我们可以使用val sc: SparkContext

(我知道在 specs2 中可以,但不确定如何在 scalatest 中进行,我们现在必须使用 scalatest)

【问题讨论】:

    标签: scala null scalatest


    【解决方案1】:

    您可以放弃使用before,而只使用lazy val,这样上下文就会在第一个测试调用它时被初始化:

    class SparkExampleSpec extends FlatSpec with BeforeAndAfter {
    
      private val master = "local[2]"
      private val appName = "example-spark"
    
      private lazy val conf = new SparkConf()
        .setMaster(master)
        .setAppName(appName)
      private lazy val sc = new SparkContext(conf)
    
      after {
        sc.stop()
      }
    

    更新:

    所以我之前遇到过类似的事情,我们最终得到了如下的特征模式:

    trait SparkAddOn {
    
      val conf:SparkConf
    
      def withSpark(f: SparkContext => Unit) ={
        val sc: SparkContext = new SparkContext(conf)
        try{
          f(sc)
        } finally {
          sc.stop()
        }
      }
    }
    

    那么在您的测试中,您只需使用“withSpark”:

    class SparkExampleSpec extends FlatSpec with SparkAddOn {
    
      private val master = "local[2]"
      private val appName = "example-spark"
    
      val conf = new SparkConf()
        .setMaster(master)
        .setAppName(appName)
    
      "test" should "do something" in withSpark { sc =>
    
      }
    }
    

    最后,我更喜欢 Specs2 而不是 Scalatest,设计完全不同,而且更好,抱歉你不能切换。

    【讨论】:

    • 但是可能有多个测试,如果sc不在before内,它只会被初始化一次
    • @Freewind 我更新了我的解决方案,试一试,让我知道它是否适合你
    • 我们最终得到了相同的解决方案 :)
    猜你喜欢
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2014-05-23
    • 2017-06-24
    • 1970-01-01
    • 2010-12-27
    • 2013-03-03
    相关资源
    最近更新 更多