groovy使用
我们的仿真器有一个XML文件,其中配置了运行测试所需的所有资源。 总之,每个文件都包含血液条形码和试剂条形码的列表。 在我们的例子中,条形码具有含义(资源种类,有效期,校验和……)。
因此,可以考虑创建一个用于集成测试的标准配置文件。 如果您不知道有效期限以月表示,则是个好主意。 因此有一天不知道您的测试为什么会失败。 答案很明显,资源已经过期。 我们需要一个( 脚本 ?)更新此XML文件,以便在资源过期时更改其月份字段。
此外,并非所有资源都应更新。 一些测试暗示使用过期的资源。 因此,某些条形码具有特殊格式,建议不要应用更新。
因为项目是用Java开发的,所以可以考虑创建一个小的Java类来完成所有这些工作。 但是,请等待一下,考虑此类是否会变小,我们需要一个解析器( DocumentBuilder ),该方法会遍历所有节点并查看资源是否已过期( NodeList,Element.getAttribute() ,...),最后编写文件修改。 此外,某些条形码包含特殊字符,应使用正则表达式( Pattern , Matcher )检测这些特殊字符,以避免其更新。 尽管这堂课并不难,但它与几行几行的小班相距甚远。
但是,多语种编程怎么样? Groovy是一个选择。 让我们看看Groovy如何处理XML和正则表达式 。
想象下一个XML文件:
<InstrumentContents>
<SampleHolder11>
<Samples>
<Sample diameter="10" barcode="A1"/>
<Sample diameter="10" barcode="2"/>
<Sample diameter="10" barcode="3"/>
</Samples>
</SampleHolder11>
</InstrumentContents>
Groovy和XML
同时,在Java中,您可以创建一个DocumentDocument来返回DocumentBuilder ,然后调用parse方法,在Groovy中,它很简单:
def root = new XmlParser().parseText(input)
和根变量指向XML文件的根元素。
现在,假设您要更新给定支架的所有血液条形码。 使用Java,您将在NodeList或XPath表达式上使用迭代器。 通过Groovy看到简单性。
def samples = root.SampleHolder11.Samples.Sample.findAll();
samples.each { sample ->
def barcode = nextBarcode()
sample.@barcode = barcode
}
看到使用Groovy可以将节点作为对象属性进行探索,最后我们调用findAll()方法,该方法返回属于SampleHolder11标记的示例节点的列表。 要返回属性值,就像在属性名称之前添加@字符一样简单,在我们的例子中是条形码 。
编写XML就像这样简单:
def writer = new StringWriter()
new XmlNodePrinter(new PrintWriter(writer)).print(root)
println writer.toString()
在前面的示例中,输出被写入控制台。
Groovy和正则表达式
请记住,某些条形码具有特殊格式。 在我们的情况下,如果条形码以A , B , C或D开头,则不应修改。 一个干净,可重用和可维护的解决方案是使用正则表达式检查一个条形码是否匹配或不符合特殊格式。 在Java中,此过程不是平凡的,您必须创建带有正则表达式, Matcher的Pattern对象,并使用find()方法查看是否在输入时找到pattern。
但是,如何确定一个字符串是否与Groovy中的正则表达式匹配? ==〜操作员为我们完成工作。 告诉我您对这个表达的看法:
def currentBarcode = sample.@Barcode as String
if( currentBarcode ==~/([ABCD]).+/ ) {
...
}
初级。 您将同意我的观点, Groovy方法比Java方法更简单。 要指定模式,您仅需使用〜字符加斜杠 ( / ),然后是一个正则表达式,最后是一个斜杠来分隔。 但是Groovy还支持=〜 (创建Matcher )和==〜 (返回布尔值,是否String匹配模式)。
我认为创建一个读取/解析/写入 XML文件的脚本是如此快捷,容易,与Java相比,涉及的类并不多。 与正则表达式方法进行比较不值得, Groovy是人们可能想到的最简单的方法。
在先前的Groovy脚本成功之后,我们决定创建另一个用于操作数据库的工具( Groovy脚本)。
系统将每次执行所发生的所有事件记录到数据库中。 某些事件很容易用模拟器重现,而其他事件则不然。 在集成测试中没有问题,因为使用了定义填充的数据库,但是验收测试不包含任何数据,而是在执行测试时生成的。 但是因为有些事件很难在模拟器中重现,所以创建了一个Groovy脚本来插入事件。
Groovy和SQL
作为Java , Groovy也可以访问数据库,并且您可以以简单的方式进行假设。 没有连接对象,没有PreparedStatement ,没有ResultSet ,……。
让我们看一个搜索数据并将其用于创建新注册表的示例。 想象一下,我们有一个名为Execution的表,另一个名为Incidence的表 ,以及一对多关系。
def db = Sql.newInstance(databaseUrl, user, password, driverClass)
def findExecutionByNameSql = "SELECT * FROM execution as e WHERE e.name=?"
def insertIncidenceSql = "INSERT INTO incidence VALUES(?,?,?)"
def name = "myExecution"
def incidence = "NOT_DISPENSED"
db.eachRow(findExecutionByNameSql, [name]) { execution ->
def nextval = nextval();
db.execute(insertIncidenceSql, [nextval, incidence, execution.dboid])
}
简单,是吗? 用一条线建立到数据库的连接。
执行SELECT查询和遍历结果也很容易。 使用eachRow方法,将迭代所有结果。 不再需要ResultSet对象。 参数值在方括号([])之间传递,并且作为XML,使用Closure访问每一行。 在前面的示例中,每一行都映射到执行变量。 此外,看看读取每个元组的值有多容易。 作为XML访问值作为一个类属性的ResultSet方法没有更多的干将 ,例如execution.dboid被用来指dboid领域。
最后, execute方法用于更新数据库。
现在,我向您展示了Groovy提供的一些不错的功能,我将向您解释我们如何执行这些工具。
GMaven
我们将Jenkins与Maven一起用作Continuos集成系统 。 詹金斯开始执行集成测试之前,Groovy脚本执行使发mulator被propertly配置。 该步骤有趣的部分是如何配置pom以执行Groovy脚本。
存在一个名为gmaven-plugin的插件 。 该插件根据阶段和目标运行Groovy脚本。
<build>
<plugins>
<plugin>
<groupId>org.codehaus.groovy.maven</groupId>
<artifactId>gmaven-plugin</artifactId>
<executions>
<execution>
<phase>process-test-resources</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<source>${pom.basedir}/src/main/script/contents.groovy</source>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
配置gmaven插件没问题,最重要的部分是您指定应执行哪个脚本的位置。
作为最后的注释,我想说我是Java的忠实拥护者 ,我的意图并不是批评它,但我认为有些问题最适合使用其他语言而不是Java 。 我的建议是学习尽可能多的语言( Scala , Groovy等),以便程序员可以为给定的问题选择最佳的解决方案。
我希望您觉得这篇文章有用。
参考: 使用Groovy –我们的JCG合作伙伴 Alex Soto在One Jar To Rulem上的 软介绍 所有博客
相关文章 :
翻译自: https://www.javacodegeeks.com/2012/01/using-groovy-soft-introduction.html
groovy使用