脚本增强与调试  

  一般来说,使用LR的Vugen录制的脚本并不能直接用于测试,需要对脚本进行各方面的增强,主要包括添加注释、关联、检查点、事务、参数化、日志输出等。下面结合刚完成的一个web项目性能测试来对LR性能脚本增强和调试作简单的总结(不包括LR工具基本操作和基本概念的解释)。

  首先当我们使用LR的Vugen录制完一个脚本后,看着满屏幕LR工具自动生成的脚本代码是否觉得有些无从下手?所以这里有一个特别有用的技巧,就是在录制时可以一边录制一边增加注释,点击录制界面上的增加注释按钮即可实时的增加注释到脚本中,比如在输入登陆用户名和密码、点击某个关键的连接或按钮时,这样录制完成的脚本中就充满着标识业务操作流程的注释,也就不致于迷失在满屏幕的脚本代码中。

  完成脚本的录制后一般可以按照以下步骤对脚本进行增强:

  1)脚本初步检查以及增加头注释

  2)关联操作

  3)增加检查点和事务

  4)进行参数化

  5)增加集合点

  6)思考时间设置

  7)手工输出日志

1、脚本初步检查以及增加头注释

  对脚本进行整体检查,去掉一些无关的内容,比如一些无用的cookies,录制到的浏览器启用SmartScreen滤选器的认证请求(也可以在浏览器选项高级中关闭)等,当然这些还需要不断的经验积累。为便于后续脚本的维护,有必要增加脚本的头注释,对脚本标题、功能、日期版本等内容进行说明。

2、关联操作

  关联是LR脚本增强最关键最核心的步骤,基本上也是脚本增强中工作量最大的,一个脚本中有多少个需要关联的地方取决于系统所使用的架构。LR的脚本能不能始终正确的完成对应的业务操作,就看这一步是不是正确的完成了。有时我们不进行参数化或只迭代一次时脚本运行和业务操作都能正确完成,一但进行了参数化或迭代跑多次后运行就会报错,甚至是运行并不报错但是却发现没有正确完成对应的业务操作,一般都是脚本没有正确关联所引起的。  

  先简单的总结下几种不同的关联方式,关联分为自动关联、手动关联和一边录制一般关联,几种关联方式的本质其实都是在脚本中添加关联函数web_reg_save_param或web_reg_save _ param_ex来保存服务器返回的某些值到一个参数中,然后供某些请求使用;不同的是自动关联,是通过LR工具本身来判断需要关联的内容,自动在脚本中添加关联函数和参数化操作;手动关联是人工识别需要关联的内容,然后手工增加关联函数和参数化操作;而一边录制一般关联,是事先根据系统架构等将具有公共特征需要关联的内容建立一个规则集合,然后在脚本录制的时候让系统根据规则自动的生成关联函数和参数化操作,以减少手工关联重复操作的工作量。

  以上简单的解释了下不同的关联方式,可能首先的判断就是使用自动关联或一般录制一边关联就OK了,何必没事找事的去找麻烦的使用手工关联呢,其实不然,LR的自动关联并不能正确的完成所有需要关联的内容,甚至是有可能进行了错误的关联,那是否要说这是不是LR工具的BUG或者说LR工具做的太烂了呢?就我目前的解释只能说是工具还不能完全达到人工智能的地步,以替代人脑完成对于机器来说更高级的事情。而一般录制一般关联其实也是一种自动关联,当然也存在同样的问题。因此,自动关联和一般录制一般关联只能作为一种辅助方式,在一定程度上减少我们的关联工作量,实际使用中主要使用的还是手工关联或是结合使用这几种不同的关联方式。

  一般可以按照以下步骤来对脚本进行关联操作:

  a、自动关联,先通过工具的自动关联功能找出需要关联的地方,并逐个进行确认关联。

  b、当脚本代码量较小,可以逐条代码进行分析,进行关联,一般代码中的xxxxid很可能就是需要关联的内容。

  c、当脚本代码量很大,可能会存在较多的关联时,可以再录制一份相同业务操作的脚本,通过文件对比工具或LR自带的文件比较工具进行比较,找出脚本中不同的地方比逐个确认是否需要进行关联。另外,在录制另一份相同业务操作的脚本时,最好使用与原录制脚本不同的登陆用户和操作的参数,以免遗留待关联的地方。

  d、当在同一个系统上录制的多个业务脚本或在同一系统框架下录制的多个业务脚本遵循一定的关联规律时,可以建立关联规则,并可以将规则到处为一个关联规则文件,在录制其他脚本时,先导入关联规则文件,再录制时就可以实现一边录制一边关联(自动关联)了。

  

