本交易为POS消费交易,报文类型为8583通讯报文,一般在银联通讯方面,金融交易方面用的比较多,如下为手动编写我们的测试脚本,并非录制而成,在此类直接与接口交互的性能测试项目中,经常会用到报文组装、拼接等工作,这里记录想整个数据的解析拼装过程以及我们测试思路
一:pos交易(8583协议)报文处理部分:
必须熟悉不同交易每个域的划分及每个域的数据长度,具体详细报文结构不做具体描述,每个报文有其具体规则,解析出每个域的数据
如下报文全部调试成功,另外需要对卡号,交易金额,流水号等数据进行处理,需要对MAC校验进行额外处理,具体不详述
①:发送报文获取:
Ø 获取到POS机消费报文,我这里每个域使用不同颜色区分开来(部分数据涉及公司私密,已做小部分更改,不过不影响报文的分析及阅读):
011F60000400006031003113060200702006c420c09a11166214441000010111000000000000000001003394071000110012cdf43eb3cb55b41a257c51c26eaef80138jnehnd98adac160195349a7127e126f03030303030363232383433313030303534313130303233313536d8uejeiuw28ce80526100000000000000983i3u33urhftb2fe53af9d5d9f2701809f1111111111111198987a0100000981382e4270769f3704ac8cbd619f3602036f950500000000009a031610199c01009f02060000000000015f2a02015682027c009f1a0201569f03060000000000009f3303e0e1c89f34030000009f3501229f1e0830319999999996358408a00000030oieieieief090200309f4104000011940014220000300006013437393435353436
注:在这里每个域区分开来后,就可以直接把每个域的数据提取出来,在Loadrunner中进行16进制转换。
②:报文解析(解析出每个域的数据):
Ø 对上面的报文进行bitmap解析(使用bitmap工具解析每个域数据),上面消费报文解析出的每个域的数据如下所示:
报文长度:011F
TPDU: 6000040000
报文头: 603100311306
MSGID: 0200 --消息类型,0200指消费交易
BITMAP: 702006c420c09a11 --位图,确认后面所有使用的域,记录哪些域会出现在报文中
Bit 2: 6214441000010111 --主账号
Bit 3: 000000 --处理代码,交易类型,000000代表消费,n6
Bit 4: 000000000001 --交易金额,单位为分,n12
Bit 11: 003394 --交易流水号,n6
Bit 22: 071 --服务器输入方式 ,n3
Bit 23: 011 --卡顺序号,n3
Bit 25: 00 --服务点条件码,n2
Bit 26: 12 --售卡方业务代码,
Bit 30: cdf43eb3cb55b41a257c51c26eaef801 --原始金额,n24
Bit 35: 38jnehnd98adac160195349a7127e126f0--第2磁道数据,z37
Bit 41: 00000622 --终端代码,ANS8
Bit 42: 843100054110023 --终端标示,ANS15
Bit 49: 156 --货币代码,n3,156为人民币
Bit 52: d8uejeiuw28ce805--用户密码(PIN Data),B64
Bit 53: 2610000000000000 --安全控制信息,n16
Bit 55:
0983i3u33urhftb2fe53af9d5d9f2701809f1111111111111198987a0100000981382e4270769f3704ac8cbd619f3602036f950500000000009a031610199c01009f02060000000000015f2a02015682027c009f1a0201569f03060000000000009f3303e0e1c89f34030000009f3501229f1e0830319999999996358408a00000030oieieieief090200309f410400001194
--IC卡数据域
Bit 60: 22000030000601 --附加数据,自定义域
Bit 64: 3437393435353436 --报文鉴别代码字段
③:报文解析后对报文进行16进制转换处理(域位数不够需要注意域的左对齐右对齐以及左补0右补0):
Ø 因为loadrunner中需要识别16进制的数据进行socket报文发送,所以需要把如上消费报文转换为16进制进行发送,发送16进制格式为:每两位前面加转义符“\x”来代表16进制,上面消费报文转换后的16进制报文如下(每个域加上双引号且换行):
"\x01\x1F" //报文长度,必须加上,否则报文无法发送成功
"\x60\x00\x04\x00\x00" //TPDU
"\x60\x31\x00\x31\x13\x06" //报文头
"\x02\x00" //MSGID,指余额查询、消费等
"\x70\x20\x06\xc4\x20\xc0\x9a\x11"//bitmap:确认后面报文使用的域
"\x16\x62\x14\x44\x10\x00\x01\x01\x11"//bit2,主账号16位卡号,前面加长度16
"\x00\x00\x00" //bit3,处理码,直接转换16进制
"\x00\x00\x00\x00\x00\x01" //bit4,交易金额,直接转换16进制
"\x00\x33\x94" //bit11,交易流水号, 直接转换16进制
"\x07\x10" //bit22,服务点输入方式,原始数据为071,差一位,右补0
"\x00\x11" //bit23,原始数据011,差一位,左补0
"\x00" //bit25,直接转16进制
"\x12" //bit26,直接转16进制
"\xcd\xf4\x3e\xb3\xcb\x55\xb4\x1a\x25\x7c\x51\xc2\x6e\xae\xf8\x01" //bit30,直接转16进制
"\x32\xc4\x0e\x02\x19\xad\xac\x16\x01\x95\x34\x9a\x71\x27\xe1\x26\xf0"//bit35,直接转16进制
"\x30\x30\x30\x30\x30\x36\x32\x32" //bit41,原始数据00000622,每个数字前加上数字3
"\x38\x34\x33\x31\x30\x30\x30\x35\x34\x31\x31\x30\x30\x32\x33" //bit42,原始数据843100054110023,每个数字前加上数字3
"\x31\x35\x36" //bit49,原始数据156,每个数字前加上数字3
"\xd5\x11\x3d\x76\xf2\x8c\xe8\x05" //bit62,直接转16进制
"\x26\x10\x00\x00\x00\x00\x00\x00" //bit53,直接转16进制
"\x01\x45\x9f\x26\x08\x29\xfa\xb2\xfe\x53\xaf\x9d\x5d\x9f\x27\x01\x80\x9f\x10\x13\x07\x00\x01\x03\xa0\x00\x00\x01\x0a\x01\x00\x00\x09\x81\x38\x2e\x42\x70\x76\x9f\x37\x04\xac\x8c\xbd\x61\x9f\x36\x02\x03\x6f\x95\x05\x00\x00\x00\x00\x00\x9a\x03\x16\x10\x19\x9c\x01\x00\x9f\x02\x06\x00\x00\x00\x00\x00\x01\x5f\x2a\x02\x01\x56\x82\x02\x7c\x00\x9f\x1a\x02\x01\x56\x9f\x03\x06\x00\x00\x00\x00\x00\x00\x9f\x33\x03\xe0\xe1\xc8\x9f\x34\x03\x00\x00\x00\x9f\x35\x01\x22\x9f\x1e\x08\x30\x31\x33\x30\x30\x30\x36\x35\x84\x08\xa0\x00\x00\x03\x33\x01\x01\x01\x9f\x09\x02\x00\x30\x9f\x41\x04\x00\x00\x11\x94" //bit55,直接转16进制
"\x00\x14\x22\x00\x00\x30\x00\x06\x01" //bit60,原始数据,22000030000601(14位长度),前面加0014标示数据长度
"\x34\x37\x39\x34\x35\x35\x34\x36" //bit64,直接转16进制
二:loadrunner脚本开发及数据塞入:
①:测试协议选择:
Ø 开发测试脚本选择Windowssocets协议
Ø vuser_init、vuser_end部分默认,不用更改,代码默认,主要在Action中开发测试脚本和在data.ws中传输数据到Action的代码中,具体操作如下:
Ø
②:Action中编写socket性能测试脚本:
脚本减少逻辑换算,比如脚本中勿用对返回值的判断(直接后端服务器判断数据正确性或数据库验证数据正确性),比如十六进制的参数化在数据参数化中使用转义字符完成,无需额外写代码处理,最简代码如下:
#include"lrs.h"
Action()
{
lrs_startup(257); //初始化 Windows Sockets DLL
lrs_create_socket("socket0","TCP", "RemoteHost=192.180.80.87:6667", LrsLastArg);//创建连接目标服务器ip及端口
lr_rendezvous("联机消费");//设置集合点
lr_start_transaction("联机消费");//设置事物开始
lrs_send("socket0","buf0",LrsLastArg); //把数据塞入buf0中,发送data.ws中的数据
lrs_receive ("socket0","buf1",LrsLastArg);//接受服务器返回的数据
lr_end_transaction("联机消费", LR_AUTO);//事物结束
lrs_close_socket("socket0");//关闭连接
lrs_cleanup(); //终止Windows套接字 DLL 的使用
return 0;
}
③:data.ws中做传输数据处理:
把处理好的16进制的报文放入data.ws中,格式如下:
;WSRData2 1
send buf0 287 // 发送给buf0的数据长度。
"\x01\x1F"//报文长度,必须加上,否则报文无法发送成功
"\x60\x00\x04\x00\x00"
"\x60\x31\x00\x31\x13\x06"
"\x02\x00"
"\x70\x20\x06\xc4\x20\xc0\x9a\x11"
"\x16\x62\x14\x44\x10\x00\x01\x01\x11"//16位卡号,前面加16
"\x00\x00\x00"
"\x00\x00\x00\x00\x00\x01"
"\x01\x00\x08"//交易流水号,每个交易流水号不能重复,须参数化
"\x07\x10"
"\x00\x11"
"\x00"
"\x12"
"\xcd\xf4\x3e\xb3\xcb\x55\xb4\x1a\x25\x7c\x51\xc2\x6e\xae\xf8\x01"
"\x32\xc4\x0e\x02\x19\xad\xac\x16\x01\x95\x34\x9a\x71\x27\xe1\x26\xf0"
"\x30\x30\x30\x30\x30\x36\x32\x32"
"\x38\x34\x33\x31\x30\x30\x30\x35\x34\x31\x31\x30\x30\x32\x33"
"\x31\x35\x36"
"\xd5\x11\x3d\x76\xf2\x8c\xe8\x05"
"\x26\x10\x00\x00\x00\x00\x00\x00"
"\x01\x45\x9f\x26\x08\x29\xfa\xb2\xfe\x53\xaf\x9d\x5d\x9f\x27\x01\x80\x9f\x10\x13\x07\x00\x01\x03\xa0\x00\x00\x01\x0a\x01\x00\x00\x09\x81\x38\x2e\x42\x70\x76\x9f\x37\x04\xac\x8c\xbd\x61\x9f\x36\x02\x03\x6f\x95\x05\x00\x00\x00\x00\x00\x9a\x03\x16\x10\x19\x9c\x01\x00\x9f\x02\x06\x00\x00\x00\x00\x00\x01\x5f\x2a\x02\x01\x56\x82\x02\x7c\x00\x9f\x1a\x02\x01\x56\x9f\x03\x06\x00\x00\x00\x00\x00\x00\x9f\x33\x03\xe0\xe1\xc8\x9f\x34\x03\x00\x00\x00\x9f\x35\x01\x22\x9f\x1e\x08\x30\x31\x33\x30\x30\x30\x36\x35\x84\x08\xa0\x00\x00\x03\x33\x01\x01\x01\x9f\x09\x02\x00\x30\x9f\x41\x04\x00\x00\x11\x94"
"\x00\x14\x22\x00\x00\x30\x00\x06\x01"
"\x34\x37\x39\x34\x35\x35\x34\x36"
recv buf1 303 //经过验证,返回的数据无需正确也能够正常跑通脚本
-1
如图验证调试脚本返回信息正确:
如图验证数据库交易数据正确:
脚本调试成功,根据具测试策略,进行加压并监控整个业务的(响应时间、TPS、加密机性能、支付服务器性能、应用服务器性能、oracle服务器性能等...)
经过压测,本系统存在3个性能问题:
1.increasemaxThreads问题(已优化解决)
2.加密机数据丢包问题(已优化解决))
3.sql执行超时,无法响应问题(未来两年内生产用户大不了压测出问题时候的并发数,处理优先级降低)
以上问题的定位调优另外单独整理总结,详细信息可见“性能问题总结及经验汇总.docx”文档