关联:服务器返回给客户端一些动态变化的值,客户端用这些值去访问服务器,不能把这些值写死在脚本里面,而应该存放在一个变量里面。

  在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,以变量的形式替换录制时的静态值,从而向服务器发出正确的请求,这种动态获得服务器响应内容的方法被称作关联。

 
使用步骤:
1.录制脚本,选择协议
 
2.脚本包含三个部分:
1)vuser_init 只执行一次,用于录制登陆等功能
2)Action 中间的具体逻辑
3)vuser_end 登出功能
 
3.设置关联
脚本录制完之后,会记录当次操作的数据记录,包括请求的url以及请求的数据和返回值等。当我们再次回放执行脚本时,所用到的数据仍然是第一次执行记录的脚本数据,很多请求数据都已经写死在脚本中了。例如我有一个请求,需要提交表单中的数据进入订单,我点击提交之后会先向订单表插入一条数据,此时会返回一个订单id,成功之后会再向订单详情里插入一条数据,该条数据会关联订单表返回的订单id。此时我们要重复回放脚本模拟多用户提交表单的话,脚本里记录的永远是第一次录制时的订单id,此时是无法形成多条订单的,所以我们需要动态的获取每次插入表单时后台服务器返回给我们的订单id,然后再插入订单详情中。
具体做法:
1)创建脚本File-new script & solution,选择协议,输入url,选择浏览器,
 
2)先按流程录制脚本,录制过程中可在不同场景选择不同的录制目标选择录制到init还是Action中
3)录制完之后需要点击停止会自动生成脚本,然后进行回放,检查录制的脚本是否成功。
4) 点击“运行时设置Runtime Settings”弹出“运行时设置”窗口,勾选“扩展日志”下的“参数替换”和“服务器返回的数据”。
 
5)下面两个请求就是我点击提交表单按钮后发出的两个请求:
web_custom_request ( "sendOrderSend" ,  
         "URL=http://127.0.0.1:19002/mecv-manager/custservice/sendOrderSend" ,  
         "Method=POST" ,  
         "Resource=0" ,  
         "RecContentType=application/json" ,  
         "Referer=http://127.0.0.1:19002/mecv-manager/custservice/orderSend" ,  
         "Snapshot=t45.inf" ,  
         "Mode=HTML" ,  
         "EncType=application/json" ,  
         "BodyBinary={\"productType\":\"01\",\"custId\":\"9F7D7E8BFD6D11E5A364ECF4BBC07A10\",\"sendAddress\":\"Caffe Beans\",\"sendContact\":\"xiaoxiao\",\"sendTel\":\"18661628193\",\"sendCoordinatesXY\":\"120.468750,36.103391,0532,370212\",\"dal\":[{\"deliveryAddress\":\"\\xE9\\x9D\\x92\\xE5\\xB2\\x9B\\xE5\\xB8\\x82\\xE7\\xAC\\xAC\\xE5\\x85\\xAB\\xE4\\xBA\\xBA\\xE6\\xB0\\x91\\xE5\\x8C\\xBB\\xE9\\x99\\xA2\",\"contact\":\"dada\",\"tel\":\"18661628192\",\"coordinatesXY\":\"120.419066,36.159446,0532,370213\"}]" 
        ",\"goodsDesc\":\"\\xE6\\xB4\\x97\\xE8\\xA1\\xA3\\xE6\\x9C\\xBA\",\"goodsAmount\":\"1\",\"servicesId\":\"\",\"payType\":\"02\",\"carriageStructure\":\"\",\"confCustId\":\"D5820BEDFFC711E5A364ECF4BBC07A10\",\"yclx\":\"1\",\"remarks\":\"\\xE6\\xB5\\x8B\\xE8\\xAF\\x95\"}" ,  
         LAST ); 

BodyBinary:提交的表单数据 

下面这个请求是表单提交成功后重新发起另外一个请求,将订单详情插入详情表,value中就是从上一个请求获得的服务端返回的数据,里面包含一个orderId属性。这部分数据是每次请求之后都会发生变化的数据,所以不能在下面的脚本中写死,需要通过关联动态的获取服务器的返回值然后替换掉这部分写死的内容。 
     web_submit_data ( "invokePost" , 
         "Action=http://127.0.0.1:19002/mecv-manager/custservice/invokePost" , 
         "Method=POST" , 
         "Referer=http://127.0.0.1:19002/mecv-manager/custservice/orderSend" , 
         "Snapshot=t46.inf" , 
         "Mode=HTML" , 
         ITEMDATA , 
         "Name=json" ,  "Value={\"body\":{\"appreContent\":\"\",\"carsStructure\":\"\",\"counts\":\"1\",\"deliveryAddress\":\"Caffe Beans\",\"deliveryX\":\"120.468750\",\"deliveryY\":\"36.103391\",\"distance\":\"9402\",\"fetchTime\":\"2016-07-02 09:30:00\",\"oType\":\"01\",\"orderDriverPrice\":\"1000\",\"orderId\":\"{orderId}\",\"orderTotalPrice\":\"{orderAmounts}\",\"orderType\":\"1\",\"packageId\":\"D5820BEDFFC711E5A364ECF4BBC07A10\",\"takeType\":\"01\",\"trade\":[{\"receiveAddress\":\"闈掑矝甯傜鍏汉姘戝尰闄\xA2\",\"receiveX\":\"120.419066\",\"receiveY\":\"36.159446\"}],\"volume\":\"4000\"},\"header\":{\"messageID\":\"201607020930490000000002\",\"pageEndIndex\":0,\"pageStartIndex\":0,\"region\":\"370212\",\"resCode\":0,\"sign\":\"4452d82b880baae8893d4992f8175200\",\"timeStamp\":\"20160702093049\",\"transactionType\":2008}}" ,  ENDITEM, 
         LAST ); 
 
如何替换:
在第一个请求前面右键--》insert-->new setp添加关联函数 web_reg_save_param,该函数自动获取二次回访时程序中动态发生变化的部分,我们可以从变化的部分中通过定义边界截取我们想要的内容:
在“添加步骤”的“查找函数”中输入“web_reg_save_param”,点击“确定”按钮。 
在“将数据保存到参数中”,填写“参数名”,不写“左边界”和“右边界”,因为不知道左右边界,勾选“实例”、“搜索范围”、“忽略重定向”。点击确定按钮。同时如果不确定发生不同的地方是什么样可以将搜索范围选择All.
 
重新执行回放,在回放日志中查找orderId:
 
所有的动态变化的数据都会作为每次运行的不同之处显示在orderId的值内,假设我们可以将左边界定为:
"LB=\"obj\":" , 这样系统就会自动为我们过滤出obj的值,将上面截图中obj后面的整个对象作为orderId的值(orderId在上面截图中json字符串的后面,本例没有截出来,就拿‘obj’作为例子,如果相处orderId的值就将左边界定义为"LB=\"orderId\":",).
找到左边界之后再次修改上面的关联函数,添加左边界:
     web_reg_save_param ( "orderId" ,//次处的名字只是作为一个变量,名字随便取,接受所有二次回放时数据上发生不同的地方 
         "LB=\"obj\":" , 
         "RB=" , 
         "Ord=1" , 
         "Search=Body" , 
         "IgnoreRedirections=Yes" , 
         LAST ); 
 
然后将第二个请求中的  "Name=json"的value改为value="{orderId}",这样就会将服务器返回的值整体替换掉第二个函数中的value值,实现我们在第二次请求服务器时传入动态数据的目的。
改完之后两次请求的完整脚本:
web_reg_save_param ( "orderId" , 
         "LB=\"obj\":" , 
         "RB=" , 
         "Ord=1" , 
         "Search=Body" , 
         "IgnoreRedirections=Yes" , 
         LAST ); 

     web_custom_request ( "sendOrderSend" ,   
         "URL=http://127.0.0.1:19002/mecv-manager/custservice/sendOrderSend" ,   
         "Method=POST" ,   
         "Resource=0" ,   
         "RecContentType=application/json" ,   
         "Referer=http://127.0.0.1:19002/mecv-manager/custservice/orderSend" ,   
         "Snapshot=t45.inf" ,   
         "Mode=HTML" ,   
         "EncType=application/json" ,   
         "BodyBinary={\"productType\":\"01\",\"custId\":\"9F7D7E8BFD6D11E5A364ECF4BBC07A10\",\"sendAddress\":\"Caffe Beans\",\"sendContact\":\"xiaoxiao\",\"sendTel\":\"18661628193\",\"sendCoordinatesXY\":\"120.468750,36.103391,0532,370212\",\"dal\":[{\"deliveryAddress\":\"\\xE9\\x9D\\x92\\xE5\\xB2\\x9B\\xE5\\xB8\\x82\\xE7\\xAC\\xAC\\xE5\\x85\\xAB\\xE4\\xBA\\xBA\\xE6\\xB0\\x91\\xE5\\x8C\\xBB\\xE9\\x99\\xA2\",\"contact\":\"dada\",\"tel\":\"18661628192\",\"coordinatesXY\":\"120.419066,36.159446,0532,370213\"}]" 
        ",\"goodsDesc\":\"\\xE6\\xB4\\x97\\xE8\\xA1\\xA3\\xE6\\x9C\\xBA\",\"goodsAmount\":\"1\",\"servicesId\":\"\",\"payType\":\"02\",\"carriageStructure\":\"\",\"confCustId\":\"D5820BEDFFC711E5A364ECF4BBC07A10\",\"yclx\":\"1\",\"remarks\":\"\\xE6\\xB5\\x8B\\xE8\\xAF\\x95\"}" ,   
         LAST ); 

     web_submit_data ( "invokePost" , 
         "Action=http://123.56.13.75:19002/mecv-manager/custservice/invokePost" , 
         "Method=POST" , 
         "Referer=http://123.56.13.75:19002/mecv-manager/custservice/orderSend" , 
         "Snapshot=t46.inf" , 
         "Mode=HTML" , 
         ITEMDATA , 
         "Name=json" ,  " Value = {orderId} " ,   ENDITEM , 
         LAST ); 
 
参考:https://blog.csdn.net/zzrshuiwuhen/article/details/51811071

loadRunner12 设置关联 获取服务端动态数据的更多相关文章

  1. 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获

    项目开发中的一些注意事项以及技巧总结   1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...

  2. java版gRPC实战之六:客户端动态获取服务端地址

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. 客户端获取服务端自定义类数据 z

    客户端获取服务端自定义类数据 问题一:超时问题,在最后获取数据的时候突然提示服务超时,服务已断开 解决:配置文件添加: <bindings> <wsHttpBinding> & ...

  4. Diango之通过form表单向服务端发送数据

    通过form表单向服务端发送数据 表单元素 表单:form></form>表单用于向服务器传输数据.另外一种向服务端传输数据的方式为ajax. form属性: action:提交表单 ...

  5. java Socket Tcp示例三则(服务端处理数据、上传文件)

    示例一: package cn.itcast.net.p5.tcptest; import java.io.BufferedReader;import java.io.IOException;impo ...

  6. socket网络编程登录实现及多客户端和服务端的数据交互

    一.TCP/IP 客户端 package com.demo.entity; import java.io.Serializable; public class UserInfo implements ...

  7. asp.net获取服务端和客户端信息

    asp.net获取服务端和客户端信息 获取服务器名:Page.Server.ManchineName获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHostNam ...

  8. jsp获取服务端的访问信息

    获取服务端访问信息 public static String getUrl(HttpServletRequest request){ String url = ""; if(req ...

  9. JAVA Socket获取服务端信息

    1.Socket.getInetAddress(),获取服务端地址. 2.Socket.getPort(),获取服务端端口.

随机推荐

  1. Pycharm 使用问题一览

    1. I'm not sure if it is the problem of Pycharm or any other IDE. 需要从本地文件中导入文件,但总是出现波浪线,按ctril点进去发现是 ...

  2. Spotlight监控工具的使用

    Spotlight下载地址:http://spotlight-on-unix.software.informer.com/download/#downloading Spotlight是Quest公司 ...

  3. Jemter请求乱码解决方案

    1:jemeter查看结果树乱码 (1)在jmeter的bin目录下找到jmeter.properties这个文件,添加上 sampleresult.default.encoding=utf-8 (2 ...

  4. CF757F-Team Rocket Rises Again【最短路,DAG支配树】

    正题 题目链接:https://www.luogu.com.cn/problem/CF757F 题目大意 \(n\)个点\(m\)条边的一张无向图,求删除\(s\)以外的一个点改变\(s\)到最多点的 ...

  5. MySQL安装指导文档

    MySQL 是最流行的关系型数据库管理系统,可以在本地搭建一个mysql的环境,便于学习. windows7/windows10 5.7.26 安装mysql前环境准备工作 1) 要有Net fram ...

  6. 面试官一口气问了MySQL事务、锁和MVCC,我

    面试官:你是怎么理解InnoDB引擎中的事务的? 候选者:在我的理解下,事务可以使「一组操作」要么全部成功,要么全部失败 候选者:事务其目的是为了「保证数据最终的一致性」. 候选者:举个例子,我给你发 ...

  7. 10.8 location

    创建一个前台站点 server { listen 80; server_name www.nginx.com; locaiton / { root /var/www/html/www; } } 创建一 ...

  8. 在Windows Server 2012R2离线安装.net framework3.5

    最近新装了一台Windows Server 2012 R2的服务器,安装数据库时,出现了提示安装不上 .net framework3.5的情况,经过网络上多次的资料查找及反复试验终于找到了一个可以解决 ...

  9. 利用caffe.proto生成caffe.pb.h

    完全按照博文来就好了:http://blog.csdn.net/u012905422/article/details/52794693

  10. 5 大场景深度探讨何为 Serverless 架构模式?

    作者 | Hongqi 阿里云高级技术专家 究竟什么是 Serverless 架构? 什么是 Serverless 架构?按照 CNCF 对 Serverless 计算的定义,Serverless 架 ...