如何在ZIO中测试效果 | ZIO测试简介

193 阅读4分钟

目录

阅读时间: 4 分钟

在这篇博客中,我们将了解如何使用ZIO测试库来测试ZIO效果。同时,我们将了解一些常见的断言和ZIO Test的一个很好的功能,即测试方面

什么是ZIO测试?

ZIO Test是一个测试库,它使测试有效程序变得容易。它将效果视为第一类值,并充分利用了ZIO的全部功能。

要开始使用ZIO Test,首先在你的build.sbt中把它作为一个依赖项加入。

libraryDependencies ++= Seq(
  "dev.zio" %% "zio-test" % zioVersion,
  "dev.zio" %% "zio-test-sbt" % zioVersion,
)

编写第一个测试

我们可以通过扩展DefaultRunnableSpec和实现其spec方法来编写我们的第一个测试。

每个测试集合被表示为一个规格,可以是一个测试或包含一个或多个其他规格的套件。

我们使用assert操作符来编写测试,它首先接收一个我们要做断言的值,然后接收一个我们期望对该值成立的断言。这里我们使用简单的equalTo断言,它只是期望值等于equalTo的参数,但我们也可以有各种其他断言来表达更复杂的期望。

上面的测试不涉及任何ZIO效应。所以让我们看看如何使用这个ZIO测试库来测试我们的ZIO效应。

除了用ZIO.success(5 *5)替换5 * 5之外,我们所做的唯一改变是用testM替换test,用 assertM替换assert

testM代替test告诉测试框架,该测试将返回一个ZIO效果。

同样,用assertM代替assert,表明断言的左边将是一个ZIO效果,测试框架应该运行左边,并将其结果与右边的期望值进行比较。

这里的assertM没有什么神奇之处。事实上,我们可以用map或a代替assertM的理解力。

这三种测试的写法都是等价的。

一般来说,我们发现当整个测试适合于一行时,使用assertM是最易读的,而使用a进行理解则是最好的,但你可以选择适合你的风格。

你也可以使用**&&和** **||来组合多个断言语句,使用逻辑连接和分离,或者使用!**来否定一个断言。

其他常见断言

我们在上面的例子中使用的equalTo断言是最基本的断言之一,但在zio.test包的断言伙伴对象中也有各种其他断言,在某些情况下很有用。

断言可以针对特定的数据类型进行专业化处理。例如,在处理集合时,我们可能想断言两个集合有相同的元素,即使它们不是以相同的顺序出现。我们可以使用hasSameElements断言轻松做到这一点。

另一个特别有用的断言是fails断言,它允许我们断言一个效果以一个特定的值失败。我们可以使用这个断言,首先在我们的效果上调用run来获得一个ZIO效果,这个效果成功或失败的Exit值代表了原始效果的结果,然后用这个Exit值来使用failed断言。

在上面的例子中,failed断言要求ZIO效果的结果是一个失败,然后允许我们提供另一个参数来对这个失败的值做一个更具体的断言。在这种情况下,我们只是使用了isUnit断言,这是equalTo(()的简写,但我们可以使用任何我们想要的断言。

另一个有用的断言是任何你可以用来表达一个永远是真的断言。

测试方面

ZIO Test为用户提供了另一个很好的功能,就是测试方面

测试方面修改了测试执行方式的某些方面。它们可以用来修改单个测试,甚至是你所创建的整个套件。下面是一些重要的测试方面

  • nonFlaky- 重复一个测试 **n**次,以确保它不是不稳定的。
  • timeout- 在一个指定的时间段后,暂停测试
  • 忽略- 标记测试为忽略
  • failing- 指定我们期望一个测试失败。
  • jvmOnly- 只在JVM平台上运行一个测试
  • after- 在测试后运行一个效果
  • flaky- 重试测试直到成功

测试方面是通过使用 **@@**操作符应用于测试或套件。这里有一些例子。

这就是这个博客的全部内容。我希望你觉得它很有用,而且很容易理解。关于ZIO测试还有很多东西要学习,但这应该给你提供了开始为ZIO程序编写自己的测试所需的工具。