附一份通用的手工关联步骤:

  a、使用相同的业务流程与数据,录制二份脚本;

  b、使用WinDiff工具或LR自带功能协助找出需要关联的数据;

  c、使用web_reg_save_param函数手动建立关联;

  d、将脚本中有用到关联的数据,用关联的参数取代。

关联的一般性规律:

  a、在Submit URL之前的Server Response 中查询待关联值;

  b、待关联的值尽量在最靠近Submit URL;

  c、关联的左边界尽量能够唯一;

  d、不能仅仅在Body中搜索,还需要到各Form中搜索;

  e、Session ID、DocID 等一般需要关联;

  f、加密(服务器端加密)后的值一般需要关联。

3、增加检查点和事务

  在关键地方使用插入文本检查点或图片检查点,目的是确保业务操作的正确性。对性能测试计划或用例中定义的事务前后插入事务的开始和结束函数,目的是测试所定义的交易响应时间,以及在结果中体现我们所关心的业务点或交易点的各维度指标,我这里一般是将检查点和事务结合使用,事务采用手工事务,用检查点来确保该事务被正确的完成。避免使用自动事务出现这样的问题:脚本运行中,某个业务操作本来失败了,即对于LR发出的某个请求,服务器返回了错误提示,但因为没用使用检查点,而且使用的是自动事务,LR工具会误判为该业务操作正确完成造成难以发现的错误。文本检查点函数一般使用注册型函数Web_reg_find并放在要检查的那个请求的前面;事务中一般不要包含思考时间。

4、进行参数化

  按照性能测试用例,将需要参数化的值进行参数化操作,参数的取值方式一定要充分考虑具体的业务对参数取值的要求,避免出现因取值造成的业务执行错误;当要将脚本放在后续的场景中执行时,还要充分考虑具体的场合,避免出现因并发用户数较多而值不够等等问题。特别的一点,当参数化的数据量较大(超过100条)时,需要修改Vugen的配置文件中MaxVisibleLines参数的值,比如将100改为10000,以确保取到更多的参数化值(当时就因这个问题导致场景中大量事务执行失败),再一点,LR的参数化取值界面上进行操作时存在一些易用性的问题和BUG,在操作时需要格外小心,操作完成后最好再确认一次,所作的更改是否生效。

  一般使用较多的取值方式是:顺序+每次迭代更新,当参数的取值必须唯一时,比如创建一个合同,需要输入唯一的合同号,那么取值方式选择:唯一+每次迭代更新+当取值不够时终止该Vuser,并且结合要跑的场景策略计算出大概的取值个数,并确保参数化数据量充足。

5、增加集合点

  增加集合点的目的是模拟对系统产生的绝对并发操作,并非脚本中一定要添加集合点函数,是否需要集合点来产生绝对的并发操作是在脚本调试之前的性能测试计划和用例中就已经确定的。只有脚本中含有集合点函数时,在场景设置中才能设置具体的集合点策略。

6、思考时间(think time)设置

  思考时间的大小直接决定了脚本运行对系统产生压力的大小,在整个测试执行过程中会进行多次的调整,其值在性能测试计划中初步确定,脚本中思考时间一般有以下三种策略:1)将每个think time函数的值设置为一个固定值;2)删除所有的think time函数,只在某一处固定一个think time函数;3)设置为按照录制的思考时间的一定百分比大小。在Vugen中单用户调试和跑测脚本时,也可以忽略思考时间。特别的一点,vugen和controller中都能设置思考时间,但在场景中运行脚本时,场景中设置的思考时间(还包括迭代次数、pacing time等运行时设置)会覆盖vugen中的设置。另外当要设置的思考时间是小数时,直接在think time函数中使用小数即可。

