目录
阅读时间: 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断言来表达一个永远是真的断言。