一、脚本关联技术 
  引入:
    打开WebTours首页,点击administration连接:
    具有大量管理项,LR为了模拟一些特效设置的选项,实际项目中不存在。
    -> 选择第三项:
      Set LOGIN form's action tag to an error page.
    -> 点击Update按钮 提交表单 生效
  目的:模拟一种效果

  录制脚本:day08\3login
    基于HTML: Options -> HTML-base script
    录制成功,回放失败!发现脚本:
    "Name=userSession", "Value=120939.455164034zccAicDpccfDHDctpQDQDf"
    User Session ID
    用户 会话 id
  凭经验:很可能脚本需要关联

  HTTP协议:简单的、无状态的协议
  简单:协议底层结构比较简单 头和主体
    header body
  无状态:一次请求,一次响应后,服务器默认不会记录用户的状态。
  但是有需求:需要记录用户的状态,比如登录在线、购物车

  记录用户状态的技术: Client(浏览器) <---> Server
    客户端 Web服务器
    Http Request ---->
    Http Response <----
  Session和Cookie有何区别?(Web开发规范)
    1)Session技术:将用户状态保存在服务器端
      定义:在服务器端保存用户状态的技术
      好比:店里为每个顾客准备的会员册,为不同用户分配id
      原理:用户在某一次向服务器发请求,服务器内存中为该用户创建一个Session,并为之分配一个Session id,通过响应返回给客户端;用户下一次发请求,需要携带该id,从而找到属于该用户的Session,从而记录用户的状态。

    2)Cookie技术:将用户状态保存在客户端
      定义:在客户端浏览器保存用户状态的技术
      好比:店里为顾客发放的消费记录次卡,用户自己保存
      原理:用户某一次向服务器发请求,服务器端程序可以在响应中通知客户端写Cookie(保存在客户端浏览器中的文件,形式:名称=值);用户后续发请求,也会携带Cookie信息与服务器交互,服务器后续还可再改Cookie。

      产生脚本问题的原因:
        Client端 Server端
      录制时正常的情况:脚本生成了
        Client 请求1 ----------> 创建Session 分配uid: 123
        响应1 <---------- 返回uid 123
        请求2 携带uid:123 -----> 找到Session空间
        响应2 <-----------------

      回放时错误的情况:按照脚本回放
        Client 请求1 ----------> 创建Session 分配uid: 456
        响应1 <----------
        请求2 携带uid: 123 ----> 找不到Session空间 出错!

      脚本中出现了动态数据,导致业务的不一致。

  1、产生问题的原因:录制时生成的脚本,记录了uid,是一个静态数据;而服务器端每次访问时会产生一个动态数据,脚本无法适应服务器端的变化,导致出错。
    脚本如何调试:将静态数据 改为 动态数据

  2、关联的概念:Correlation
    将脚本中某些写死的数据(硬编码),转变为服务器所发送的、动态的、每次都可能不一样的数据。
    --以不变应万变
    变量名 动态数据

  3、何时需要关联?
    录制时成功了,但是回放失败了,排除其它原因,比如:脚本语法、逻辑关系、参数化数据、网络连接、服务器状态;
    找到有力的证据:存在动态数据,就需要关联。

  4、关联的一般操作步骤:
    1)先找到脚本中的静态数据(需要关联、替换)
    2)将动态数据存入脚本中的一个参数中(LR变量)
    3)将静态数据使用该参数代替

    动态数据:每次运行可能不同的数据
    何时会出现不同?
      1) 手工操作一变 2) 录制一遍 3) 回放一遍

    操作:再录制和3login业务一样的脚本 3login1
    VuGen自带文本比较器:WDiff工具
    针对3login脚本的Action部分:
      Tools -> Compare with Script 和3login1比较
    现象:白底表示相同,黄底表示不同;
      大面积的黄底,不用太关注,和脚本结构、位置有关
      重点关注特别的字符串文本
    找到:"Name=userSession", "Value=xxx"
      xxx 就是动态数据 -- 需要关联
      和Session的原理有关

  5、如何找到动态数据 (进行关联的前提、关键!)
    1)原理:每次录制、回放都可能变动的值;
    2)录制两个业务流程一样的脚本,进行比对 WDiff工具
    3)哪些是?有时是一串无规律的字符串; 比如Session id
    有时是一串局部业务含义的字符串;
    比如日期、订单号、价格...

      123102.056379101zDDcAzcpAcfDHQQcpDHcVf
      123102.417901985zDDcAiApzcAiDDDDDHQQcptiDHcf

  4)哪些不是?
    坐标值、think time、检查点的函数和文本、更不是整段的请求。

  6、关联的类型
    1)手动关联(常用)
    2)自动关联(不够稳定,较少使用)

  7、手动关联的具体步骤:
    1)录制成功,回放失败,怀疑和动态数据有关;
    2)再录制一份脚本,进行比对,确定存在动态数据;(难点)
    3)找到第一次产生该动态数据的响应对应的相应请求;
    4)在相应请求之前写关联函数,将动态数据自动赋值给某变量(参数); web_reg_save_param(...) 函数
      reg 注册性函数 相应请求之前!
    5)将静态数据替换为该参数
      --以不变应万变

  8、如何找到相应请求?(目的:在之前写关联函数)
    1)拷贝脚本中适当长度的静态数据(太长会换行,太短造成大量重复),从Generation Log的第一行开始查找!!!
      120939.45516 ctrl + f
      找到第一次出现该动态数据的响应 日志中有响应id号
      根据该响应找到对应的请求 -- 相应请求
    2)拷贝适当长度的左右边界字符串,备用
      name=userSession value=120939.455164034zccAicDpccfDHDctpQDQDf>
    3)先向下慢慢翻找,找到与当前响应id相同id的请求,就是相应请求;(90%情况都在下方不远处)
    4)如果找不到,则回到原处,向上找到最靠近的一条请求;(次数id号很可能不同)
    5)响应:Response
      请求:Request 或 Event 事件 找寻的关键词
      在日志中找到请求:
        web_url( "Snapshot=t1.inf" );
        由于快照名时唯一的,作为线索
        找到脚本中快照为t1.inf的请求 -- 相应请求

        将拷贝的左右边界文本粘贴到相应请求之前,为了写关联函数。

    6)在相应请求之前,写关联函数,并将脚本中的静态数据全部都替换成函数中的参数(指代动态数据的值)。
      web_reg_save_param("uid", //参数名 LR变量名
      "LB=左边界文本", // Left 左
      "RB=右边界文本", // Right 右
      LAST);
      相应请求...

      原理:运行过程中,LR会根据左右边界,自动获取动态数据的值,将值赋给uid,后续脚本中可以使用{uid}表示动态数据。"Name=userSession", "Value={uid}", ENDITEM,
      编译 -> 回放 成功! 关联完成

  9、所谓相应请求:就是第一次产生动态数据响应对应的请求。目前脚本是基于HTML方式录制,结构简单、篇幅较短,目前就两个请求,第一个就是相应请求;
    以后的脚本可能基于URL方式,脚本篇幅较长,更需要按照以上流程仔细查找。

  10、问题:相应请求是否可能包含有动态数据?
    不可能。因为只有发出了相应请求,才第一次产生含有动态数据的响应,后续请求才可能携带。

    练习:脚本中打印出uid的值。 LR变量
      lr_output_message("Uid是:%s", lr_eval_string("{uid}"));

      Action.c(21): Uid是:{uid} 表示{uid}无效 时机不对
      只有在相应请求发送之后,uid才能有值!

      Uid是:120940.931551235zccAiQQpVzzzzzzHDHDcfpDQf
      Uid是:120940.934062373zccAiQQpcQfiDDDDDHDcfpDQfHHf

    技巧:把握好实用数据的时机;
      调试时,可以启用扩展日志,或采用打印技巧查看uid的状态。

归纳:如何找到相应请求?
  1)常规方法:根据静态数据信息,到Generation Log中第一行开始查找响应包的位置,根据响应id找到对应的请求(先向下,再向上),根据请求的快照名,定位出脚本中的请求。
  2)凭借经验、业务熟练程度,直接从脚本中根据动态数据进行定位。

二、关联的目的:让脚本能够适应动态数据的变化。
  之前设置的管理第3项,是一种特效,实际项目中不存在;
  实际项目中是否需要关联取决于服务器端软件设计、开发方式。比如服务器端的Session机制决定了更换用户uid就不同。

三、去除管理第3项,录制buy脚本,进行城市参数化
  去除第3项 -> Update
  思路:录制两个脚本,业务流程相同,城市不同,观察脚本的不同(WDiff)。因为一旦参数化,就会改变城市,如果中出现了动态数据,就需要关联。

    先录制buya脚本 从Denver到London
    在录制buyb脚本 从Denver到Paris

  比如:从Denver到London
    "Name=outboundFlight", "Value=020;338;04/25/2017"
    020;338;04/25/2017 就是动态数据
    020 航班号 338 价格 04/25/2017 日期
  特点:该动态数据具有一定业务含义
    这串信息,由服务器端程序根据实际业务操作组织生成的。
  结论:城市参数化后,脚本就需要关联。

    针对buya脚本,进行城市参数化:
  针对起始城市:
    Denver -> {fromcity} 使用参数代替
    技巧:ctrl+f搜索 F3继续搜索 都替换
    打开Parameter List: 设置数据 + 策略
    编辑fromcity.dat
    fromcity
    Denver
    Paris
    |
  First data: 2 从第2行Paris开始取
  策略:默认SE组合
    编译 -> 回放,如果出错,根据错误提示进行调试:
    排除其它问题,怀疑需要关联,重新录制buyb脚本,根据比对buya和buyb,找到动态数据:(难点:判断)
    web_submit_form(
      "Value=020;338;04/25/2017",
    );
  需要关联:
    1)找到相应请求; -- 越固定的步骤越简单
    2)写关联函数;
    3)替换静态数据。

  目前录制方式:单协议、基于HTML方式
  录制选项 Options: 二选一
    HTML-base script 或 URL-base script

四、HTML和URL录制方式的区别:
  1、HTML方式:平时常用方式
    1)录制的脚本比较简约,好维护;
    2)原理:录制时,每打开一个页面,LR默认将页面中的内容保存在自己的缓存中,如用户名(值为空)、密码(值为空)、用户Session Id(值为空)等;
      当用户提交信息时,比如登录,会比对缓存中的数据,如果有区别,就会记录下生成脚本,一般都是数据有差异的部分,不变的部分在缓存中无需生成脚本。
  2、URL方式:需要时使用,比如采用了HTTPS协议时
    1)录制的脚本比较完整、篇幅长,较难维护;
    2)原理:LR默认缓存为空,经过比对后,都不相同,都需要记录下生成脚本;
    3)用途:互联网的趋势是采用https协议(https://)
      安全的http协议(多次"握手")
      BAT 全网https 在线支付 网络银行 国外政府网站
      优点:安全 缺点:维护成本高、影响速度
      想办法改变架构,提高整体性能
      此时需要使用URL方式录制,才能全面录制需要的脚本。

      练习:使用单协议、基于URL方式录制buy脚本 url_buy
        对城市进行参数化 fromcity tocity
        策略 随机购票 RE组合
        fromcity.dat
        fromcity,tocity
        Denver,London
        Denver,Paris
        Paris,London

      脚本增强技术:事务、检查点、(集合点-并发时)、参数化、关联...
      调试思路:走一步,看一步 步步为营

归纳:关联
  1、关联的定义:将脚本中的静态数据使用参数代替,适应服务器端动态数据的变化。
    -- 特殊的参数化 数据是由服务器端产生的
    之前的参数化:数据由自己准备或规则产生
  2、动态数据 -- 进行关联的重要前提
  3、相应请求 -- 为了写关联函数
  4、关联函数
    web_reg_save_param("参数名", "LB=", "RB=", LAST);
  5、思想:以不变应万变!

性能测试重点:
  1、什么是性能测试?
    需求、计划*、测试环境*、执行计划、测试工具、结果分析*
  2、LoadRunner工作原理
    1)VuGen 脚本技术 1VU 录制、回放
      增强:事务、检查点、参数化、集合点、关联、
      流程控制、函数调用...
    2)Controller 场景 Scenario (测试计划)
      模式、组设置、用户行为、Run-time Settings、日志获取、系统资源监控(十多个计数器)
    3)Analysis
      常见指标:平均事务响应时间、TPS、点击率、吞吐量
      最大并发用户数、系统资源特性
      图表:根据不同指标打开查看,必要时可以合并比较
      -- 作为依据编写《性能测试报告》
    4)Load Generator
      必要时可以采用联机测试

  3、掌握常用测试策略:
    1)基准测试:单用户、单测试点、执行n次
    2)并发测试:多用户、单测试点 瞬时并发执行1次
    3)在线综合场景测试:多用户、多测试点,在线执行1h左右
    4)递增测试:逐步加压 VU的增加、请求数的增加
    5)疲劳强度测试:压力更大的综合场景
    6)数据容量测试:大数据量测试

LoadRunner(8)的更多相关文章

  1. 老李分享:性能测试你不应该只知道loadrunner(1)

    老李分享:性能测试你不应该只知道loadrunner(1)   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest测试 ...

  2. LoadRunner(三)——LR相关概念&组成部分

    参考学习感谢:<精通软件性能测试与LoadRunner实战> 一.运行机制和主要组成部分 1.LoadRunner主要由VuGen.Controller和Analysis三部分构成: 2. ...

  3. LoadRunner(一)——性能测试基础及性能指标概述

    参考学习感谢:<精通软件性能测试与LoadRunner实战> 一.典型的性能测试场景 某个产品要发布了,需要对全市的用户做集中培训.通常在进行培训的时候,老师讲解完成一个业务以后,被培训用 ...

  4. LoadRunner(4)

    一.LoadRunner工具的组成 1.VuGen 虚拟用户脚本生成器 脚本好比:武器 VuGen好比:兵工厂 VU好比:士兵 2.Controller 压力调度控制台 好比:总指挥部 3.Analy ...

  5. LoadRunner(2)

    一.性能测试的基本概念 1.并发和在线的区别:并发的压力是一种瞬时压力,一般针对同一类型业务:在线的压力是一段时间的压力,没有并发那么集中. 规律:一般20用户并发产生的压力相当于200用户在线的压力 ...

  6. LoadRunner(1)

    性能测试:HP LoadRunner11 一.初步概念: 1.功能测试:测试产品的功能是否满足功能需求. 如:ATM取款(在线取款)是否成功或转账操作是否成功 -- 一个用户 2.性能测试:测试产品的 ...

  7. LoadRunner(7)

    一.参数化策略 1.Select next row(How? 如何取?)取值方式 选择下一行 1)Sequential:顺序的 每个VU都从第一行开始,顺序依次向下取值: 数据取完可以从头循环重复使用 ...

  8. LoadRunner(6)

    一.脚本录制技术细节 1.选择合适的协议: 1)B/S架构:常用Web[HTTP/HTML]协议,如果项目中使用了其它技术,比如Ajax.JDBC.FTP等,就需要选择多协议: 2)C/S架构:常用W ...

  9. LoadRunner(5)

    一.在线综合场景测试:号称能更真实模拟实际生产环境 又称为:混合交易测试 (交易就是事务 Transaction) 1.三要素: 1)多用户:根据需求指定VU数 压力的来源 2)多任务:根据需求结合多 ...

随机推荐

  1. mysql学习笔记11_12(查询)

    1.建表和插入值 创建company数据库 创建 department表 create table department(d_id int(10) primary key not null uniqu ...

  2. 【AMAD】sorl-thumbnail -- Django缩略图

    动机 简介 个人评分 动机 生成缩略图是一个烦人的工作. 简介 sorl-thumbnail1的特性包括: 支持不同的storage 实现缩略图的引擎是可以切换的:Pillow, ImageMagic ...

  3. logging配置

    import logging def handle(): # 1.定义logger对象:负责产生日志,然后交给Filter过滤,然后交给不同的Handler输出 logger = logging.ge ...

  4. Velocity 数值格式化(NumberTool工具类):保留两位小数和格式化千分位、取整

    Velocity 自带的工具类:NumberTool 实现数字格式化:保留两位小数和格式化千分位,以及取整. NumberTool 的 format(String format, Object obj ...

  5. Java操作Excle(基于Poi)

    有一次有个同事问我会不会有java操作Excle,回答当然是不会了!感觉被嘲讽了,于是开始寻找度娘,找到个小例子,结果越写越有意思,最后就成就了这个工具类. import java.io.Buffer ...

  6. kettle下载地址

    kettle 4.4和4.2 版本是好的,版本6.6和8.2 版本有bug Kettle下载和安装: 1.官网各个版本下载地址:https://sourceforge.net/projects/pen ...

  7. poi 3061 尺取例题1

    题目传送门/res tp poj 白书题 尺取法例题 #include<iostream> #include<algorithm> using namespace std; c ...

  8. 从cbv到fbv:用函数写视图与用类写视图的区别(drf与restful)

    FBV 基于函数的视图 (function base views) CBV 基于类的视图 (class base views) 也就是说我们是用函数编写视图~还是类编写视图我们来看下两个的简单实现 u ...

  9. 【数据结构】P1310 表达式的值

    [题目链接] https://www.luogu.org/problem/P1310 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先 ...

  10. 把.exe的格式的运行程序加到电脑本地服务的办法(本文来源于百度)

    Instsrv.exe(可以给系统安装和删除服务) Srvany.exe(可以让程序以服务的方式运行) 方法/步骤     要实现这个功能要用到微软提供的两个小工具“instsrv.exe”和“srv ...