loadrunner socket协议问题归纳(5)
获取服务器的返回值,可以用web_reg_save_param函数,该参数最好放到:
语法:
int web_reg_save_param(const char *ParamName, <list of Attributes>, LAST);
参数说明:

o ParamName: 存放得到的动态内容的参数名称 o list of Attributes: 其它属性,包括:Notfound, LB, RB, RelFrameID, Search, ORD, SaveOffset, Convert, SaveLen。属性值不分大小写 o Notfound: 当在返回信息中找不到要找的内容时应该怎么处理 o Notfound=error: 当在返回信息中找不到要找的内容时,发出一个错误讯息。这是缺省值。 o Notfound=warning: 当在返回信息中找不到要找的内容时,只发出警告,脚本也会继续执行下去不会中断。 o LB( Left Boundary ) : 返回信息的左边界字串。该属性必须有,并且区分大小写。 o RB( Right Boundary ): 返回信息的右边界字串。该属性必须有,并且区分大小写。 o RelFrameID: 相对于URL而言,欲查找的网页的Frame。此属性质可以是All或是数字,该属性可有可无。 o Search : 返回信息的查找范围。可以是Headers,Body,Noresource,All(缺省)。该属性质可有可无。 o ORD : 说明第几次出现的左边界子串的匹配项才是需要的内容。该属性可有可无,缺省值是1。如为All,则将所有找到的内容储存起来。 o SaveOffset : 当找到匹配项后,从第几个字元开始存储到参数中。该属性不能为负数,缺省值为0。 o SaveLen :当找到匹配项后,偏移量之后的几个字元存储到参数中。缺省值是-1,表示一直到结尾的整个字串都存入参数。

要获取返回值,那么有2种方法:
第一种方法是通过 SaveOffset 来获取指定的值,这个方法适用于返回的值或是格式比较固定,不会有什么变动,比如有些接口,返回1,表示已经响应成功,那么可以用这个方法来获取。或是返回来的字段顺序都不变,都可以使用该方法。但是当返回值的顺序有变,而我们要取指定的字段值时,就不适用了,在第二种方法再描述。
第一个接口请求后,服务器返回值:
{"orderId":"9854578067073400832","message":"创建订单成功","status":100}
因为返回的数据格式比较固定,数据的顺序很少变化,那么可以用如下的函数来获取:

web_reg_save_param("orderId",
"LB=",
"RB=",
"ORD=1",
"SaveOffset=1",
"SaveLen=31", //获取运行结果里的orderId "orderId":"9854578067073400832"
"Search=Body",LAST);

这种方法不是很灵活,很容易报错,当返回值有变动时或是返回值的顺序有变动,必须要重新修改,否则运行还是会报错。用第二种方法,通过取返回值的边界值,达到目的:

web_reg_save_param("orderId",
"LB=orderId",
"RB=message",
"ORD=1",
"SaveLen=23",
"Search=Body",LAST);

