在命令行上使用 sbt 和 ScalaTest 测试 Scala

语言

Scala 有多个库和测试方法,但在本教程中,我们将演示 ScalaTest 框架中一个流行选项,称为 AnyFunSuite。我们假设你知道 如何在命令行上使用 sbt 创建 Scala 项目

设置

  1. 在命令行上,在某个地方创建一个新目录。
  2. cd 进入该目录并运行 sbt new scala/scalatest-example.g8
  3. 将项目命名为 ScalaTestTutorial
  4. 该项目在 build.sbt 文件中将 ScalaTest 作为依赖项。
  5. cd 进入目录并运行 sbt test。这将运行测试套件 CubeCalculatorTest,其中包含一个名为 CubeCalculator.cube 的测试。
sbt test
[info] Loading global plugins from /Users/username/.sbt/0.13/plugins
[info] Loading project definition from /Users/username/workspace/sandbox/my-something-project/project
[info] Set current project to scalatest-example (in build file:/Users/username/workspace/sandbox/my-something-project/)
[info] CubeCalculatorTest:
[info] - CubeCalculator.cube
[info] Run completed in 267 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[success] Total time: 1 s, completed Feb 2, 2017 7:37:31 PM

了解测试

  1. 在文本编辑器中打开两个文件
    • src/main/scala/CubeCalculator.scala
    • src/test/scala/CubeCalculatorTest.scala
  2. 在文件 CubeCalculator.scala 中,您将看到我们如何定义函数 cube
  3. 在文件 CubeCalculatorTest.scala 中,您将看到我们有一个以我们正在测试的对象命名的类。
  import org.scalatest.funsuite.AnyFunSuite

  class CubeCalculatorTest extends AnyFunSuite {
      test("CubeCalculator.cube") {
          assert(CubeCalculator.cube(3) === 27)
      }
  }

让我们逐行了解一下。

  • class CubeCalculatorTest 表示我们正在测试对象 CubeCalculator
  • extends AnyFunSuite 让我们可以使用 ScalaTest 的 AnyFunSuite 类的功能,例如 test 函数
  • test 是 AnyFunSuite 中的一个函数,它收集函数体中断言的结果。
  • "CubeCalculator.cube" 是测试的名称。您可以将其称为任何名称,但一种约定是“ClassName.methodName”。
  • assert 采用一个布尔条件并确定测试是通过还是失败。
  • CubeCalculator.cube(3) === 27 检查 cube 函数的输出是否确实为 27。 === 是 ScalaTest 的一部分,它提供清晰的错误消息。

添加另一个测试用例

  1. 添加另一个测试块,其中包含自己的 assert 语句,用于检查 0 的立方。

       import org.scalatest.funsuite.AnyFunSuite
        
       class CubeCalculatorTest extends AnyFunSuite {
           test("CubeCalculator.cube 3 should be 27") {
               assert(CubeCalculator.cube(3) === 27)
           }
    
           test("CubeCalculator.cube 0 should be 0") {
               assert(CubeCalculator.cube(0) === 0)
           }
       }
    
  2. 再次执行 sbt test 以查看结果。

     sbt test
     [info] Loading project definition from C:\projects\scalaPlayground\scalatestpractice\project
     [info] Loading settings for project root from build.sbt ...
     [info] Set current project to scalatest-example (in build file:/C:/projects/scalaPlayground/scalatestpractice/)
     [info] Compiling 1 Scala source to C:\projects\scalaPlayground\scalatestpractice\target\scala-2.13\test-classes ...
     [info] CubeCalculatorTest:
     [info] - CubeCalculator.cube 3 should be 27
     [info] - CubeCalculator.cube 0 should be 0
     [info] Run completed in 257 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: 3 s, completed Dec 4, 2019 10:34:04 PM
    

结论

您已经看到了一种测试 Scala 代码的方法。您可以在 官方网站 上了解有关 ScalaTest 的 FunSuite 的更多信息。您还可以查看其他测试框架,例如 ScalaCheckSpecs2

此页面的贡献者