经过前段时间调用第三方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 ColumnName){
HashMap Result=new HashMap()
def Info=Conn.firstRow(Sql)
Result=getListDateFromGroovyRowResult(ColumnName,Info)
return Result
}
//查询到多条数据库记录,选择其中部分字段
public List getRecordsList(Sql Conn,String Sql,List ColumnName){
List 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 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 ColumnName)和getRecordsList(Sql Conn,String Sql,List ColumnName) 分别为获取单条数据和获取多条数据的方法.入参说明:Conn为数据库连接,Sql为执行的数据库语句,ColumnName为需要抽取的数据字段的名称.若获取的数据为单条数据,则返回的格式为HashMap;若获取的数据为多条数据,则返回的格式为List;其中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 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 List=new ArrayList()
List.add("ProductCode")
List.add("ProductName")
//多条记录用到的List
List 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 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
{
log.info RecordsList[i]
}
//关闭数据库连接
Conn.close()