当前位置:   article > 正文

LoadRunner-性能测试工具

loadrunner

LoadRunner,是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试。企业使用LoadRunner能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。LoadRunner11也很稳定。

可适用于各种体系架构的自动负载测试,能预测系统行为并评估系统性能。

LoadRunner的组件

  • Virtual User Generator—虚拟用户生成器
  • LoadRunner Controller—创建、运行和监控场景
  • LoadRunner Analysis—分析测试结果
  • Scenario(场景) 定义测试阶段出现的事件,基于性能需求。在LoadRunner的Controller部件中,可以设计与执行用例的场景,设置场景的步骤主要包括:在Controller中选择虚拟用户脚本、设置虚拟用户数量、配置虚拟用户运行时的行为、选择负载发生器(Load Generator)、设置执行时间等
  • Virtual Users or Vusers Vusers 模拟用户在你的系统上操作的动作。一个场景可以包含几十,上百,甚至上千的虚拟用户。性能测试模拟多个用户操作可以理解为这些虚拟用户在跑脚本,以模拟多个真正用户的行为。
  • Vuser Script(脚本) 通过Vuser Generator录制或开发的脚本,这些脚本用来模拟用户的行为。
  • Protocal 协议是客户端和服务器之间交流的方式
  • Transaction(事务) 测试人员可以将一个或多个操作步骤定义为一个事务,可以通俗的理解事务为“人为定义的一系列请求(请求可以是一个或者多个)”。在程序上,事务表现为被开始标记和结束标记圈定的一段代码区块。Loadrunner根据事务的开头和结尾标记,计算事务响应时间、成功/失败的事务数。
  • 负载发生器(Load Generator):用来产生压力的机器,受Controller控制,可以使用户脚本在不同的主机上执行。在性能测试工作中,通常由一个Controller控制多个Load Generator以对被测试系统进行加压。
  • 思考时间(Think Time):即请求间的停顿时间。实际中,用户在进行一个操作后往往会停顿然后再进行下一个操作,为了更真实的模拟这种用户行为而引进该概念。在虚拟用户脚本中用函数lr_think_time()来模拟用户处理过程,执行该函数时用户线程会按照相应的time值进行等待。

  • 集合点(Rendezvous):设集合点是为了更好模拟并发操作。设了集合点后,运行过程中用户可以在集合点等待到一定条件后再一起发后续的请求。集合点在虚拟用户脚本中对应函数lr_rendezvous() 。

  • 事务响应时间:事务响应时间是一个统计量,是评价系统性能的重要参数。定义好事务后,在场景执行过程和测试结果分析中即可以看到对应事务的响应时间。通过对关键或核心事务的执行情况进行分析,以定位是否存在性能问题。

LoadRunner负载测试的流程

  1. Plan the load test 计划负载测试
  2. Create Vuser scripts 创建脚本
  3. Define the scenario 定义场景
  4. Analyze the results 分析结果

 流程:

1. 创建UV脚本

1.1 录制脚本

打开LoadRunner12的Virtual User Generator,点击左上角的File>New Script and Solution,弹出Create a New Script 窗口,在窗口中选择Web-HTTP/HTML协议,后点击Create 就会创建空白脚本。

VuGen的脚本分为三个部分:Vuser_init,Action,Vuser_end。其中Vuser_init和Vuser_end都只能存在一个,而Action可分成无数多个部分,可以通过点击旁边的【new】按钮来创建Action。在迭代执行测试脚本时,Vuser_initVuser_end中的内容只会执行一次,迭代的是Action部分

在脚本编辑页,Actions是编写脚本的地方。

包含Vuser_init,Actions,Vuser_end

Vuser_init:表示执行测试初始化工作,只执行一次,可设置登录。

Actions:放置需要循环执行的脚本,脚本中编写要压测的业务,如创建通知书,创建用户等,查询代办等。

Vuser_end:脚本只执行一次,可以设置退出脚本,执行测试结束清理操作。

新建空白页脚本,点击record(录制)按钮,进行录制设置。

4种录制方法:

Web Browser:启动浏览器录制,存在浏览器兼容问题。

Windows Application:录制CS客户端。

Remote Application via LoadRunnwe Proxy:通过LoadRunner代理来录制。------推荐这种。

Captured Traffic File Analysis:通过抓包文件来录制脚本。

a. 录制设置:设置IP和port。点击ok开始录制。

b. 浏览器设置代理。

测试机已安装Chrome ,且安装了SwitchyOmega插件,设置场景名称。

1.2. 在浏览器种执行操作,就会生成脚本,脚本语法规则和C语言一致。

1.3. 脚本增强。包含参数化,关联,检查点,

参数化的作用是在进行场景执行的时候,每个不同的虚拟用户可以按照参数的读取策略读取到参数值,以模拟不同用户在提交或者读取不同的数据。

