• LoadRunner(8)


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

      录制脚本:day083login
        基于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)数据容量测试:大数据量测试

  • 相关阅读:
    Spring Boot应用程序属性
    Spring Boot Bean和依赖注入
    Spring Boot构建系统
    Spring Boot Tomcat部署
    Spring Boot引导过程
    Spring Boot快速入门
    Spring Boot简介
    eclipse中将项目打包成jar的两种方法,及其问题与解决方法
    配置Zuul代理下游的认证
    WireMock和Spring MVC模拟器
  • 原文地址:https://www.cnblogs.com/KalosOwen/p/8982253.html
Copyright © 2020-2023  润新知