7、手工输出日志

  当脚本业务操作较复杂在运行时报错,为便于通过日志定位错误和后续脚本维护,可以手工在脚本中关键位置增加日志输出,关于LR中日志参见另一篇日志专题的文章,关于脚本中增加手工日志输出目前我使用的也比较少。

  

  按照以上步骤完成了脚本的增强后,为确保关联正确和没有遗漏,还要进行以下调试。多运行几次脚本,分别依次采用单用户单次迭代、单用户多次迭代、多用户单次迭代、多用户多次迭代的方式来执行脚本,并且在执行过程中保证使用不同的登陆用户或不同的参数取值,除了检查脚本执行不报错外,还要在系统中检查相应的业务操作是否都正确完成。

  LR脚本调试运行中出现较多的错误是检查点和没找到关联的错误,当出现错误时除了根据经验来快速排查错误外,一种通用的方法是在出现错误的地方设置一个断点,打开扩展日志中的服务器返回日志,再次进行运行,运行到错误之前的断点处再运行一步,出现错误并停止后,查看服务器返回的内容已确定定位错误原因并排除,不过打开了服务器返回扩展日志后,脚本运行速度会很慢,效率较低,不过该方法很通用,可以找出绝大多数的问题所在。

关于关联还有以下几点说明:

1)vugen的设置中导入了关联的规则文件后,不一定只能是并录制时边关联,可以是使用vugen打开一个未做关联的脚本,然后导入关联规则文件,点击自动关联按钮进行自动关联,关联规则文件同样会生效,不过可能需要进行较多次的自动关联。

2)在使用自动关联时可能需要关联多次,第一次扫描出一部分需要关联的后,再次扫描可能会有更多的需要关联的地方被扫描出来。

3)自动关联时,如果关联变量名依次往后编号,需要特别注意几点:

  a、自动关联一部分后,保存脚本并关闭脚本,然后再重新使用vugen打开脚本再次进行自动关联扫描并进行自动关联操作,关联变量名又会从头开始排序,而不会接着上一次的序号往后排,导致关联变量名可能会有重复的问题。规避措施:同一脚本的全部关联尽量一次全部关联完成,期间不要关闭了脚本。

  b、手工关联的关联变量名不要按照自动关联的关联变量名的命名规则,尽量保持较大的区别,避免关联变量名重复。

4)自动关联有时只识别到了一个需要关联值得一部分,这时候不要点击自动关联的关联生成按钮,否则会造成关联错误。可以先关联其他地方,最后再手工补充关联。

补充一个在关联中很可能遇到的问题:对于边界值中有不确定字符串时该怎么处理?

如:LR中服务器返回的值是OAMRequestContext_oamtest.huawei.com:80_68504a" value="hPJqIBKLWRWw+iTQYjdZBg=="/>,我想取出“hPJqIBKLWRWw+iTQYjdZBg ==”这段,所以左边界是OAMRequestContext_oamtest.huawei.com:80_6f6c6a" value=",但80_6f6c6a是变化,这时该怎么处理了?

有如下四种处理办法:
① 80_6f6c6a的是从哪里来的,是客户端?还是服务器返回的?如果是服务器的返回,那么我对其做一个关联,然后在关联的左边界中应用另外一个关联
② 若“80_6f6c6a”的长度是固定的,LR提供了“#”来替代数字,使用“^”来代替文本或数字。边界用/ ALNUMIC参数。当时就这么处理了。
③ 若“80_6f6c6a”的长度是变化的,可以以“OAMRequestContext_oamtest.huawei.com:”为左边界,“"/>”为右边界,把“80_68504a" value="hPJqIBKLWRWw+iTQYjdZBg==”这段取出来,然后通过C语言的代码截取需要的部分。
④ 想用正则表达式来做,但没成功,正则不是很会写。

推荐优先使用方法2,如果不能使用方法2那么就使用方法3,基本上绝大多数都能解决了。