每个用户在界面上读取和提交的信息都不太相同,因此一般都需要参数化,其它与输入信息对应的比如用户id之类的信息也需要参数化;另外,录制环境绝大多数情况下与执行环境不一致,因此一般需要对IP、端口或者域名做参数化。

打开脚本后,首先要确定哪些常量需要参数化。

可以看出,在web_submit_data函数中,两条语句包含了两个常量:用户名和密码。

"Name=usernam", "Value=Test123433333@sina.com", ENDITEM,

"Name=password", "Value=123456", ENDITEM,

当我们想模拟多个不同的用户来运行登录脚本的时候,需要对Value= Test123433333@sina.com和Value=123456进行参数化,以e号参数化为例,参数化过程如下:

1)选中Test123433333@sina.com à右击鼠标à在右键菜单上选择replace with a parameter。

2)在弹出窗口填写参数名称,或选择一个已经存在的参数名。

常用的参数类型:

  • ü Data/Time:使用当前日期/时间替换所选常量。
  • Group Name:使用Vuser组的名称替换所选常量。
  • Load Generator Name:使用Vuser脚本的负载发生器名替换所选常量。
  • Iteration Number:使用当前的迭代编号替换所选常量。
  • Random Number:使用一个随机生成的整数替换所选常量,可以通过参数属性设定参数的范围。
  • Unique Number:使用一个唯一编号替换所选常量,可以通过参数属性设定参数的第一个值和递增的规则。
  • Vuser ID:使用运行脚本的虚拟用户ID来代替选择的常量。
  • File:采用外部的数据来代替,可以使用单独的文件,也可以使用现成的数据库中获取数据。
  • User Defined Function:从用户开发的dll文件中获取数据。

3)单击窗口的properties按钮,设置parameter的properties。参数名称:Username;选择参数类型File,来写入已准备好的数据。

文件File参数化结束后,脚本保存的根目录下会自动生成一个 以参数名称命名的 参数文件;也可以直接选择一个已准备好的参数文件。

选择参数列Select Column

By number:以列号为参数列。

By name:以列名为参数列。

文件格式:

Column:参数之间的分隔符:逗号、空格、Tab。

First data:从第几行读取数据。

选择参数分配方法Select next row

  • Sequential:顺序的分配Vuser参数值。当正在运行的Vuser访问数据表格时,它将会提取下一个可用的数据行。
  • Random:当脚本开始运行时,“随机”的为每个Vuser分配一个数据表格中的随机值。
  • Unique:为Vuser的参数分配一个“唯一”的顺序值。注意,参数数量一定要大于等于“Vuser量*迭代数量”。

选择参数更新方法Update value on

  • Each iteration:脚本每次迭代都顺序的使用数据表格中的下一个新值。
  • Each occurrence:在迭代中只要遇到该参数就重新取值。
  • Once:在所有的迭代中都使用同一个值。

当超出范围时When out of values:(选择数据为unique时才可用到)

  • Abort Vuser:中止.
  •  Continue in a cyclic manner:继续循环取值。
  • Continue with last value:取最后一个值。

设置完成后,被参数化的值会被参数名代替

 关联:关联的含义是在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,以变量的形式替换录制时的静态值,从而向服务器发出正确的请求,最典型的是用于sessionID,审批代办的请求参数待办id是待办列表中获取的。常用的关联技术有三种:录制中关联、录制后关联、手动关联。

如可以使用web_reg_save_param();方法建立关联。

录制中关联:设置录制前的recording options correlation,可以勾选LR已有的关联规则,也可以新建规则;录制过程中,关联自动在脚本体现。

插入检查点:在脚本中设置检查点函数,将返回值的结果反映在Controller的状态面板上和Analysis统计结果中,由此可以判断数据传递的正确性。如可通过web_reg_find()方法实现。

增加事务:脚本录制后插入或者录制中插入。

定义场景

手动设计场景(Manual Scenario)最大的优点是能够更灵活地按照需求来设计场景模型,使场景能更好地接近用户的真实使用。一般情况下使用手动场景设计方法来设计场景。

面向目标场景(Goal Oriented Scenario)则是测试性能是否能达到预期的目标,在能力规划和能力验证的测试过程中经常使用。

定义场景—设置Schedule

在Controller的Scenario Schedule中,可以设置场景的各项计划,如虚拟用户的加载方式、释放策略等。

1.设置场景的基本信息

Schedule Name:设置场景名称。

Schedule by:选择按场景计划或按用户组计划。

Run Mode:

real-world schedule 是真实场景模式,可以通过增加Action来增加多个用户。

basic schedule 是我们以前用的‘经典模式’,只能设置一次负载的上升和下降。

2.设置场景的各类参数:双击Global Schedule中的对应行,可以设置schedule的各类参数。

