使用Groovy –简单介绍

GroovyJava平台的一种面向对象的编程语言,可以用作脚本语言。 我们大多数人而不是单独使用Groovy ,而是使用Grails (基于Groovy的 Web框架)开发Web应用程序。
但是Groovy可以单独用于开发内部工具。 让我解释一下为什么Groovy脚本简化了我们为集成测试生成数据的工具的开发。
在我公司,我们创建临床仪器。 这些仪器非常昂贵,而且足够大以至于它们不便携。 由于这些原因,每台仪器都有一个仿真器 ,因此无需物理上的任何仪器即可运行集成测试。

我们的仿真器有一个XML文件,其中配置了运行测试所需的所有资源。 总之,每个文件都包含血液条形码和试剂条形码的列表。 在我们的例子中,条形码具有含义(资源种类,有效期,校验和……)。

因此,可以考虑创建一个用于集成测试的标准配置文件。 如果您不知道有效期限以月表示,则是个好主意。 因此有一天不知道您的测试为什么会失败。 答案很明显,资源已经过期。 我们需要一个( 脚本 ?)更新此XML文件,以便在资源过期时更改其月份字段。

此外,并非所有资源都应更新。 一些测试暗示使用过期的资源。 因此,某些条形码具有特殊格式,建议不要应用更新。

因为项目是用Java开发的,所以可以考虑创建一个小的Java类来完成所有这些工作。 但是,请等待一下,考虑此类是否较小,我们需要一个解析器( DocumentBuilder ),该方法可遍历所有节点并查看资源是否已过期( NodeList,Element.getAttribute() ,...),最后编写文件修改。 此外,某些条形码包含特殊字符,应使用正则表达式( PatternMatcher )检测这些特殊字符,以避免其更新。 尽管这堂课并不难,但它与几行几行的小班相距甚远。

但是多语言编程呢? 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,您将在NodeListXPath表达式上使用迭代器。 看到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和正则表达式

请记住,某些条形码具有特殊格式。 在我们的情况下,如果条形码以ABCD开头,则不应修改。 一个干净,可重用和可维护的解决方案是使用正则表达式检查一个条形码是否匹配或不符合特殊格式。 在Java中,此过程不是平凡的,您必须创建带有正则表达式, MatcherPattern对象,并使用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

作为JavaGroovy还可以访问数据库,并且您可以以简单的方式进行假设。 没有连接对象,没有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

我们将JenkinsMaven一起用作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 。 我的建议是学习尽可能多的语言( ScalaGroovy等),因此,作为程序员,您可以为给定的问题选择最佳的解决方案。

我希望您发现这篇文章有用。

参考:《 使用Groovy》 –我们的JCG合作伙伴 Alex Soto在“ 统治他们一个罐子”中的 软介绍 所有博客

相关文章 :


翻译自: https://www.javacodegeeks.com/2012/01/using-groovy-soft-introduction.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值