为scala代码编写测试

时间:2018-04-25 13:36:34

标签: scala unit-testing tdd scalatest

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

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
}

最后,我尝试使用测试驱动的设计最佳实践,但仍然不知道在编写代码之前如何继续编写测试,任何提示如何继续遵守这些实践。

非常感谢

1 个答案:

答案 0 :(得分:2)

通常,在定义类或对象时,应该为使用该类的人调用的方法编写测试,其他方法应该是私有的。如果您发现自己想要公开方法,那么可以测试它们,考虑将它们移动到单独的类或对象中。

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,pendingUntilFixedpending

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

pending是一个标记说"我要为此写一个测试,但我还没有到达它#34;。我经常使用它,因为它允许我为我的测试编写一个大纲,然后返回并填写它们。