为scala代码编写测试

为scala代码编写测试,scala,unit-testing,tdd,scalatest,Scala,Unit Testing,Tdd,Scalatest,我正在学习如何使用scalatest进行单元测试,但在学习Scala/scalatest时,我有一些基本问题 我写了一个scala脚本,它有一个scala对象和几个方法。我的问题如下:我应该为整个Scala对象编写一个单元测试,还是应该为每个函数编写一个测试。 例如,我编写了以下函数: 您知道如何使用scala test为此特定函数编写测试吗: def dataProcessing (input: List[String]) = { val Data = input.map(_.trim)

我正在学习如何使用scalatest进行单元测试,但在学习Scala/scalatest时,我有一些基本问题 我写了一个scala脚本,它有一个scala对象和几个方法。我的问题如下:我应该为整个Scala对象编写一个单元测试,还是应该为每个函数编写一个测试。 例如,我编写了以下函数: 您知道如何使用scala test为此特定函数编写测试吗:

def dataProcessing (input: List[String]) = {



val Data = input.map(_.trim).filter(x => !(x contains "$")).filter(line => Seq("11", "18").exists(s => line.contains(s))).map(elt => elt.replaceAll("""[\t\p{Zs}\.\$]+""", " ")).map(_.split("\\s+")).map(x => (x(1),x(1),x(3),dataLength(x(3)),dataType(x(3))))

 return Data
}
最后,我尝试使用测试驱动的设计最佳实践,但仍然不知道如何在编写代码之前编写测试,以及如何遵循这些实践的任何提示


非常感谢一般来说,定义类或对象时,应该为使用该类的人应该调用的方法编写测试,其他方法应该是私有的。如果你发现自己想让方法公开,就让它们被测试,考虑把它们移到一个单独的类或对象。 scala测试支持很多测试样式。就个人而言,我喜欢
WordSpec
。正在进行的基本测试如下所示:

class MyTest extends WordSpec with Matchers {
  "My Object" should {
    "process descriptors" when {
      "there is one input" in {
        val input = List("2010 Ford Mustang")

        val output = MyObject.descriptorProcessing(input)

        output should have length 1
        output.head shouldBe()
      }

      "there are two inputs" in pendingUntilFixed {
        val input = List("Abraham Joe Lincoln, 34, President",
                         "George Ronald Washington, 29, President")

        val output = MyObject.descriptorProcessing(input)

        output should have length 2
        output.head shouldBe()
      }
    }

    "format descriptors" when {
      "there is one input" in pending
    }
  }
}
我使用了scalatest的两个特性来启用TDD,
pendingUntilFixed
pending

pendingUntilFixed
允许您为尚未实现或尚未正常工作的代码编写测试。只要测试中的断言失败,测试就会被忽略并以黄色输出显示。一旦所有断言都通过,测试就会失败,让您知道可以打开它。这将启用TDD,同时允许您的构建在工作完成之前通过


pending
是一个标记,表示“我将为此编写一个测试,但我还没有开始”。我经常使用它,因为它允许我为我的测试编写一个大纲,然后返回并填写它们。

一般来说,定义类或对象时,应该为使用该类的人应该调用的方法编写测试,其他方法应该是私有的。如果你发现自己想让方法公开,就让它们被测试,考虑把它们移到一个单独的类或对象。 scala测试支持很多测试样式。就个人而言,我喜欢
WordSpec
。正在进行的基本测试如下所示:

class MyTest extends WordSpec with Matchers {
  "My Object" should {
    "process descriptors" when {
      "there is one input" in {
        val input = List("2010 Ford Mustang")

        val output = MyObject.descriptorProcessing(input)

        output should have length 1
        output.head shouldBe()
      }

      "there are two inputs" in pendingUntilFixed {
        val input = List("Abraham Joe Lincoln, 34, President",
                         "George Ronald Washington, 29, President")

        val output = MyObject.descriptorProcessing(input)

        output should have length 2
        output.head shouldBe()
      }
    }

    "format descriptors" when {
      "there is one input" in pending
    }
  }
}
我使用了scalatest的两个特性来启用TDD,
pendingUntilFixed
pending

pendingUntilFixed
允许您为尚未实现或尚未正常工作的代码编写测试。只要测试中的断言失败,测试就会被忽略并以黄色输出显示。一旦所有断言都通过,测试就会失败,让您知道可以打开它。这将启用TDD,同时允许您的构建在工作完成之前通过


pending
是一个标记,表示“我将为此编写一个测试,但我还没有开始”。我经常使用它,因为它可以让我为考试写一个大纲,然后回去填写。

与你的问题没有直接关系,但我会避免写这么长的一行。或者定义一些中间的
val
s,或者至少将每个方法拆分为新行。另一种可能是定义私有助手方法来执行一些单独的步骤。应该命名它们来清楚地描述它们所做的事情。也可以考虑定义一个case类来保存输出,而不是返回一个5元组。类似这样:
case类描述符(firstName:String,middleName:String,lastName:String,age:Int,jobTitle:String)
至于问题的TDD部分——TDD背后的整个思想是,在开始编写代码之前,您知道成功是什么样子。因此,当您认为要定义数据处理时,您可能知道它的输入和输出应该是什么样子。有了这些知识,你应该能够写一个测试,当我给它输入X时,结果得到Y。所以你按照@tilde在回答中的描述设置了你的测试,然后你看着它失败——然后写足够的代码让它通过。这与你的问题没有直接关系,但我会避免写这么长的一行。或者定义一些中间的
val
s,或者至少将每个方法拆分为新行。另一种可能是定义私有助手方法来执行一些单独的步骤。应该命名它们来清楚地描述它们所做的事情。也可以考虑定义一个case类来保存输出,而不是返回一个5元组。类似这样:
case类描述符(firstName:String,middleName:String,lastName:String,age:Int,jobTitle:String)
至于问题的TDD部分——TDD背后的整个思想是,在开始编写代码之前,您知道成功是什么样子。因此,当您认为要定义数据处理时,您可能知道它的输入和输出应该是什么样子。有了这些知识,你应该能够写一个测试,当我给它输入X时,结果得到Y。因此,您按照@tilde在其答案中概述的方式设置测试,然后您看到它失败,然后编写足够的代码使其通过。