Scala Spark单元测试:如何使用FunSuite为所有套件仅初始化一次sc
我想写spark单元测试用例,我正在使用FunSuite。 但我希望我的sparkContext只初始化一次,由所有套件使用,然后在所有套件完成时终止Scala Spark单元测试:如何使用FunSuite为所有套件仅初始化一次sc,scala,apache-spark,spark-streaming,scalatest,Scala,Apache Spark,Spark Streaming,Scalatest,我想写spark单元测试用例,我正在使用FunSuite。 但我希望我的sparkContext只初始化一次,由所有套件使用,然后在所有套件完成时终止 abstract class baseClass extends FunSuite with BeforeAndAfter{ before { println("initialize spark context") } after { println("kill spark context") } } @R
abstract class baseClass extends FunSuite with BeforeAndAfter{
before {
println("initialize spark context")
}
after {
println("kill spark context")
}
}
@RunWith(classOf[JUnitRunner])
class A extends baseClass{
test("for class A"){
//assert
}
@RunWith(classOf[JUnitRunner])
class B extends baseClass{
test(for class b){
//assert
}
}
但是当我运行sbt测试时
我可以看到两个测试都调用了println语句基类。当为类A和B创建对象时,抽象
基类被称为。
但是,我们如何才能达到我的目的,即在所有测试用例都运行时,spark上下文只被初始化一次选项1:使用出色的库来实现这一点(并提供许多其他好的处理)。在阅读自述之后,它就像在
SharedParkContext
而不是baseClass
中混合一样简单,您将有一个sc:SparkContext
值可以在测试中使用
选项2:要自己动手,您需要在
之前和之后混入而不是之前和之后混入,并在之前和之后实施,这正是上面提到的SharedParkContext
所做的。如果您真的想在套件之间共享上下文,则必须将其设置为静态。然后,您可以使用lazy
值使其在首次使用时启动。至于关闭它,您可以将它留给每次创建上下文时创建的自动关闭挂钩
它看起来像:
abstract class SparkSuiteBase extends FunSuite {
lazy val sparkContext = SparkSuiteBase.sparkContext
}
// putting the Spark Context inside an object allows reusing it between tests
object SparkSuiteBase {
private lazy val sparkContext = ??? // create the context here
}
我强烈建议使用spark测试库
在测试期间管理sparkContext或sparkSession的生命周期。
您不必通过覆盖之前
、之后
方法以及管理sparkSession
/sparkContext
的生命周期来污染测试
通过覆盖以下方法,您可以为所有测试共享一个sparkSession
/sparkContext
:
def reusecontextifmably:Boolean=true
有关详细信息:
我希望有帮助 我已经提供了类似的答案并删除了。根据评论(“不要认为这是可行的,它显示了相同的结果。两个测试类都调用了print语句”),我相信OP希望所有套件都具有相同的上下文。是的。使用选项2后:sbt测试打印语句两次。初始化spark上下文初始化spark上下文kill spark上下文kill spark上下文Yes..我相信我的项目中的两个类创建了两个不同的套件。所以我的要求是在不同的套房之间共享sc。我已经把我的问题编辑成了一行。。偏离原问题的。有没有办法将这两个类A和B添加到一个套件中?扩展FunSuite的类就是套件。。所以我不知道怎么做。您可以在一个套件类中创建多个测试来测试多个类-不确定通过分离A和B来实现什么区别。我想在不同的测试类中测试不同的src类。所以,我们考虑创建两个不同的测试类A和B,这是有意义的,但是,为什么要坚持使用单个套件呢?无论如何,这确实是离题了,请说明您最初的问题是否得到了回答。注意:使用spark testing base在某个时候会让您使用hive,这可能不是您想要的。