项目背景概述
某测试项目,该项目的接口测试需要大量的订单,并且需要订单的状态是已确认客户的订单,大量的订单可以通过下单接口直接造订单数据,但下的订单要人工在后台页面处理到已确认客户的状态才可以使用这些订单数据,大量订单人工处理到已确认客户状态,操作起来不太靠谱,后来从开发那了解到,订单从开始处理到已确认客户,主要会调用几个sp和sql的操作便可以完成, LR11提供了对数据库的直接访问和执行sp和sql的方法 ,可以使用 LR11通过模拟多线程的方式来批量的处理大量的订单到已确认客户的状态,从而可以方便高效的制造测试数据;
LR11对数据库的测试,主要使用到LR11提供的如下方法:
lr_db_connect();//建立同数据库的连接访问;
lr_db_executeSQLStatement();//执行具体的sql操作(select,update,insert,delete)或sp存储过程操作,
lr_db_disconnect();//断开数据库的连接;
需要注意的是LR11提供的对数据库的这些操作方法的使用是需要在 LR的Web Services协议脚本中才可以使用的;
具体的使用后面实例中会展现,该项目中数据的制造准备主要是通过如下过程完成
- 首先通过调用下单接口完成订单数据的制造;
测试环境获取下单接口调用地址:
http://XXX.com/XXXX.Booking.API/SaveOrderService.asmx?wsdl
具体请求使用的报文可以让开发人员提供具体的报文,报文比较长在此省略;
- 对生成的订单通过调用相关SP和Sql语句直接批量操作完成订单的处理到已确认客户;
本次项目造数据的关键步骤为处理订单到已确认客户操作,主要涉及两个SP:xxx..sp1_xxx_firstdealorder和sp2_xxx_AutoConfirmClient,两个update操作;
具体LR11调用SP和Update操作的 脚本如下:
Action()
{ //数据库的连接有如下两种方式,目前测试环境连接测试库使用的都是第一种方式//
//////数据库访问连接///// windows 认证方式的连接登录///
lr_db_connect("StepName=DatabaseConnection",
"ConnectionString=Data Source=xxxdb.test.xx.com,55666;Integrated Security=SSPI;Initial Catalog=XXXOrderDB",
"ConnectionName=XXXOrderDB",
"ConnectionType=SQL",
LAST );
//////数据库访问连接///// SQL server认证方式的连接登录参照如下//
/* lr_db_connect("StepName=DatabaseConnection",
"ConnectionString=Data Source=192.168.1.2;Initial Catalog=DataBase;User ID=User_temp;Password=******", //访问数据库的用户名和密码
"ConnectionName=ATDataBase",
"ConnectionType=SQL",
LAST );
*/
///执行存储过程///
//模拟后台中点开始处理订单的sp操作
lr_db_executeSQLStatement("StepName=StartDeal",
"ConnectionName=XXXOrderDB",
"SQLStatement=exec XXXorderdb..sp1_XXX_firstdealorder"
" @orderid='{ID}',"
"@operator='mazj',"
"@ProcessType = 'NOR',"
"@CorpConfirmType = '',"
"@CorporationID = NULL,"
"@BOS=NULL",
"DatasetName=testDataset",
LAST );
///执行update ///
//更新RecordNo记录号//
lr_db_executeSQLStatement("StepName=UpdateRecord",
"ConnectionName=XXXOrderDB",
"SQLStatement=update XXXOrderDB.dbo.O_XXX set RecordNo='AA{Param}' where OrderID = {ID};",
"DatasetName=testDataset",
LAST );
//更新processstatus状态//
lr_db_executeSQLStatement("StepName=Updatestatus",
"ConnectionName=XXXOrderDB",
"SQLStatement=update XXXOrderDB.dbo.o_orders set processstatus = (processstatus | 1) where orderid={ID};",
"DatasetName=testDataset",
LAST );
///执行存储过程///
//模拟前台页面自动确认客户的sp//
lr_db_executeSQLStatement("StepName=orderConfirm",
"ConnectionName=XXXOrderDB",
"SQLStatement=sp2_XXX_AutoConfirmClient @OrderID ='{ID}', @Eid='System'",
"DatasetName=testDataset",
LAST );
//关闭连接//
lr_db_disconnect("StepName=Disconnect",
"ConnectionName=XXXOrderDB",
LAST );
return 0;
}
脚本设计好后放入LR的Controller场景中即可对批量的订单使用多线程的方式快速的把所有的订单处理到已确认客户的状态,比起人工操作迅速千倍;
如果lr_db_executeSQLStatement()执行的是查询操作并有dataset的结果返回的话,需要在dataset使用后进行内存释放,处理查询结果集的方法:lr_db_dataset_action();方法中的Action取值为reset时表示重置指针返回第一行,取值为remove表示释放dataset占用的内存,取值print表示在回放日志中打印;
除了使用这种方式来使用LR快速制造数据外,LR11对数据库这种操作更多的是应用在对SQL语句和SP存储过程的性能测试验证方面,可以通过这种方式直接测试SQL和SP存储过程的性能。
(文中部分敏感内容的表述使用XXX代替)