您的位置:首页 > 数据库

2.5 使用Groovy导入CSV文件的数据到一个内存模式的H2数据库

2018-02-24 14:06 676 查看

2.5 使用Groovy导入CSV文件的数据到一个内存模式的H2数据库

         有时只需要一个快速加载测试数据的数据库且不想保留、设置或安装任何东西。那么,这就是H2数据库引擎的内存模式可以派上用场的地方。

2.5.1 准备阶段

         使用H2数据库之前,需要下载它的JAR添加到SoapUI的类库路径下,根据我本机安装的版本,SoapUI的类库目录是:C:\Program Files (x86)\SmartBear\SoapUI-Pro-5.1.2\bin\ext。
        


     需要一些带有头的CSV数据。令人惊讶的是,脚本可能处理任何有效的CSV结构,关于CSV结构可以看: http://www.h2database.com/html/functions.html#csvread。我们使用一个简单的invoice例子:invoices_with_headers.csv,该文件可以在本章实例中找到,路径截图如下:
           


         在该路径下有一个完整的SoapUI项目:GroovyInMemoryDB-soapui-project.xml。这是个完整的实例。可以直接使用打开运行。

2.5.2 操作步骤

         假设有一个项目,该项目带有TestSuite和TestCase,,添加一个GroovyTestStep来注册H2 JDBC驱动程序,加载CSV测试数据到新的表中、从表中查找数据并记录结果。执行步骤如下:
一、创建一个带有TestSuite和TestCase的项目,截图如下:



二、创建一个Groovy TestStep,并添加如下代码:import groovy.sql.Sql
import org.h2.Driver
com.eviware.soapui.support.GroovyUtils.registerJdbcDriver("org.h2.Driver")
def db = Sql.newInstance("jdbc:h2:mem:test", "org.h2.Driver")
//Change this to the location of your CSV file.
def fileName = "D:/soapUICookBook/SoapUI-Cookbook-master/Chapter2/chapter2/invoices_with_headers.csv"
db.execute("create table if not exists invoices as select * from csvread('$fileName')")
db.eachRow("select * from invoices"){invoice->log.info invoice.toString()
}操作执行截图,文件中fileName需要自己更加文件路径进行修改成本地路径:



2.5.3 工作原理

         SoapUI的GroovyTestStep脚本能使用JDBC驱动工作的关键点是使用GroovyUtils.registerJdbcDriver方法注册驱动成功。如果不注册驱动,当Sql.newInstance时,将会出现错误信息为“nosuitable driver”的提示。
         groovy.sql.sql类提供了一个非常方便的包装,该包装的目的是隐藏所有通用的Java JDBC连接代码与连接管理。
         TIPS:Groovy SQL
         如果想要使用JDBC数据源执行更多的Groovy脚本,则需要更好地了解这一点。除了驱动信息和SQL,上述代码也可以应用于启动JDBC数据库,例如MySQL。更多信息可以看如下连接:http://groovy.codehaus.org/api/groovy/sql/Sql.html。除了指定驱动类名“org.h2.Driver”,连接字符串“jdbc:h2:mem:test”指定了名为test的H2数据库并在内存中创建该数据库。
         注意:内存模式(in-memorymode)
         有关内存模式便利性的一点是H2数据库实例在Groovy脚本完成后不会停止运行,并且在SoapUI的JVM关闭之前保持可用状态。这是为什么在创建表的语句时加上“if not exists”原因,否则在重新运行脚本时将会提示表已经存在的错误信息。
         接下来,有一个非常紧凑和动态的SQL语句:
    create table if not exists invoices as select * from csvread('$fileName')
         该语句不经是表不存在是创建该表,而且基于CSV文件定义该表的结构,这时加载文件的数据到表中。
         最后一句是标准Groovy查询invoice表中的所有数据,然后对他们进行迭代,打印每个日志。
         前面的例子非常紧凑,可以证明在设置测试数据时非常有用。看第三章, “开发并部署动态REST与Soap Mocks”这个例子。如果需要清空数据,你可以删除记录或者删除表,执行语句如下:       db.execute("delete frominvoices")
db.execute("drop table invoices")参数化文件路径:为了提高实例而不是硬编码文件路径,更好的方式是使用属性,给TestCase添加扩展属性invoiceFileName:def fileName =testRunner.testCase.getPropertyValue("invoiceFileName")截图如下:



更改Groovy TestStep的编码如下:import groovy.sql.Sql
import org.h2.Driver
com.eviware.soapui.support.GroovyUtils.registerJdbcDriver("org.h2.Driver")
def db = Sql.newInstance("jdbc:h2:mem:test", "org.h2.Driver")
def fileName = testRunner.testCase.getPropertyValue("invoiceFileName")
db.execute("create table if not exists invoices as select * from csvread('$fileName')")
db.eachRow("select * from invoices"){invoice->log.info invoice.toString()
}执行结果截图:



使用Groovy脚本实例的信息: http://www.soapui.org/Scripting-Properties/tips-a-tricks.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: