Scala学习测试类

Posted 顧棟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala学习测试类相关的知识,希望对你有一定的参考价值。

SBT AND SCALATEST

https://docs.scala-lang.org/overviews/scala-book/sbt-scalatest-intro.html

我们将从展示如何使用 sbt 开始,然后您将看到如何一起使用 ScalaTest 和 sbt 来构建和测试您的 Scala 项目。

THE MOST USED SCALA BUILD TOOL (SBT)

https://docs.scala-lang.org/overviews/scala-book/scala-build-tool-sbt.html

您可以使用多种不同的工具来构建 Scala 项目,包括 Ant、Maven、Gradle 等。 但名为 sbt 的工具是第一个专门为 Scala 创建的构建工具,如今它得到 Lightbend 的支持,Lightbend 由 Scala 的创建者 Martin Odersky 共同创立,该公司还维护 Akka、Play Web 框架等。

The sbt directory structure

与 Maven 一样,sbt 使用标准的项目目录结构。 如果您使用该标准目录结构,您会发现构建您的第一个项目相对简单。

首先要知道的是,在您的主项目目录下,sbt 需要一个如下所示的目录结构:

build.sbt
project/
src/
-- main/
   |-- java/
   |-- resources/
   |-- scala/
|-- test/
   |-- java/
   |-- resources/
   |-- scala/
target/

Creating a “Hello, world” sbt project directory structure

创建此目录结构非常简单,您可以使用像 sbtmkdirs 这样的 shell 脚本来创建新项目。 但是您不必使用该脚本; 假设你使用的是 Unix/Linux 系统,你可以使用这些命令来创建你的第一个 sbt 项目目录结构:

mkdir HelloWorld
cd HelloWorld
mkdir -p src/{main,test}/{java,resources,scala}
mkdir project target

If you run a find . command after running those commands, you should see this result:

$ find .
.
./project
./src
./src/main
./src/main/java
./src/main/resources
./src/main/scala
./src/test
./src/test/java
./src/test/resources
./src/test/scala
./target

如果你看到了这一点,那么你下一步的状态很好。

还有其他方法可以为 sbt 项目创建文件和目录。 一种方法是使用 sbt new 命令,该命令在 scala-sbt.org 上有记录。 这种方法没有在这里展示,因为它创建的一些文件比这样的介绍所必需的更复杂。

Creating a first build.sbt file

此时,您只需要再做两件事即可运行“Hello, world”项目:

  • A build.sbt file
  • A HelloWorld.scala file

对于这样的一个小项目,build.sbt 文件只需要包含几行,像这样:

name := "HelloWorld"
version := "1.0"
scalaVersion := "2.13.6"

因为 sbt 项目使用标准的目录结构,所以 sbt 已经知道它需要知道的一切。

现在你只需要添加一个小小的“Hello, world”程序。

A “Hello, world” program

在大型项目中,您所有的 Scala 源代码文件都将放在 src/main/scala 和 src/test/scala 目录下,但对于像这样的小示例项目,您可以将源代码文件放在 项目。 因此,在根目录中创建一个名为 HelloWorld.scala 的文件,内容如下:

object HelloWorld extends App {
    println("Hello, world")
}

现在您可以使用 sbt 来编译您的项目,在此示例中,您的项目由该文件组成。 使用 sbt run 命令来编译和运行你的项目。 执行此操作后,您将看到如下所示的输出:

$ sbt run

Updated file /Users/al/Projects/Scala/Hello/project/build.properties setting sbt.version to: 0.13.15
[warn] Executing in batch mode.
[warn]   For better performance, hit [ENTER] to switch to interactive mode, or
[warn]   consider launching sbt without any commands, or explicitly passing 'shell'
[info] Loading project definition from /Users/al/Projects/Scala/Hello/project
[info] Updating {file:/Users/al/Projects/Scala/Hello/project/}hello-build...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Set current project to Hello (in build file:/Users/al/Projects/Scala/Hello/)
[info] Updating {file:/Users/al/Projects/Scala/Hello/}hello...
[info] Resolving jline#jline;2.14.5 ...
[info] Done updating.
[info] Compiling 1 Scala source to /Users/al/Projects/Scala/Hello/target/scala-2.12/classes...
[info] Running HelloWorld 
Hello, world
[success] Total time: 4 s

