你可以在一行中要求整个工具包
//> 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
对象,该对象扩展 Tests
和 TestModule.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
以外的其他异步类型。