Initialize初始化是指运行脚本中的Vuser_init操作,为测试准备Vuser和Load Generator。

Start Vusers设置场景Vuser加载方式。

Duration设置场景持续运行的情况。

Stop Vusers设置场景执行完成后虚拟用户释放的策略。

Start Time设置场景启动时间。

分析结果

LR的Analysis模块是分析系统的性能指标的一个主要工具,它能够直接打开场景的执行结果文件,将场景数据信息生成相关的图表进行显示。Analysis集成了强大的数据统计分析功能,允许测试员对图表进行比较和合并等多种操作,分析后的图表能够自动生成需要的测试报告文档。

通常测试报告需要给出“虚拟用户—用户响应时间”的折线图,这个折线图可以通过合并报表的形式生成,过程如下:选中Average Transaction Response Time报表,单击菜单栏的ViewàMerge Graphsà然后选择与Running Vuser图合并,生成的折线图即为“虚拟用户—用户响应时间”。

 

性能测试入门——LoadRunner使用初探 - 知乎性能测试是利用产品、人员和流程来降低应用程序、升级程序或补丁程序部署风险的一种手段。性能测试的主要思想是通过模拟产生真实业务的压力对被测系统进行加压,验证被测系统在不同压力情况下的表现,找出其潜在的…https://zhuanlan.zhihu.com/p/24812449

 

性能指标:

系统的性能由TPS决定,跟并发用户数没有太多的关系,在同的TPS下,可以由不同的用户数去压(通过加思考时间设置)

系统的最大TPS是一定的(在一个范围内),但是并发用户不一定,可以调整

建议测试的时候,不要设置过长的思考时间,以最坏的情况下对服务器施压,一般情况下,大型系统(业务量,机器多)做压力测试,5000个用户并发就够了,中小型系统做压力测试,1000个用户并发就足够了。

常用函数

1、C语言参数转web参数

lr_save_string("aaa","param"):将字符串“aaa”或者一个字符串变量,转变成LR的参数{param}
lr_save_int(123,”param”);将数字123,转变为LR的参数param

2、web参数转C语言参数

lr_eval_string("{param}"):取出参数{param}中的值,可嵌套在其他函数里使用

3、字符串处理函数

strcmp:字符串比较函数,若两个值相等,则返回0
strcpy:字符串拷贝函数,可以把一个字符串拷贝到一个字符数组中
strcat:字符串拼接函数,可以把一个字符串拼接到一个字符数组中

4、编码转换函数

lr_convert_string_encoding(lr_eval_string("{msg}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"afterEncodeMsg");
将LR中的参数{msg},从utf-8编码转换为system_local编码(LR本地编码),最后保存到LR的参数{afterEncodeMsg}中

5、参数数组操作

lr_paramarr_random("param_arry"):从参数数组param_arry中随机取一个值,注意param_arry不需要加{}
int size;
size = lr_paramarr_len("param_arry"):获取参数数组param_arry的长度,并保存到C语言的变量size里
int value;
value = lr_paramarr_idx("param_arry",1):获取参数数组param_arry中第1个值,并保存到C语言的变量value里

6、web_url():get接口,一般通过录制生成

7、web_custom_request():post接口,可以测试http接口或者webservice接口

8、web_submit_data():post接口,可以测试文件上传类型接口

9、atoi(lr_eval_string("{param}")):将LR参数{param}转换为数字

10、web_reg_save_param:关联函数,一定要写在请求之前

11、web_reg_find:文本检查点函数,一定要写在请求之前

12、日志函数

  1. lr_output_message
  2. lr_error_message
  3. lr_log_message

13、 web_save_timestamp_param:将当前的时间戳保存成一个参数

14、web_add_cookie函数:新增cookie

15、web_add_header函数,新增header信息

WebService接口

web_custom_request函数,需要新增header(Content-type:text/xml)

Socket接口

1、lrs_create_socket("socket0", "TCP", "RemoteHost=127.0.0.1:8888", LrsLastArg),创建socket连接

2、lrs_send("socket0", "buf0", LrsLastArg),发送buf中的数据

3、lrs_receive("socket0", "buf1", LrsLastArg),接收服务器返回的数据,并保存到一个buf1中

4、lrs_save_param("socket0",NULL,"RecivedData",0,-1),获取服务器返回的数据,并保存到一个参数中RecivedData,最后两个参数,偏移量和length

5、lrs_save_searched_string("socket0",NULL,"RecivedData","LB/BIN=|","RB/BIN=|",1,0,-1),获取服务器返回的数据,并指定了左右边界
过滤出想要的数据,保存到一个参数中,最后三个参数分别为,取值序号、偏移量、保存长度

6、lrs_close_socket("socket0"),关闭链接

7、lrs_set_recv_timeout2:设置结束数据超时时间

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号