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

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

 
使用步骤:
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. SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践

    一. 前言 日志对于一个程序的重要程度不用过多的言语修饰,本篇将以实战的方式讲述开源微服务全栈项目 有来商城 是如何整合当下主流日志解决方案 ELK +Filebeat . 话不多说,先看实现的效果图 ...

  2. 直接取PHP二维数组里面的值

    具体是这样的,如下一个二维数组,是从库中读取出来的. $user = array( 0 => array( 'id'    => 1, 'name'  => '张三', 'email ...

  3. 分享一个设计logo的网站

    https://editor.freelogodesign.org/

  4. 10分钟教你使用Picgo+GitHub+ jsDelivr搭建CDN加速免费图床

    前言 经常写Markdown或者博客的同学,肯定都要用到图床.图床是什么呢?其实相当于一个存储图片的网站,类似百度云这样,不过上传图片到图床后可以直接通过外链进行访问. 比如把本地一张a.jpg上传到 ...

  5. 揭秘:懂Python的测试员薪资到底有多高?

    前言 面试的时候,面试官经常会问:会Python吗?有在工作中写过项目吗?会搭建自己的框架吗?我:恩,我只简单写过一些demo. 有时候问一些简单的Python,一问就会懵.比如:json和字典有什么 ...

  6. Spring,IOC源码分析

    有错勿喷 1.首先是Spring,IOC的基本概念 IOC是一个容器 容器启动的时候创建所有单实例对象 我们可以直接从容器中获取到这个对象 2.调试流程 ioc容器的启动过程?启动期间都做了什么(什么 ...

  7. Go的Select

    Go 的通道有两种操作方式,一种是带 range 子句的 for 语句,另一种则是 select 语句,它是专门为了操作通道而存在的.这里主要介绍 select 的用法. 一.select的语法 se ...

  8. captcha_trainer 验证码识别-训练 使用记录

    captcha_trainer 验证码识别-训练 使用记录 在爬数据的时候,网站出现了验证码,那么我们就得去识别验证码了.目前有两种方案 接入打码平台(花钱,慢) 自己训练(费时,需要GPU环境,快) ...

  9. 3.3 Execution Flow of a DDD Based Application 基于DDD的应用程序执行流程

    3.3 Execution Flow of a DDD Based Application 基于DDD的应用程序执行流程 The figure below shows a typical reques ...

  10. HttpClient.PatchAsJsonAsync - dotnet/runtime 项目贡献小记

    TL;DR 迫于 PatchAsJsonAsync 方法缺失,我给 dotnet/runtime 项目贡献了相关的 API,可惜要到 .NET7 才能用上. https://github.com/do ...