当你第一次运行SBT它需要下载一些东西,可能需要一段时间来运行,但之后,它得到更快。如该输出显示的第一个评论,它也更快交互运行SBT。要做到这一点,首先通过自身运行SBT命令:

> sbt
[info] Loading project definition from /Users/al/Projects/Scala/Hello/project
[info] Set current project to Hello (in build file:/Users/al/Projects/Scala/Hello/)

像这样执行它的运行命令:

> run
[info] Running HelloWorld 
Hello, world
[success] Total time: 0 s

在那里,这要快得多。

如果您在 sbt 命令提示符下键入 help,您将看到许多可以运行的其他命令。 但是现在,只需键入 exit 即可离开 sbt shell。 您也可以按 CTRL-D 而不是键入 exit。

USING SCALATEST WITH SBT

https://docs.scala-lang.org/overviews/scala-book/sbt-scalatest-tdd.html

ScalaTest 是 Scala 项目的主要测试库之一,在本课中,您将看到如何创建使用 ScalaTest 的 Scala 项目。 您还可以使用 sbt 编译、测试和运行项目。

Creating the project directory structure

与上一课一样,使用以下命令为名为 HelloScalaTest 的项目创建一个 sbt 项目目录结构:

mkdir HelloScalaTest
cd HelloScalaTest
mkdir -p src/{main,test}/{java,resources,scala}
mkdir lib project target

Creating the build.sbt file

接下来,使用以下内容在项目的根目录中创建一个 build.sbt 文件:

name := "HelloScalaTest"
version := "1.0"
scalaVersion := "2.13.6"

libraryDependencies +=
    "org.scalatest" %% "scalatest" % "3.0.8" % Test

该文件的前三行与第一个示例基本相同,libraryDependencies 行告诉 sbt 包含运行 ScalaTest 所需的依赖项(jar 文件):

libraryDependencies +=
    "org.scalatest" %% "scalatest" % "3.0.8" % Test

该ScalaTest文档一向不错,你总能找到最新的信息,这些线路应该是什么样子的安装ScalaTest页面上。

Create a Scala file

接下来,创建一个可用于演示 ScalaTest 的 Scala 程序。 首先,在你项目的根目录下,在 src/main/scala 下创建一个名为 simpletest 的目录:

$ mkdir src/main/scala/simpletest

然后,在该目录中,创建一个名为 Hello.scala 的文件,其中包含以下内容:

package simpletest

object Hello extends App {
    val p = new Person("Alvin Alexander")
    println(s"Hello ${p.name}")
}

class Person(var name: String)

该源代码不会出错,但它提供了一种演示 ScalaTest 的简单方法。 此时,您可以使用 sbt run 命令运行您的项目,您的输出应如下所示:

> sbt run

[warn] Executing in batch mode.
[warn]   For better performance, hit [ENTER] to switch to interactive mode, or
[warn]   consider launching sbt without any commands, or explicitly passing 'shell'
...
...
[info] Compiling 1 Scala source to /Users/al/Projects/Scala/HelloScalaTest/target/scala-2.12/classes...
[info] Running simpletest.Hello 
Hello Alvin Alexander
[success] Total time: 4 s

现在让我们创建一个 ScalaTest 文件。

Your first ScalaTest tests

ScalaTest 非常灵活,编写测试的方法有很多,但一个简单的入门方法是使用 ScalaTest “FunSuite”编写测试。 首先,在 src/test/scala 目录下创建一个名为 simpletest 的目录,如下所示:

$ mkdir src/test/scala/simpletest

接下来,在该目录中创建一个名为 HelloTests.scala 的文件,内容如下:

package simpletest

import org.scalatest.FunSuite

class HelloTests extends FunSuite {

    // test 1
    test("the name is set correctly in constructor") {
        val p = new Person("Barney Rubble")
        assert(p.name == "Barney Rubble")
    }

    // test 2
    test("a Person's name can be changed") {
        val p = new Person("Chad Johnson")
        p.name = "Ochocinco"
        assert(p.name == "Ochocinco")
    }

}

该文件演示了 ScalaTest FunSuite 方法。 几个重要的点:

  • 你的课程应该扩展 FunSuite
  • 您可以通过为每个测试指定一个唯一名称来创建如图所示的测试
  • 在每个测试结束时,您应该调用 assert 来测试条件是否已满足

