如何在测试Zio程序中使用断言

92 阅读3分钟

目录

阅读时间: 2 分钟

在这篇博客中,我们将谈论测试中的断言 Zio程序,以及为什么它对我们这些程序员很有用,我们如何使用它们。

Zio

测试

ZIO测试是一个零依赖的测试库,它使测试有效的程序变得容易。

Zio测试使用ZIO工作得非常好。它提供了使用IO的能力,这些IO将被其内部运行时实现所解释。然而,即使我们不使用ZIO,我们也可以测试我们的程序。

ZIO测试中,所有的测试都是不可变的值,测试与ZIO紧密结合,所以测试有效的程序就像测试纯程序一样自然。

通过使用断言进行测试

一个断言是在一个特定点上的布尔表达式。在一个程序中,除非程序中存在错误,否则它将为真。我们可以将测试断言定义为一个表达式,它封装了一些关于被测目标的可测试逻辑。

为了创建Assertion[A] 对象,我们可以使用zio.test.Assertion 下定义的函数。它已经预先定义了许多有用的断言,如 `equalTo`,isTrue,contains,throws 等等。

在断言中真正有用的是它的行为像布尔值。也可以用操作布尔值的运算符来组成,如and (&&), or (||), negation (negate)。

例如,当我们处理集合时,我们可能想断言两个集合有相同的元素,即使它们出现的顺序不一致。

我们可以使用hasSameElements断言轻松地做到这一点。

object ExampleSpec extends DefaultRunnableSpec {

  def spec = suite("ExampleSpec")(

    test("hasSameElement") {

     assert(List(1, 1, 2, 3))(hasSameElements(List(3, 2, 1, 1)))

    }

  }

}

hasAt 的第二个参数是一个Assertion[A] ,适用于该序列的第三个元素,所以我将寻找对A 进行操作的函数,其返回类型为Assertion[A]

我可以选择equalTo ,因为它接受一个A 作为参数,允许我提供5

val x = Vector(0, 1, 2, 3)

test("4th value is equal to 5") {

  assert(x)(hasAt(3)(equalTo(5)))

}

另外,如果我希望断言一个值接近数字5,公差为2。这需要对类型A ,所以我会在Numeric部分寻找一个断言。approximatelyEquals 是一个很好的选择,因为它允许任何Numeric的A 的起始值参考,以及一个公差。

val x = Vector(0, 1, 2, 3)

test("4th value is approximately equal to 5") {

  assert(x)(hasAt(3)(approximatelyEquals(5, 2)))

}

如果我们想断言一个整数集合至少有一个值,并且所有的值都大于或等于零。我们可以试试这个。

val assert: Assertion[Iterable[Int]]=

  isNonEmpty && forall(nonNegative)

我们还可以用not断言来否定断言。例如,我们可以
,表达一个集合至少包含一个重复元素的期望
,像这样。

val assertion: Assertion[Iterable[Any]] =

  not(isDistinct)

如果我们曾经到过一个点,我们不关心具体的值。例如,我们只关心效果失败,而不关心它是如何失败的,我们可以使用anything断言来表达一个永远是真的断言。

分享Knol。

相关内容