使用 main 函数进行 scala 测试

Sid*_*ang 1 scala scalatest

我写了一个简单的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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道为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)
    }
Run Code Online (Sandbox Code Playgroud)

nor*_*bjd 5

main方法返回Unit(其签名为def main(args: Array[String]): Unit),因此测试此方法“返回”的内容有点奇怪。

在这里,您只是在执行 a println,因此如果您确实想检查结果是否已打印,您应该点击 @JoelBerkeley 在他的评论中给出的链接:Scalatest - 如何测试 println。然而,仅仅测试直接打印的结果并不是一个好的做法:您应该测试您的方法返回的内容,而不仅仅是测试结果是否正确打印。

在大多数情况下,您不需要测试该main方法,因为它只是程序的入口点。恕我直言,该main方法应该只创建一个类的实例(SparkProgram例如)进行处理,仅此而已(请参阅我完全同意的答案)。该类中的方法必须独立于您的main. 您的main方法应该尽可能短:没有业务逻辑,只是将工作委托给具有返回Unit可以测试的非结果的方法的类。