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的开销不同. 今天出现 ...
随机推荐
- 【js】 ajax 与 axios 区别
ajax 与 axios区别 Ajax: Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发 ...
- webstorm 常用的快捷键
1. ctrl + shift + n: 打开工程中的文件,目的是打开当前工程下任意目录的文件.2. ctrl + j: 输出模板3. ctrl + b: 跳到变量申明处4. ctrl + alt + ...
- [示例] Firemonkey 面包屑导航
原码下载:[示例]Firemonkey面包屑导航_Aone.zip 效果:(以下效果不用写一行代码)
- 快速认识LinkIt 7697开发板
LinkIt 7697是一款多功能且价格亲民的开发板,可用来连接网络或你的各项装置,同时提供Wi-Fi及蓝芽两种联机功能.此开发板采用MediaTek MT7697芯片,比起其他类似的Wi-Fi/蓝芽 ...
- tensorflow 模型权重导出
tensorflow在保存权重模型时多使用tf.train.Saver().save 函数进行权重保存,保存的ckpt文件无法直接打开,不利于将模型权重导入到其他框架使用(如Caffe.Keras等) ...
- Pytorch之Variable求导机制
自动求导机制是pytorch中非常重要的性质,免去了手动计算导数,为构建模型节省了时间.下面介绍自动求导机制的基本用法. #自动求导机制 import torch from torch.autogra ...
- 20155224 2016-2017-2 《Java程序设计》第4周学习总结
20155224 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 第六章主要学习了子类与父类的继承. 先定义一个程序,另一程序可继承他 如: publ ...
- 20155322 2017-2018-1《信息安全系统设计》第十周 课下作业-IPC
20155322 2017-2018-1<信息安全系统设计>课下作业-IPC 作业内容 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接. 共享内存 管 ...
- Nginx入门篇(一)之Nginx介绍
1.简介 Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 服务器. Nginx 是由 Igor Sysoe ...
- DSP5509项目之用FFT识别钢琴音调(4)之麦克风输入和Line in输入
1. 麦克风输入需要修改的内容,之前的版本是LINE IN的输入.实现功能,检测麦克风的输入,并且同时在耳机里面播放. #include <csl.h> #include <csl_ ...