LR性能测试脚本增强与调试的更多相关文章

  1. 性能测试脚本开发(LR.NET控件)

    性能测试过程中,最耗费经历的就是编写性能测试脚本的过程,在大部分的测试工具中都是采用录制的方式,通过录制产生脚本,然后根据需要进行修改,以及参数化.有些时候为了能够完成某一个功能的脚本,需要将录制下来 ...

  2. lr的脚本调试方法

    1)  设置调试断点(快捷键F9)当设置断点的脚本,脚本运行到断点处,自动停止运行,我们可以通过查看运行日志,来观察脚本执行的情况: LR中也能设置断点,具体菜单在:Insert - Toggle B ...

  3. LR实现http协议性能测试脚本

    1.  GET方式的HTTP请求性能测试脚本 Action() { web_set_max_html_param_len("); web_reg_save_param("retCo ...

  4. LR性能测试应用

    上半个月,由于工作和上课两边跑,几乎没有属于自己的时间去做自己想做的事,在没有加班的一天晚上,我突然冲动地跑到图书馆借了一本书<LR性能测试应用>——姜艳. 我总喜欢看那些陈旧的书,因为在 ...

  5. Loadrunner Webservice接口性能测试脚本编写优化总结

    本文主要介绍使用Loadrunner Webservice接口性能测试脚本编写及优化总结. 1.Webservice协议脚本编写流程 下面介绍使用Loadrunner 11调用Webservice接口 ...

  6. [转][LoadRunner]LR性能测试结果样例分析

    LR性能测试结果样例分析 测试结果分析 LoadRunner性能测试结果分析是个复杂的过程,通常可以从结果摘要.并发数.平均事务响应时间.每秒点击数.业务成功率.系统资源.网页细分图.Web服务器资源 ...

  7. LR性能测试分析流程

    LR性能测试分析流程 一.     判断测试结果的有效性 (1)在整个测试场景的执行过程中,测试环境是否正常. (2)测试场景的设置是否正确.合理. (3)测试结果是否直接暴露出系统的一些问题. (4 ...

  8. locust性能测试脚本模板

    locust性能测试脚本模板 #!/usr/bin/env python # -*- coding: utf-8 -*- import time from locust import HttpLocu ...

  9. LR性能测试课程及视频教程

    LR性能测试课程及视频教程课程如下: 1.性能测试核心技术-2.性能测试脚本开发-3.LR场景设计-4.LR指标分析. 1.性能测试是通过自动化的测试工具模拟多种正常.峰值以及异常负载条件来对系统的各 ...

随机推荐

  1. UVa 11991:Easy Problem from Rujia Liu?(STL练习,map+vector)

    Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for example, ...

  2. ytu 1998:C语言实验——删除指定字符(水题)

    C语言实验——删除指定字符 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 327  Solved: 211[Submit][Status][Web Boa ...

  3. Java Hour8

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 本文作者Java 现经验约为7 Hour,请各位不吝赐教. Hour8 Jav ...

  4. Sql server之路 (三)添加本地数据库SDF文件

    12月25日 今天搞了半天 添加本地数据库Sdf文件到项目里.总是出现问题. 安装环境 Vs2008 没有安装的环境 1.Vs2008 sp1 2. 适用于 Windows 桌面的 Microsoft ...

  5. POJ 2482 Stars in Your Window 线段树扫描线

    Stars in Your Window   Description Fleeting time does not blur my memory of you. Can it really be 4 ...

  6. cocos2dx游戏开发——微信打飞机学习笔记(四)——GameScene的搭建

    一.创建文件 首先呢,就是那个创建新的.h 和 .cpp 的文件,然后可以起名为GameScene 最重要的就是一定要创建在Classes的目录下哦= =,别手抖= =. 二.GameScene.h和 ...

  7. SQL Server 2005 中实现通用的异步触发器架构

    在SQL Server 2005中,通过新增的Service Broker可以实现异步触发器的处理功能.本文提供一种使用Service Broker实现的通用异步触发器方法. 在本方法中,通过Serv ...

  8. CDH 的Cloudera Manager免费与收费版的对比表

    CDH 特性 免费版 付费版 Deployment, Configuration & Management 系统管理 Automated Deployment & Hadoop Rea ...

  9. 源码安装Memcached服务器及其2种PHP客户端

    本文所用源码包皆为当时最新stable稳定版. 安装memcached服务器 先安装libevent, 最新版为2.0.21 tar -zxvf libevent-2.0.21-stable.tar. ...

  10. myeclipse下安装svn

    在网上查了一下,安装的方法有几种,这里给大家推荐一种快速安装的方法. //第一步 : 下载 site-1.6.5.zip //===================================== ...