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 文件中,你可以添加一个 test 对象,该对象扩展 TestsTestModule.Munit

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 中,异步方法通常会返回 Future。MUnit 为 Future 提供了特殊支持。

例如,考虑一个 square 方法的异步变体

import scala.concurrent.{ExecutionContext, Future}

object AsyncMathLib {
  def square(x: Int)(implicit ec: ExecutionContext): Future[Int] =
    Future(x * x)
}
import scala.concurrent.{ExecutionContext, Future}

object AsyncMathLib:
  def square(x: Int)(using ExecutionContext): Future[Int] =
    Future(x * x)

测试本身可以返回 Future[Unit]。MUnit 将在后台等待最终 Future 完成,如果任何断言失败,则测试失败。

因此,你可以按如下方式编写测试

// Import the global execution context, required to call async methods
import scala.concurrent.ExecutionContext.Implicits.global

class AsyncMathLibTests extends munit.FunSuite {
  test("square") {
    for {
      squareOf3 <- AsyncMathLib.square(3)
      squareOfMinus4 <- AsyncMathLib.square(-4)
    } yield {
      assertEquals(squareOf3, 9)
      assertEquals(squareOfMinus4, 16)
    }
  }
}
// Import the global execution context, required to call async methods
import scala.concurrent.ExecutionContext.Implicits.global

class AsyncMathLibTests extends munit.FunSuite:
  test("square") {
    for
      squareOf3 <- AsyncMathLib.square(3)
      squareOfMinus4 <- AsyncMathLib.square(-4)
    yield
      assertEquals(squareOf3, 9)
      assertEquals(squareOfMinus4, 16)
  }

测试首先异步计算 square(3)square(-4)。一旦两个计算完成,并且它们都成功,它将继续调用 assertEquals。如果任何断言失败,则最终 Future[Unit] 失败,并且 MUnit 将导致测试失败。

你可以在 MUnit 文档 中阅读更多有关异步测试的信息。它展示了如何使用 Future 以外的其他异步类型。

此页面的贡献者