我编写了一个简单的Scala代码来练习Scala测试:
object Job {
def main(args: Array[String]) = {
val sc = new SparkContext()
println(reduceWithSum(sc))
}
def reduceWithSum(sc: SparkContext): MyClass = {
val data = Array(1, 2, 3, 4, 5)
val distData = sc.parallelize(data)
val distDataValue = distData.map(MyClass(_))
distDataValue.reduce(MyClass.sum)
}
}
我知道为reduceWithSum()编写测试代码很容易,但是对我来说为main()编写测试代码似乎很难。有提示吗?
这是我编写的示例测试代码:
class JobTest extends FlatSpec with Matchers {
val conf = new SparkConf().setMaster("local[*]").setAppName("Test")
val testSc = new SparkContext(conf)
it should "reduce correctly" in {
Job.reduceWithSum(testSc) shouldBe MyClass(15)
}
答案 0 :(得分:3)
main
方法返回Unit
(其签名为def main(args: Array[String]): Unit
),因此测试此方法“返回”的内容有点奇怪。
在这里,您只是在做println
,因此,如果您真的想检查结果是否已打印,则应遵循@JoelBerkeley在其评论中给出的链接:Scalatest - how to test println。但是,仅测试直接打印的结果不是一个好习惯:您应该测试方法返回的结果,而不是只是正确打印结果的事实。
在大多数情况下,您不需要测试main
方法,因为它只是程序的入口点。恕我直言,main
方法应该只创建一个类的实例(例如,SparkProgram
)来进行处理,仅此而已(请参见that answer,我完全同意)。该类中的方法必须独立于您的main
进行测试。您的main
方法应尽可能短:没有业务逻辑,只需将工作委派给类,这些方法将返回可以测试的非Unit
结果。