Socket协议Loadrunner脚本+8583报文解析及组装

本交易为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,原始数据,2200003000060114位长度),前面加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”文档

 

阅读更多

更多精彩内容