如果 使用 java1.4 或者更高的 java 版本进行 工 作 , 那么你也许已经熟悉assertions(断言),断言用来测试你的程序的结果是否是正确的结果,通常,断言贯穿在代码中用来保证代码没有任何逻辑上的矛盾,用来执行例如在方法的开始和结束的时候检查常量或者保证方法的参数是有效的。
在这本书,我们使用断言来演示 groovy 的特性,正像在测试驱动开发一样,测试被认为是保证单元代码正确性的最后手段,在这本书中,断言用来验证执行一段特定的 groovy 代码而获得的结果,我们使用断言来表明不但代码可 以运行,而且也要验证代码运行的结果是否正确,这节将为你读这本书的例子做准备,这节解释了在 groovy 中断言是如何工作的并且应该怎样使用断言。
开始学习一门语言时就介绍断言好像比较奇怪,但这是必须的,除非你理解断言,否则你不会懂得本书其余的例子,groovy 使用关键字“assert”来提供断言的功能,表 2.1
显示他们看起来的样式。
表 2.1 使用断言assert(true)
assert 1 == 1
def x = 1
assert x == 1
def y = 1 ; assert y == 1
我们来一行一行的看看这些代码。assert(true)
这里介绍的“assert”关键字显示你需要提供一个断定结果为 true 表达式。assert 1 == 1
这显示 assert 关键字能够接受一个完整的表达式,而不仅仅是直接值或者简单的变量。
毫不意外的是,1 等于 1,这象 Ruby,不象 java ,“==”操作符表示两个数的值等 价(“==”号调用了对象的 equals 进行比较),而不是判断引用是否相等,这里省略了圆括号,因为在顶级语句中他们是可选的。def x = 1 assert x == 1
这里定义了一个变量 x,将值 1 赋值给 x,并且使用 x 作为断言的表达式。
注意我们没有透露关于 x 的类型的任何信息,“def”关键字的意思是“动态的类型”。def y = 1 ; assert y ==1
这是典型断言当前行的风格,在一行有两个语句,通过分号进行分隔。
分号是 groovy语句的结束符,当语句在当前行结束的时候分号可以忽略。
断言的多个作用:
断言用来显示程序当前的状态,就像我们在这本书中的例子一样,先前的断言显示变量 y 有一个值,这个值为 1。
断言经常用来替换行注释,因为他们显示期望的结果并且在同一时间进行验证,注释在没有人注意的时候也许会过期——断言总是检查正确性,在真实的代码里他们象极小的单元测试。
真实的生活经历:写这本书是真正的体验了断言,这本书被构建为允许运行包含断言的例子代码,工作是这样的:这本书的初稿是 MS-word 格式,不包括代码,但是包括一个符号指向相应的脚本文件,通过少量的脚本,所有的符号被扫描并且加载相应的文件,使用这些脚本来运算和替换文档中的符号,例如,在列表 2.1 的断言被评估,并且相应文件被找到,然后进行正确的替换处理,如果断言失败,那么处理过程给出一个错误信息后停止。 由于这本书是一个成品书,这就意味着产品的处理不会停止并且所有的断言都是成功的。
这让你对书中的例子有足够的信心,这不但证明了断言,也使用脚本来控制ms-wo rd 和 AntBuilder 来进行建立工作——正如我们前面说的那样,groovy 的特性是非常棒的。
大多数例子使用的断言——表达式的一部分用来描述的功能特性,另外一部分将简单化至能够理解的地步,如果理解一个例子有任何困难,那么停下来,想一想我们正在讨论的语 言功能和你希望得到的结果,然后看看我们对结果的说明是什么。
断言在运行时被执行,图2.1 将一个复杂的断言语句分解为不同的部分来解释。
这是一个极端的例子——我们经常在独立的语句中执行断言,并且保持断言本身的简单。原则是一样的,这里只是用来我们证明代码的功能,代码本身没有价值,不需要知道后面知识就容易理解。
假如不相信断言或者不明白断言表达式,通常可以通过在控制台输出相应信息来代替,例如,这样的一个断言:assert x == 'hey, this is really the content of x'
可以通过下面的语句代替:println x
这会在控制台打印出 x 的值,在本书中,为了检查代码,我们经常通过控制台输出来代替断言,这不是一个常用来介绍书中代码的方法,但是我们能近一步感受到代码和结果,对我们进行最原始的测试驱动有帮助。
断言有一些有趣的特性能影响到你的程序风格。6.2.4 节将深入讨论断言,现在已经解释了用在 groovy 中的工具,我们可以开始看看一些有用的功能了。