Scala 工具包

如何编写测试?

语言

您可以在一行中要求整个工具包

//> using toolkit latest

MUnit 作为测试框架,仅在测试文件中可用:test 目录中的文件或具有 .test.scala 扩展名的文件。请参阅 Scala CLI 文档 以了解有关测试范围的更多信息。

或者,您只需要求特定版本的 MUnit

//> using dep org.scalameta::munit:1.0.0-M7

在您的 build.sbt 文件中,您可以添加对 toolkit-test 的依赖

lazy val example = project.in(file("example"))
  .settings(
    scalaVersion := "3.2.2",
    libraryDependencies += "org.scala-lang" %% "toolkit-test" % "0.1.7" % Test
  )

这里的 Test 配置表示该依赖项仅由 example/src/test 中的源文件使用。

或者,您只需要求特定版本的 MUnit

libraryDependencies += "org.scalameta" %% "munit" % "1.0.0-M7" % Test

在您的 build.sc 文件中,您可以添加一个扩展 TestsTestModule.Munittest 对象

object example extends ScalaModule {
  def scalaVersion = "3.2.2"
  object test extends Tests with TestModule.Munit {
    def ivyDeps =
      Agg(
        ivy"org.scala-lang::toolkit-test:0.1.7"
      )
  }
}

或者,您只需要求特定版本的 MUnit

ivy"org.scalameta::munit:1.0.0-M7"

编写测试套件

单个类中的测试组称为测试类或测试套件。

每个测试套件验证软件的特定组件或功能。通常,我们为要测试的每个源文件或类定义一个测试套件。

在 Scala CLI 中,测试文件可以与实际代码位于同一文件夹中,但文件名称必须以 .test.scala 结尾。以下 MyTests.test.scala 是一个测试文件。

example/
├── MyApp.scala
└── MyTests.test.scala

其他有效的结构和约定在 Scala CLI 文档 中进行描述。

在 sbt 中,测试源文件位于 src/test/scala 文件夹中。

例如,以下是项目 example 的文件结构

example
└── src
    ├── main
    │   └── scala
    │       └── MyApp.scala
    └── test
        └── scala
            └── MyTests.scala

在 Mill 中,测试源文件位于 test/src 文件夹中。

例如,以下是模块 example 的文件结构

example
└── src
|   └── MyApp.scala
└── test
    └── src
        └── MyTests.scala

在测试源文件中,定义包含单个测试的套件

package example

class MyTests extends munit.FunSuite {
  test("sum of two integers") {
    val obtained = 2 + 2
    val expected = 4
    assertEquals(obtained, expected)
  }
}
package example

class MyTests extends munit.FunSuite:
  test("sum of two integers") {
    val obtained = 2 + 2
    val expected = 4
    assertEquals(obtained, expected)
  }

测试套件是一个扩展 munit.FunSuite 的 Scala 类。它包含一个或多个测试,每个测试都通过对 test 方法的调用来定义。

在前面的示例中,我们有一个名为 "sum of integers" 的单个测试,它检查 2 + 2 是否等于 4。我们使用断言方法 assertEquals 检查两个值是否相等。如果所有断言都正确,则测试通过,否则失败。

断言

在每个测试中使用断言来描述要检查的内容非常重要。MUnit 中的主要断言方法是

  • assertEquals 用于检查获得的内容是否等于预期内容
  • assert 用于检查布尔条件

以下是一个使用 assert 检查列表中布尔条件的测试示例。

test("all even numbers") {
  val input: List[Int] = List(1, 2, 3, 4)
  val obtainedResults: List[Int] = input.map(_ * 2)
  // check that obtained values are all even numbers
  assert(obtainedResults.forall(x => x % 2 == 0))
}
test("all even numbers") {
  val input: List[Int] = List(1, 2, 3, 4)
  val obtainedResults: List[Int] = input.map(_ * 2)
  // check that obtained values are all even numbers
  assert(obtainedResults.forall(x => x % 2 == 0))
}

MUnit 包含更多断言方法,你可以在其 文档 中找到:assertNotEqualsassertNoDifffailcompileErrors

本页面的贡献者