Scala:测试结束后,我如何执行操作?

Scala:测试结束后,我如何执行操作?,scala,apache-spark,scalatest,Scala,Apache Spark,Scalatest,我正在使用scalatest_2.112.2.1版。我正在尝试编写在SparkContext上运行的测试。我如何在测试开始时启动SparkContext,在所有测试中使用此Sc,然后在测试完成后停止它 (我知道它会自动停止,但我还是喜欢自己做)您可以使用ScalaTest。定义启动和停止SparkContext的基本特征,并将其用于其他测试 trait SparkTest extends BeforeAndAfterAll { self: Suite => @transient

我正在使用
scalatest_2.11
2.2.1版。我正在尝试编写在SparkContext上运行的测试。我如何在测试开始时启动SparkContext,在所有测试中使用此Sc,然后在测试完成后停止它

(我知道它会自动停止,但我还是喜欢自己做)

您可以使用ScalaTest。定义启动和停止SparkContext的基本特征,并将其用于其他测试

trait SparkTest extends BeforeAndAfterAll {
  self: Suite =>

  @transient var sc: SparkContext = _

  override def beforeAll {
    val conf = new SparkConf().
      setMaster("local[*]").
      setAppName("test")
    sc = new SparkContext(conf)
    super.beforeAll()
  }

  override def afterAll: Unit = {
    try {
      sc.stop()
    } finally {
      super.afterAll
    }
  }

}

// Mix-in the trait with your tests like below.
class MyTest extends FunSuite with SparkTest {
  test("my test") {
    // you can access "sc" here.
  }
}

签出-这是否更重要,具体看一下这里的一个简单的
beforeAll
示例:(1)我得到的
SparkTest不符合Suite的beforead and aftereal
,(2)我如何将SparkContext传输到
afterAll
?是否允许我更改函数算术?请详细说明添加的
@transient
?为什么这是必要的?至于
self:Suite
部分,如果您不介意的话:)@transient有助于避免序列化问题。Spark序列化该类(如果在转换中引用了某个类)。在这种情况下,您将得到序列化错误,因为SparkContext不可序列化。添加transient会给出提示,使其不会序列化。如果您的案例中不需要它,您可以忽略它。Self-type充当“this”的别名,它允许通过“this”访问其他实例成员。这里有一个简单而好的解释。在使用self类型之前和之后,当我们扩展它时,我们必须遵守它。这就是为什么这里需要它。