会发现"SaveLen"取的值不一样,因为第一种方法取的值是"orderId":"9854578067073400832",第二种方法,取的值是":"9854578067073400832"
这里只需要传的参数修改一下就可以了,如我在用第一种方法时,用如下的参数:
{"account":"13900001111","posId":"N9NL10255029","couponMoney":0,"couponInfo":"","payMoney":0.01,"barcode":"130122475934385558","channelId":"WX",
如果用第二种方法,用如下的参数:
{"account":"13900001111","posId":"N9NL10255029","couponMoney":0,"couponInfo":"","payMoney":0.01,"barcode":"130122475934385558","channelId":"WX","orderId
取得返回值,用如下的数据进行拼接:
lr_save_string(lr_eval_string("{NewParam}{orderId}}"),"orderId2");
因为代码里面的4接口是业务的一个部分,但在测试接口的时候,可以不用管,所以只是放在代码里面尽可能的模拟业务而已,实际在本代码中,没有什么用处,是5接口创建订单号orderId给第18接口,并作为第18个接口的参数进行请求,完整的代码如下:

Action()
{
/*
18接口的参数
{"account":"13900001111","posId":"N9NL10255029","couponMoney":0,"couponInfo":"","payMoney":0.01,"barcode":"130122475934385558","channelId":"WX",
{"account":"13900001111","posId":"N9NL10255029","couponMoney":0,"couponInfo":"","payMoney":0.01,"barcode":"130122475934385558","channelId":"WX","orderId
5接口的参数
{"account": 13900001111,"payMoney":0.01} 4接口的参数
{"account": 13900001111}
*/ //18扫描支付接口的前半部分参数
char * tmpParam = lr_eval_string("{NewParam}"); //5创建订单接口的参数
char * tmpParam2 = lr_eval_string("{NewParam_2}"); //4获取商户开通支付方式
char * tmpParam3 = lr_eval_string("{NewParam_1}"); web_set_proxy("10.16.1.151:180"); //设置请求头,没有这个,请求会不认得 web_custom_request该函数的json请求 web_add_header("content-type","application/json"); lr_save_string(lr_eval_string("{NewParam_1}"),"tmpParam3"); web_custom_request("4","URL=http://10.16.1.151:180/getMerchantPayType","Body={tmpParam3}","Method=POST","mode=HTML",LAST); web_add_header("content-type","application/json");
//把5创建订单的参数,获取过来,赋值给tmpParam2 lr_save_string(lr_eval_string("{NewParam_2}"),"tmpParam2");//获取5接口返回的参数,指定的参数SaveOffset=31,然后赋值给orderId
/*
web_reg_save_param("orderId",
"LB=",
"RB=",
"ORD=1",
"SaveOffset=1",//获取运行结果里的orderId 45
"SaveLen=31",
"Search=Body",LAST);
*/
//获取5接口返回的参数,指定的参数,然后赋值给orderId
web_reg_save_param("orderId",
"LB=orderId",
"RB=message",
"ORD=1",
"SaveLen=23",
"Search=Body",LAST); //5接口创建订单,向服务器请求 web_custom_request("5","URL=http://10.16.1.151:180/onlineOrder","Body={tmpParam2}","Method=POST","mode=HTML",LAST);
//返回的参数 {"orderId":"9854578277036064768","message":"创建订单成功","status":100}
//获取5接口返回的参数orderId赋值给orderId lr_save_string(lr_eval_string("{orderId}"),"orderId"); //打印获取服务器回复指定的参数 lr_output_message(lr_eval_string("{orderId}")); //参数并接,赋值给orderId2,作为18扫描支付接口的参数 会发现这里有2个},参数里面因为少了一个},所以在参数后面补充} lr_save_string(lr_eval_string("{NewParam}{orderId}}"),"orderId2"); lr_output_message(lr_eval_string("===========:{orderId2}")); web_add_header("content-type","application/json"); //扫描支付接口请求 web_custom_request("18","URL=http://10.16.1.151:180/scanPay","Body={orderId2}","Method=POST","mode=HTML",LAST); return 0;
}
loadrunner socket协议问题归纳(5)的更多相关文章
- loadrunner socket协议问题归纳(6)
首先让我们先看一下loadrunner- winsock 函数 一览表: lrs_accept_connection 接受侦听套接字连接 lrs_close_socket 关闭打开的套接字 ...
- loadrunner socket协议问题归纳(3)
摘要:通过实例讲解loadrunner中的socket协议性能测试的一种测试方法,如何不依赖loadrunner既定规则,自行控制收发数据包 关键词:Loadrunner,socket,自行控制,收发 ...
- loadrunner socket协议问题归纳(0)
一.概述 Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作. 二.socket概述 soc ...
- loadrunner socket协议问题归纳(1)
前段时间测了loadrunner直接发送报文到socket上的性能测试.在此,稍微回顾整理下. 与socket通讯,有两种方式,一种是建立长连接,建立后,不停的发送,接收.另外一种是建立短连接,建立连 ...
- loadrunner socket协议问题归纳(2)
编写步骤 1.建立与服务端的连接 rc=lrs_create_socket(“socket0”,”TCP”,”LocalHost=0”,”RemoteHost=127.0.0.1:8808”,LrsL ...
- loadrunner socket协议问题归纳(4)---buffer接收变长和定长的数据
测试场景:聊天系统 用户登录后,要先向服务器发送用户名,然后可以发送聊天信息,同时也可以接受聊天信息. 如果接受的字符为定长时,可以设定接受长度.recv buf2 66 #include " ...
- Loadrunner socket协议lrs_receive函数接收到返回数据包 仍然等待服务器返回--解决
前段时间在使用loadrunner socket协议发送数据包到到服务器,使用lrs_receive接收服务器应答数据包,已经接收到数据包,但LR仍然在等待服务器端返回,而且日志打印显示每次接收返回都 ...
- LoadRunner编写Socket协议脚本方法
本文主要介绍使用LoadRunner手工编写Windows Socket协议测试脚本的方法. 通过LoadRunner编写Windows Socket协议测试脚本,总体说来,比较简单.就像把大象放进冰 ...
- Loadrunner 中socket协议RecvBuffer接收到数据长度为空
socket通讯,有两种方式,一种是建立长连接(TCP),建立后,不停的发送,接收.另外一种是建立短连接(UDP),建立连接,发送报文,接收响应,关闭连接.两种方式 server的开销不同. 今天出现 ...
随机推荐
- mysql/mariadb学习记录——连接查询(JOIN)
//本文使用的数据表格//persons表中id_p为主键//orders表中id_o为主键,id_p为外键参考persons表中的id_p mysql> select * from perso ...
- sublime text3 插件安装方法
1.按Ctrl+`(ESC下方的键)调出console粘贴以下代码到底部命令行并回车 2.输入:import urllib.request,os,hashlib; h = '6f4c264a24d93 ...
- 100-Days-Of-ML-Code 评注版(Day 3)
Day3_Multiple_Linear_Regression(多元线性回归) 本文引用自 Multiple_Linear_Regression, 对其中内容进行了评注与补充说明. 回归分析是一种预测 ...
- keil编译运行错误,缺少error:#5:#include "core_cm3.h"
用Keil vision5编译时出现以下错误:error: #5: cannot open source input file "core_cm3.h": No such fi ...
- PTA(BasicLevel)-1012 数字分类
一 题目描述 给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: = 能被 5 整除的数字中所有偶数的和: = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即 ...
- 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(1)
参考如下文档: 传送门:http://www.stm32cube.com/article/128 如果链接不存在的话,下载我截屏好的图: 传送门:https://pan.baidu.com/s/1NC ...
- freeradius+xl2tp+mysql整合
freeradius+xl2tp+mysql整合 搭了5个小时,可以说是入门到精通了.首先请确认你已经搭建好L2TP,并可以正常使用. 如何在Ubuntu下配置L2TP VPN L2TP使用radi ...
- 20155234 2016-2017-2第十周《Java学习笔记》学习总结
20155234第十周<Java学习笔记>学习总结 教材学习内容总结 网络编程 在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定 ...
- 20155318 2016-2017-2 《Java程序设计》第一周学习总结
20155318 2016-2017-2 <Java程序设计>第一周学习总结 教材学习内容总结 上周总结 上周学习了一些大学的学习方法,比如知识分为为三种:元知识.软知识和硬知识,讲述技能 ...
- C语言复习20170826
数组 先定义,再初始化,最后使用. 访问数组中的元素可以采用数组名加下标的方式,下标是从0开始,c并不检查数组下标是否越界,所以在访问数组中的元素时需要注意,需要对数组下标做判断,防止访问数组越界. ...