Scala学习测试类
Posted 顧棟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala学习测试类相关的知识,希望对你有一定的参考价值。
文章目录
SBT AND SCALATEST
https://docs.scala-lang.org/overviews/scala-book/sbt-scalatest-intro.html
- The sbt build tool
- ScalaTest, a code testing framework
我们将从展示如何使用 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学习测试类的主要内容,如果未能解决你的问题,请参考以下文章