经过前段时间调用第三方Jar,Groovy文件的实践,突然觉得SoapUI的使用范围扩大了很多.因为很多的TestStep,SoapUI本身软件做不了的话,可以交给第三方文件来完成,这样,SoapUI中的脚本只是调用方,从架构上和易用性上会好看很多,同时也方便测试人员对自己脚本的管理和控制.好了,废话不多说,上这次的主题.
在测试WebService的过程中,测试的标准就是预期值(expectedData)和实际值(actualData)进行的对比.预期值可以根据SaopRequest中得到,实际值大多数都是落地到数据库,需要我们从数据库中把需要对比的数据抽取出来,保存为一定的格式,来进行比较.抽取数据库数据的类源代码如下:
package com.shengpay.qa.db; import java.util.ArrayList; import java.util.List; import groovy.sql.GroovyRowResult import groovy.sql.Sql; class CollectActualDateFromDB { //查询到一条数据库记录,选择其中部分的字段 //其实这个函数可以不用,只是为了简单提取单条数据库记录 public HashMap getRecordHashMap(Sql Conn,String Sql,List<String> ColumnName){ HashMap Result=new HashMap() def Info=Conn.firstRow(Sql) Result=getListDateFromGroovyRowResult(ColumnName,Info) return Result } //查询到多条数据库记录,选择其中部分字段 public List<HashMap> getRecordsList(Sql Conn,String Sql,List<String> ColumnName){ List<HashMap> Result=new ArrayList() def Info=Conn.rows(Sql) Iterator it=Info.iterator() while(it.hasNext()) { Result.add(getListDateFromGroovyRowResult(ColumnName,it.next())) } return Result } //输入List和GroovyRowResult,返回Entry.map中K在List中的KV映射形成的新HashMap private HashMap getListDateFromGroovyRowResult(List<String> List,GroovyRowResult GroovyRowResult){ HashMap Result=new HashMap() Iterator it=GroovyRowResult.keySet().iterator() while(it.hasNext()){ def TempKey=it.next() if(List.contains(TempKey)) { Result.put(TempKey,GroovyRowResult.get(TempKey)) } } return Result } public static Sql getDBConnnection(String DBSort,String Ip,String Port,String DatabaseName,String Sid,String User,String Password){ def sort=DBSort.toUpperCase() switch (sort) { case "SQLSERVER": return Sql.newInstance(url:"jdbc:sqlserver://"+Ip+":"+Port+";databaseName="+DatabaseName,user:User,password:Password,driverClassName:"com.microsoft.sqlserver.jdbc.SQLServerDriver") case "ORACLE": return Sql.newInstance("jdbc:inetpool:inetora:"+Ip+"?database="+DatabaseName+"&sid="+Sid,User,Password,"com.inet.pool.PoolDriver") case "MYSQL": return Sql.newInstance("jdbc:mysql://"+Ip+":"+Port+"/"+DatabaseName,User,Password,"com.mysql.jdbc.Driver") default: return null } } }
方法说明:
getRecordHashMap(Sql Conn,String Sql,List<String> ColumnName)和getRecordsList(Sql Conn,String Sql,List<String> ColumnName) 分别为获取单条数据和获取多条数据的方法.入参说明:Conn为数据库连接,Sql为执行的数据库语句,ColumnName为需要抽取的数据字段的名称.若获取的数据为单条数据,则返回的格式为HashMap;若获取的数据为多条数据,则返回的格式为List<HashMap>;其中K为数据库表字段名,V为该字段的值.
getDBConnnection(String DBSort,String Ip,String Port,String DatabaseName,String Sid,String User,String Password) 为静态函数,为获取数据库连接的方法.入参说明:DBSort为数据库类型,Ip为数据库的IP地址,Port为端口号,DatabaseName为库名或者Schema名,Sid为Oracle的Sid(如果不为Oracel,则填写Null),User为用户名,Password为密码.返回的类型为Groovy.sql.Sql
调用方法:
1.抽取数据(Oracle).调用文件代码如下:
import groovy.sql.Sql import com.shengpay.qa.db.CollectActualDateFromDB CollectActualDateFromDB cd=new CollectActualDateFromDB() List<String> Lists=new ArrayList() Lists.add("MEMBER_ID") Lists.add("LOGIN_NAME") def Conn=CollectActualDateFromDB.getDBConnnection("oracle","127.0.0.1",null,"databaseName","SID","test","password") def SqlStatement="SELECT * FROM memberuser.tr_login_name WHERE login_name='loginName'" HashMap Record=new HashMap() Record=cd.getRecordHashMap(Conn,SqlStatement,Lists) log.info Record Conn.close()
2.抽取数据(Sqlserver).调用代码如下:
import groovy.sql.Sql import com.shengpay.qa.db.CollectActualDateFromDB //定义获取数据库的实例 CollectActualDateFromDB cd=new CollectActualDateFromDB() //定义一个List,List里面包含需要的数据库字段 //单条记录用到的List List<String> List=new ArrayList() List.add("ProductCode") List.add("ProductName") //多条记录用到的List List<String> Lists=new ArrayList() Lists.add("MerchantID") Lists.add("MerchantName") //定义数据库连接串. def Conn=CollectActualDateFromDB.getDBConnnection("sqlserver","127.0.0.1","14433","MERCHANTS",null,"test","password") //定义需要查询的SQL语句 def SqlStatement="select * from ProductCode where productCode='10000003'" //产生一条记录 def SqlStatements="select * from merchants where MerchantName='商户名字'" //产生多条记录 //定义返回结果的变量,单个就是HashMap,多个就是List HashMap Record=new HashMap() List<HashMap> RecordsList=new ArrayList() //开始执行取值操作 Record=cd.getRecordHashMap(Conn,SqlStatement,List) RecordsList=cd.getRecordsList(Conn,SqlStatements,Lists) //显示结果 log.info Record log.info "==============================================================================" for(int i=0;i<RecordsList.size();i++) { log.info RecordsList[i] } //关闭数据库连接 Conn.close()