1、背景
在我的另一篇文章中,结合实践经验,总结了当前阶段企业级开发的一套基于groovy的实用测试环境,本文将进一步说明使用groovy做测试的原因,并详细描述groovy语言支持编写java测试代码的诸多优秀特性,以及使用groovy编写测试过程中数量微小但不得不时刻保持谨慎的“坑”。
不夸张的说,掌握了本文所述的常见“测试”桥段,人人都能成为写测试的高手。但是要完全弄懂,还是需要多看几本groovy书(比如《groovy编程》),或者访问groovy官网里的文档。
2、why groovy
主要有以下几个原因:
- 在java13普及前,甚至普及后较长的一段时期内,groovy语法依旧更加简单
- groovy兼容java,二者使用相同的类型系统,兼容性在诸多jvm语言中绝无仅有
- groovy能够使用java的海量第三方库,这个非常关键,很多工具、框架,如lombok、springboot等,都是即插即用
- groovy具有一些优秀的特性,能减少编写测试的痛楚
- groovy提供了更好的API,可以帮助减少代码噪声(less verbose)
简洁的语法
得益于groovy的类型推断特性,以及可选类型(Optional Type)特性,类型将不再像java中那样复杂。
比如,groovy支持更加简单的对象构造语法:
def str = 'a simple string'
assert str.class = String // 不用写成String.class
// 打印利器:GString,再也不用拼接字符串了。
// ${expr},注意GString里是可以使用表达式的
def greeting = 'hello'
def gstr = "GString: ${greeting}"
assert gstr instanceof GString
assert gstr == 'GString: hello' // ==调用了equals,而不是判断引用相等
def num = 1
assert num instanceof int
assert num.class == Integer
又如,groovy对java bean的支持:
@Data // lombok生成了equals、toString等方法
class Person {
String name
Integer age
}
def p1 = new Person(name:'hx', age: 18)
// 这里p1.name实际是调用了getName方法,并没有破坏封装的原则。
println "person name: ${p1.name}, age: ${p1.age}"
// 造数据利器:map转java bean
def p2 = [name:'hx', age:18] as Person
// 判等利器:注意这里利用了lombok生成的equals方法
assert p1 == p2
def p3 = p1
assert p3.is(p1) // 判断引用相等
还有不得不说的,groovy闭包的使用: