一、脚本关联技术 
  引入:
    打开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. DNS域名解析系统_1

    DNS服务概述: DNS的模式为C/S模式 DNS(Domain Name System)域名系统,在TCP/IP网络中有非常重要的地位,能够提供域名与ip地址的解析服务. DNS是一个分布式数据库, ...

  2. BFS算法模板(python实现)

    BFS算法整理(python实现) 广度优先算法(Breadth-First-Search),简称BFS,是一种图形搜索演算算法. 1. 算法的应用场景 2. 算法的模板 2.1 针对树的BFS模板 ...

  3. appium(toast处理)

    from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expec ...

  4. tensorflow搭建神经网络

    最简单的神经网络 import tensorflow as tf import numpy as np import matplotlib.pyplot as plt date = np.linspa ...

  5. vue 页面 添加背景音乐

    背景音乐 添加背景音乐 并有单击事件   循环播放 <template> <div id="page"> <div style="width ...

  6. [mysql] C++操作mysql方法

    下载:http://mirrors.sohu.com/mysql/MySQL-5.5/ From: http://www.cnblogs.com/magicsoar/p/3817518.html C+ ...

  7. 关于SpringMVC中的转发与重定向的说明

    写的非常详细,参看该地址:https://www.zifangsky.cn/661.html 总结: 1.请求转发:url地址不变,可带参数,如?username=forward 2.请求重定向:ur ...

  8. ubuntu下java的安装与执行

    一.安装java sudo add-apt-repository ppa:linuxuprising/java sudo apt-get update sudo apt-get install ora ...

  9. [DEBUG] Spring boot前端html无法下载示例文件

    更新:原方法打jar包的时候是可以的,后来我打war包之后下载的文件就是0字节.尴尬:) 所以现在更换一种方法,然后打war包.在服务器已测试成功. 前端不需要改变,只需要更改controller: ...

  10. if (strAreaCode.Find("体检")>=0)

    string类提供了6种查找函数,每种函数以不同形式的find命名. 这些操作全部返回string::size_type类型的值,以下形式标记查找匹配所发生的位置: 或者返回一个名为string::n ...