像这样使用 ScalaTest 类似于 JUnit,所以如果你是从 Java 来到 Scala 的,希望这看起来很熟悉。

现在您可以使用 sbt test 命令运行这些测试。 跳过输出的前几行,结果如下所示:

> sbt test
[info] Set current project to HelloScalaTest (in build file:/Users/al/Projects/Scala/HelloScalaTest/)
[info] HelloTests:
[info] - the name is set correctly in constructor
[info] - a Person's name can be changed
[info] Run completed in 277 milliseconds.
[info] Total number of tests run: 2
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 2, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[success] Total time: 1 s

TDD tests

此示例演示了使用 ScalaTest 进行的测试驱动开发 (TDD) 测试风格。 在下一课中,您将看到如何使用 ScalaTest 和 sbt 编写行为驱动开发 (BDD) 测试。

WRITING BDD STYLE TESTS WITH SCALATEST AND SBT

https://docs.scala-lang.org/overviews/scala-book/sbt-scalatest-bdd.html

在上一课中,您了解了如何使用 ScalaTest 编写测试驱动开发 (TDD) 测试。 ScalaTest 还支持行为驱动开发 (BDD) 风格的测试,我们将在接下来演示。

Creating a Scala class to test

首先,创建一个新的 Scala 类进行测试。 在 src/main/scala/simpletest 中,创建一个名为 MathUtils.scala 的新文件,其中包含以下内容:

package simpletest

object MathUtils {

    def double(i: Int) = i * 2

}

接下来编写的 BDD 测试将测试该类中的 double 方法。

Creating ScalaTest BDD-style tests

接下来,在 src/test/scala/simpletest 目录中创建一个名为 MathUtilsTests.scala 的文件,并将这些内容放在该文件中:

package simpletest

import org.scalatest.FunSpec

class MathUtilsSpec extends FunSpec {
  
    describe("MathUtils::double") {

        it("should handle 0 as input") {
            val result = MathUtils.double(0)
            assert(result == 0)
        }

        it("should handle 1") {
            val result = MathUtils.double(1)
            assert(result == 2)
        }

        it("should handle really large integers") (pending)
        
    }

}

如您所见,这是一种与上一课中的 TDD 测试非常不同的风格。 如果您以前从未使用过 BDD 风格的测试,那么主要的想法是,对于与程序员一起创建应用程序的“领域专家”之一来说,测试应该相对容易阅读。 关于这段代码的一些注意事项:

  • 它使用 FunSpec 类,其中 TDD 测试使用 FunSuite
  • 一组测试以describe开头
  • 每个测试都以 it 开头。 这个想法是测试应该读作,“它应该做XYZ…”,其中“它”是double函数
  • 此示例还显示了如何将测试标记为“待处理”

Running the tests

有了这些文件,您可以再次运行 sbt test。 输出的重要部分如下所示:

> sbt test

[info] HelloTests:
[info] - the name is set correctly in constructor
[info] - a Person's name can be changed
[info] MathUtilsSpec:
[info] MathUtils::double
[info] - should handle 0 as input
[info] - should handle 1
[info] - should handle really large integers (pending)
[info] Total number of tests run: 4
[info] Suites: completed 2, aborted 0
[info] Tests: succeeded 4, failed 0, canceled 0, ignored 0, pending 1
[info] All tests passed.
[success] Total time: 4 s, completed Jan 6, 2018 4:58:23 PM

关于该输出的一些说明:

  • sbt test 运行了之前的 HelloTests 以及新的 MathUtilsSpec 测试
  • 待定测试显示在输出中并标记为“(待定)”
  • 所有测试通过

如果您想从中获得一点乐趣,请更改一个或多个测试,使它们故意失败,然后查看输出结果。

Where to go from here

有关 sbt 和 ScalaTest 的更多信息,请参阅以下资源:

以上是关于Scala学习测试类的主要内容,如果未能解决你的问题,请参考以下文章

linux打开终端如何启动scala,如何在终端下运行Scala代码片段?

Scala学习——高级特性

Scala编程思想测试类AtomicTest.scala

Scala中的“不封闭类”是啥意思

Scala 学习 -- 样例类和模式匹配

Scala 学习 -- 样例类和模式匹配