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 之外的其他非同步類型。

此頁面的貢獻者