二、LoadRunner工作原理
首先通过VuGen来录制模拟用户行为的脚本;然后根据性能测试目标,在Controller中设计场景,指定负载生成的方式(如LG使用数,并发用户数,执行时长等);接着执行场景并监控被负载服务器的性能指标;待场景执行完毕,调用Analysis来对生成的数据进行分析,最后得出性能测试报告。
三、基于LoadRunner的测试案例
使用LoadRunner进行性能测试,大体可分为3个步骤:
1.用户行为模拟
性能测试的第一步也是最重要的一步,就是生成虚拟用户脚本(Vuser Script)。VuGen是基于录制-回放的工具,提供了整个脚本的开发环境。当你在应用程序中执行业务流程时,VuGen会将你的操作录制下来,自动转换成脚本,作为用户行为的模拟。使用VuGen进行用户行为模拟的流程如下:
1)录制脚本
如果你对Vuser Script的函数非常熟悉,可以跳过录制过程来手动编写脚本。大多数情况下,我们会在录制生成的脚本上根据需求进行修改。录制流程主要包括以下协议选择、录制选项设置、开始录制、插入命令、停止录制。对一般B/S架构的Web应用,选择Web - HTTP/HTML协议就可以了。
如果不能确定目标系统使用了哪些协议,可以使用Protocol Advisor 来进行协议分析。
选择协议之后,进行录制选项设置,再点击红色按钮开始录制脚本。
可以看到,Vuser Script脚本由以下三部分组成:
vuser_init: 虚拟用户的初始化函数,一般将用户初始化的操作放在这里,如登录操作,只会运行一次。
Action: 虚拟用户要做的业务操作,也就是测试内容的主体。可以迭代多次。
vuser_end: 与vuser_init相对应的收尾工作,如退出登录操作,只会运行一次。
开始录制脚本后,可以在recording界面进行执行插入事务、插入集合点、插入注释以及结束录制等命令。
完成录制后,脚本通常会包含web_url()等函数。Vuser Script脚本中常用函数有:
web_add_cookie():负责为Vuser脚本添加一个cookie信息。
web_url():可以模拟用户的HTTP Get请求。
web_submit_form():基于页面表单模拟用户的HTTP Post请求。该函数会自动检测在当前页面上是否存在form表单,然后将表单中数据进行传送。
web_submit_data():无需页面form支持就可以模拟用户的HTTP Post请求。
web_custom_request():可以模拟用户的HTTP Get以及Post请求。
2)回放脚本
点击replay按钮进行回放验证。有时候回放脚本会出错,常见的错误原因及解决方式:
脚本中的数据存在动态部分。需要通过修改代码或关联处理来解决。
脚本没有录制到所有的协议请求。请选择正确的协议。
防火墙或杀毒软件的干扰。关闭不必要的防火墙和杀毒软件。
服务器连接失败。请确认当前服务器能正常访问。
3)关联设置
关联就是把服务器返回的响应内容保存为参数,在请求时使用该参数,可实现动态数据。
如常见的系统登录功能,在登录后服务器会返回SeesionID,登录后的操作都需要提交该SessionID以确认身份。使用Vugen录制脚本时,将会记录服务器返回的SessionID并在下一个请求中发给服务器,如图9所示。
等到回放脚本时,服务器会在接收到用户名密码后返回新的SessionID,而脚本仍然发送旧的SessionID给服务器,最终导致脚本回放失败。如图10所示。
LoadRunner的两种关联方式:
自动关联
自动关联是通过录制和回放时的服务器返回值的比较,来确定需要关联的内容,然后帮助生成对应的关联函数。对于大多数脚本回放失败的情况,都可以通过自动关联来解决。
手动关联
自动关联也有局限性,无法识别的特殊动态数据,需要手动关联。在LR11 Patch3之前的版本,使用web_reg_save_param_ex()函数来设置参数的左右边界实现手动关联;之后的版本则使用支持正则表达式的新函数web_reg_save_param_regexp(),如图12
4)添加事务及思考时间
事务是指用户在客户端执行某种业务所需要的操作集。事务函数可以标记完成该业务所需要的操作内容。通过在业务操作开始前添加一个事务开始的计数器,在业务操作结束后添加一个事务结束的计数器,VuGen可以自动计算出函数间的时间差,即事务响应时间。添加事务主要涉及以下2个函数:
事务开始函数:lr_start_transaction(“事务名”)
事务结束函数:lr_end_transaction(“事务名”,LR_AUTO)
另外事务还支持事务嵌套:
lr_start_sub_transaction(“子事务名”,“父事务名”)
lr_end_sub_transaction(“子事务名”,“父事务名”)
一般地,录制得到的脚本都会包含思考时间。思考时间是LoadRunner提供的用于模拟用户等待的方式。在性能测试时只有启用思考时间,才能真正地按照用户的操作速度来完成请求,得到真实情况下的负载数据;否则则是全负载下的理论峰值数据。
思考时间函数:lr_think_time()
5)添加集合点
集合点函数能让虚拟用户集合在同一时间点上来进行操作,帮助生成有效可控的事务并发。集合点有以下三种集合策略,一般可以使用c策略来明确指定并发数。
a.当百分之多少的用户到达集合点时继续执行脚本
b.当百分之多少的运行用户到达集合点时继续执行脚本
c.当多少个用户到达集合点时继续执行继续
集合点函数:lr_rendezvous()
6)参数化
当我们录制完脚本后,需要对脚本进一步改进,通过参数化来确保脚本能够动态运行,从而更加真实地模拟真实用户操作。
参数化的步骤主要包括:选择要参数化的内容;设置参数取值以及参数更新方式;回放脚本验证参数值等。参数更新方式有顺序取值、随机取值、唯一取值三种类型,这里就不一一介绍了。
选择要参数化的内容,右键菜单选择“Replace with a Parameter”,点击“Create New Parameter”。
设置参数取值,参数类型可以是File类型、Table类型、Random Number类型、Date/Time类型等。这里使用Table类型,同一行中列名为username及password的记录将作为表单中用户名和密码的动态参数值。除了手动添加参数值外,也可以通过ODBC方式从DB中获取参数值。
参数化后,脚本中的username及password字段取值已经不是静态值了,而是由“{}”包围起来的动态参数值。