LoadRunner自动化测试工具的应用

目录

第一部分:Loadrunner的简介

1.1 安装注意事项

1.2 协议的选择或者 VUSER 类型的选取

1.3 LR 的基本原理

1.4 测试脚本录制/分配所遵循的几个原则

第二部分:录制脚本

2.1 录制脚本前需要理解的几个基本概念

2.1.1 事务(Transaction)

2.1.2 集合点(Rendezvous)

2.1.3 集合函数

2.1.4 IP Spoofer(IP 欺骗)

2.1.5 (Text/Image)检查和 contents check 点

2.1.6 LR 脚本复用问题

2.1.7 理解 Correlation(关联)

2.1.8 以录制 Web(Http/Html)协议为例讲述一下 LR 的脚本的录制

2.2 脚本录制

2.3 脚本的参数化

第三部分:创建运行场景

3.1 Run-Time Setting

3.2 几种场景类型的选择

3.3场景的设置

3.3.1 设置集合点

3.3.2 设置集合点策略

Virtual Users Goal

Hits per Second

Transactions per Second

Transactions Response Time

Pages per Minute

3.3.3 这里介绍一下多机联合产生负载

3.3.4 LR 对服务器资源的监视

第四部分:利用Analysis 分析结果

4.1 页面分解

4.2 报表组合


第一部分:Loadrunner的简介

LoadRunner® 是一种预测系统行为和性能的工业级标准性能测试负载测试工具。通过 以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner 能 够对整个企业架构进行测试。通过使用LoadRunner ,企业能最大限度地缩短测试时间,优 化性能和加速应用系统的发布周期。 目前企业的网络应用环境都必须支持大量用户,网络体系架构中含各类应用环境且由不同供应商提供软件和硬件产品。难以预知的用户负载和愈来愈复杂的应用环境使公司时时担 心会发生用户响应速度过慢,系统崩溃等问题。这些都不可避免地导致公司收益的损失。 Mercury Interactive 的LoadRunner能让企业保护自己的收入来源,无需购置额外硬件而最 大限度地利用现有的IT资源,并确保终端用户在应用系统的各个环节中对其测试应用的质 量,可靠性和可扩展性都有良好的评价。

LoadRunner 是一种适用于各种体系架构的负载测试工具,它能预测系统行为并优化系 统性能。LoadRunner 的测试对象是整个企业的系统,它通过模拟实际用户的操作行为和实 行实时性能监测,来帮助您更快的查找和发现问题。此外,LoadRunner能支持广泛的协议和 技术,为您的特殊环境提供特殊的解决方案。

1.1 安装注意事项

LR的版本:目前常见的:LR7.0,LR7.51,LR7.6,LR7.8,每个版本差别蛮大的,大家尽量使 用高版本。本文以LR7.8为例。

操作系统选择:LR是个比较底层的软件,OS最好为Windows 2000,因为W2k的稳定性和 兼容性都不错,需要的内存也低,有人把LR装在WinXp下面,是有问题的。出错现象:“应 用程序正常初始化(0xc0000005)失败”。在win2003,winXP下安装LR后会出现如此情况。

License问题:LR的license是区分类型的,一般是按协议和时间,用户数量来区分的, 比如:

License for LoadRunner 7.51 (Type:Global 500, Time Limited时效:1年 ) 就表示支持所有协议,最大500VU,时间:1年。

三种安装类型:Standalone Installation,Network Installation,Network Installation and shortcuts
四种安装方式:Typical Installation,Load Generator,MI Listener,Custom Installation 我们根据实际情况选择,我用Standalone Installation和Custom Installation安装,安装 所有组件。

1.2 协议的选择或者 VUSER 类型的选取

我现在要用 LoadRunner 测一个 C/S or B/S 系统,请问该用什么协议? 经常有新手问:为什么我用 LR 录完之后 VuGen 里产生不了脚本?这就是协议选择的问 题了,LR 支持的协议和应用非常广泛,很少有人能用完这么多协议,我们就常见的大多数人用的加以讨论:
B/S 系统:选择 Web(Http/Html),
C/S 系统:根据 C/S 结构所用到的后台数据库来选择不同的协议,如果后台数据库是Sybase,则采用 sybaseCTlib 协议,如果是 Sql server,则使用 MS Sql server 的协议,至 于 oracle 数据库系统,当然就使用 oracle 2-tier 协议。

对于没有数据库的 c/s(ftp, SMTP)这些可以选择 windows sockets 协议。 至于其他的 ERP,EJB(需要 ejbdetector.jar),选择相应的协议即可.

1.3 LR 的基本原理

LR 启动以后,在任务栏会有一个 Agent 进程,通过 Agent 进程,监视各种协议的 Client 与 Server 端的通讯,用 LR 的一套 C 语言函数来录制脚本,所以只要 LR 支持的协议,就不 会存在录制不到的,这是它与 Load test,WR,Robot(Gui)录制脚本的很大一个区别。(WR 必须识别对象,才能录制到)。然后 LR 调用这些脚本向服务器端发出请求,接受服务器的响 应。至于服务器内部如何处理,它不关心。

1.4 测试脚本录制/分配所遵循的几个原则

  1. 脚本越小越好。就像写code一样的,不要太长,尽量做到一个功能(Transaction) 一个脚本。如果那些功能是连续有序的,必须先做上一个,才能工作下一个,那就 只好放在一起了。

  2. 选择使用频率最高的。有些人喜欢在LR中测试几乎所有的功能,其实这样不合适, 我们把最常用的、使用频率最高的、拿出来测试。但是也要结合用户实际使用情况, 一般在一个系统中是多个用户使用多个功能,某些功能使用的频率更大一些,我们 在录制脚本之前就要设计好,哪个脚本会跑几个用户,一共需要多少个脚本,能满 足性能测试的需求。

3. 选择你所需要的进行录制。对于WEB的程序,对于你所关注的内容没什么影响的操作, 你可以不录制,可以使用暂停,这需要试的, 对被测功能有一个清楚的认识和了解, 要能把握住哪些地方是对整个过程没有影响的,比如一些查询,通常,选择条件的页 面都可以不录制,但对于一些页面有可能要传递参数,就需要录制了, 如何确定哪 些点可以不录制,一是可以找开发人员了解清楚程序设计的结构,再就是靠自己的 经验,作的多了,就心中有数了。

例子:

Test case name

Vuser number

Total 50

Vuser number
Total 20

Iteration

Test case 1: merchants create schedule and costing sheet

104200

Test case 2: Merchant run report-5 concurrent users (3 merchants, 2 vendors).

51200

Test case 3: merchant edit costing sheet FOB and create production schedule

94200

Test case 4: merchant reply schedule tasks

63300

Test case 5: vendor reply schedule tasks

73200

Test case 6: vendor edit costing sheet

73200

Test case 7: merchant create topic,vendor reply topic

41100

Test case 8: imports reply schedule and do classification.

2110

第二部分:录制脚本

2.1 录制脚本前需要理解的几个基本概念

2.1.1 事务(Transaction)

事务(Transaction)是这样一个点,我们为了衡量某个action的性能,需要在action 的开始和结束位置插入这样一个范围,这就定义了一个transaction,LoadRunner 运行到该 事务的开始点时,LoadRunner 就会开始计时,直到运行到该事务的结束点,计时结束。这 个事务的运行时间在结果中会有反映。

插入事务操作可以在录制过程中进行,也可以在录制结束后进行。LoadRunner 可以在脚 本中插入不限数量的事务。

举个例子:比如一个单据,把从登录到保存成功退出整个作为一个脚本,对于需要关注的 保存时间,定义为单独的事务,以取得响应时间,事务脚本函数如下:

2.1.2 集合点(Rendezvous)

集合点:是一个并发访问的点,在测试计划中,可能会要求系统能够承受1000人同时提 交数据,在LoadRunner中可以通过在提交数据操作前面加入集合点,这样当虚拟用户运行到提交数据的集合点时,LoadRunner 就会检查同时有多少用户运行到集合点,如果不到1000 人,LoadRunner就会命令已经到集合点的用户在此等待,当在集合点等待的用户达到1000 人 时,LoadRunner 命令1000 人同时去提交数据,并发访问的目的。 注意:集合点经常和事务结合起来使用,常放在事务的前面,集合点只能插入到Action 部 分,vuser_init和vuser_end 中不能插入集合点。

2.1.3 集合函数

集合点函数如下,参数不能加空格:

加入集合点之后,在后面运行过程中可以看到VU的状态,会等待集合。

2.1.4 IP Spoofer(IP 欺骗)

当运行场景时,虚拟用户使用它们所在的Load Generator 的固定的IP 地址。每个Load Generator 上(同时)运行大量的虚拟用户(*不明白),这样就造成了大量的用户使用同 一IP 同时访问一个网站的情况,这种情况和实际运行的情况不符,并且有一些网站会限制 同一个IP 的登陆。为了更加真实的模拟实际情况,LoadRunner允许运行的虚拟用户使用不 同的IP 访问同一网站,这种技术称为“IP 欺骗”。 启用该选项后,场景中运行的虚拟用户将模拟从不同的IP 地址发送请求。该选项非常 的有用。注意:IP Spoofer 在连接Load Generators 之前启用。要使用IP 欺骗,各个Load Generator 机器必须使用固定的IP,不能使用动态IP(即DHCP)。

IP Wizard工具就提供了生成多个ip的功能,IP Wizard是一个单独的程序,我们可以在 开始菜单里面找到,你可以添加一个局域网内的IP段。添加后重启,在Win2k下使用 Ipconfig/all查看到很多虚拟的IP,最后要在Controller里面选择enable ip spoofer.

2.1.5 (Text/Image)检查和 contents check 点

对于查询类的脚本,一定要添加检查点,以保证在测试时结果的正确性.因为LR只要检测 到网页的响应,就认为是pass而并不管当前网页内容的正确性.在进行压力测试时,为了检 查Web服务器返回的网页是否正确,VuGen允许我们插入Text/Imag 检查点,这些检查点验证 网页上是否存在指定的Text或者Image,还可以测试在比较大的压力测试环境中,被测的网 站功能是否保持正确。检查点的含义和WinRunner 中的检查点功能基本上一致,这里就不再 作过多的说明。

举个例子:当我用loadrunner做压力测试的时候, 它的确能反馈给我各种服务器性能的数据,
但是在做B/S结构系统的测试的时候,
却发现如下问题:
loadrunner不能正确判断操作是否成功,比如登录,我要测试200人同时登录, 但是我的login.jsp里面没有正确的关闭数据库的连接, 导致登录100人后,建立了100个数据库连接, 第101人一个人登录的时候,由于超出数据库连接的最大数, 所以,jsp程序抛出了一个数据库异常。 但是页面的走向是正确的,所以loadrunner会认为程序是正确执行的,但是事实却并非如此。

对于有的页面是无法添加文本和图像检查点的,就加入contents check点。

2.1.6 LR 脚本复用问题

作为一款优秀的负载测试工具,LR的测试脚本有很好的复用性,参数化后的脚本,在应 用没什么大的变化的情况下,一直是可以用的。甚至你在A服务器录制的脚本,如果做测试 的时候,需要转移到B服务器上,你只需要用查找替换的功能将A服务器的IP地址换成B服务 器的IP地址就可以使用。

2.1.7 理解 Correlation(关联)

关联是用来解决脚本中存在的动态数据问题的.在7.8中,当你回放一次后,LR会自动录 找你录制的时候和回放时候的差别,找出动态数据,并作成参数。举个我作的动态数据的例 子,当用户登录时,会产生一个Sessionid号,访问结束后,该Sessionid便会失效。我录制 的时候,在脚本里面获取到了该Sessionid,但当我再回放的时候,这个Sessionid已经无效 了,所以我需要把这个Sessionid作为一个动态数据,当我一登录的时候,便获取一个新的 有效的Sessionid,然后通过函数把它保存下来

web_reg_save_param("WCSParam_Text2", "LB=ProcessID=",
"RB=;",
"Ord=1",
"RelFrameId=1",
"Search=body",
LAST);

 那么后面用到的页面中就可以调用WCSParam_Text2这个参数使用这个新的Sessionid号。这 是个动态数据很典型的例子,

web_submit_data("w_onload_check.asp", "Action=http://gsserver3/cwbase/sys/userlogin/w_onload_check.asp", "Method=POST",
"TargetFrame=",
"RecContentType=text/html", "Referer=http://gsserver3/cwbase/sys/userlogin/index.asp",
"Snapshot=t3.inf",
"Mode=HTML",
ITEMDATA,
"Name=hdclentip", "Value=chenjing", ENDITEM,
"Name=hdProcessID", "Value=F8E5ACCD372845C38C7E1981A342F703", ENDITEM, "Name=selInstanceid", "Value=T01", ENDITEM,
"Name=TxtUserID", "Value={RYBH}", ENDITEM,
"Name=TxtPassword", "Value=cwpass", ENDITEM,
"Name=Txtkjdate", "Value=2003.01.06", ENDITEM,
"Name=selInstancetxt", "Value=性能测试用(中型数据库)", ENDITEM, "Name=selInstance", "Value=T01", ENDITEM,
LAST);
web_url("loginpage.aspx", "URL=http://gsserver3/cwbase/sys/menushow/loginpage.aspx?ProcessID={WCSParam_Text2}",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t4.inf",
"Mode=HTML",
LAST);

理解web_reg_save_param函数,
int web_reg_save_param (const char *ParamName, <List of Attributes>, LAST);

第一部分:参数名字,用双引号括起,逗号分开;
第二部分:List of Attributes,包括:LB、RB、RelFrameID、Ord、Search、SaveOffset、 SaveLen等,
第三部分:LAST,结束标志。

左边界,右边界到底是个什么概念? LB是左边界,要查找的字符串左面的边界值,即位于查找字符串的最左边的字符串,RB是右 边界,要查找的字符串右面的边界值,即位于查找字符串的最右边的字符串,比如说吧,程 序中有这么一个赋值,ProcessID =A53625E18440FCE81F26DCE712E65EBA;如果ProcessID的 值是动态的,我想使用动态变量,那我设定查找左边界为LB=ProcessID=,右边界为RB=;的字 符,如果找到了,就替换成变量. Search是指查找范围,就是说在哪里查找这些值,可以取这样几个值,我们一般设为ALL, Body等即可。
Headers (Search only the headers),
Body (search only Body data, not headers),
Noresource (search only the html body, excluding all headers and resources), ALL (search Body and headers). The default value is ALL.
RelFrameID: The hierarchy level of the HTML page relative to the requested URL. 一般取1

ORD: This parameter, also known as Instance, indicates the ordinal or instance of the match. 一般取 1

LR7.8已经为用户定义好了很多类型的关联,我们可以自己定义New rule,不过我在录 制脚本的时候一般把系统的那些都关掉,定义自己的,只是有的时候,它不能自动关联,就 干脆手工作了。需要关联的地方:一般是在有主键,不允许记录重复,和一些主程序中传递 过来的参数,在后面要用到等情况才使用关联的,你可以先执行一遍,如果有些地方不允许 重复,参数值无效,就会出错的,根据错误提示你可以判断出来,就知道需要关联了。一般 需要关联的不多,我现在遇到的就是进程号,以及表的主键。我这里有个Correlation的官 方文档,大家下去可以自己看看。

2.1.8 以录制 Web(Http/Html)协议为例讲述一下 LR 的脚本的录制

LR的脚本是C语言代码,LR有自己的一整套函数接口,可以供外部调用,在VUGen里面敲 Lr_就可以看到了。Web(Http/Html)脚本本身分INIT,ACTION,END三部分,各部分的解释: INIT部分可以理解为初始部分,ACTION可以理解为事务部分,也是测试的主体,END是退出 结束。重复的时候,仅重复action部分。我们一般把登录部分放在init,退出放到end,只会执行一次,或者有的时候,各部分反复的次数不一样,分成多个action,可以单独设定反 复次数。(如果需要在登陆操作设集合点,那么登陆操作也要放到Action 中,因为vuser_init 中不能添加集合点)

 

Init,login
#include "web_api.h" #include "lrw_custom_body.h"
vuser_init()
{ //登录的脚本可以放在这里
}

 录制前的选项设置:

解释:

1.基于浏览器的应用程序推荐使用HTML-based Script, 脚本中采用 HTML页面的形式来表示,这种方式的Script脚本容易维护,容易理解,使用该选项中的 advance中的第一个选项,如果单纯的HTML方式,是不允许使用关联的。

2.不是基于浏览器的应用程序推荐使用URL-based Script,脚本中的表示采用基于URL 的 方式,不是很好阅读。

 

解释:

1.是否记录录制过程中的ThinkTime,如果记录,还可以设置最大值,一般我不记录 这个值。
2.通知Vugen去重新设置每个action之间的Http context,缺省是需要的。

3.完整记录录制过程的log,

4.保存一个本地的snapshot,可以加速显示 5.把html的title放到web_reg_find函数里面
6.支持的字符集标准
7.Http header的录制,我们采用缺省即可,不需要用web_add_header去录制非标准的header 信息。

对录制的content的内容进行filter,不作为resource处理的。

解释:这个就是我前面提到的关联,系统已经预先设置好了一些常见的关联rules,我们录 制脚本之前,可以把系统的都关掉,定义自己的,只是有的时候,它不能自动关联,就干脆 手工关联。这里比较重要,我还有一个专门的PPT文档是详细讲这个的,大家可以到我的网 站上下载。

2.2 脚本录制

现在可以开始录制脚本了,我给出几段已经录制好的脚本。

lr_rendezvous("createpreproduction schedule ");
lr_start_transaction("create pre production schedule");
    web_url("Folder.jsp_4",
        "URL=http://172.17.16.5/xpc71/jsp/com/folder/Folder.jsp",
        "Resource=0",
        "RecContentType=text/html",
        "Referer=http://172.17.16.5/xpc71/LoginAction.do",
        "Snapshot=t10.inf",
        "Mode=HTML",
        LAST);
    web_url("TemplateAdminAction.do",
        "URL=http://172.17.16.5/xpc71/TemplateAdminAction.do?forwardID=1",
        "Resource=0",
        "RecContentType=text/html",
        "Referer=http://172.17.16.5/xpc71/LoginAction.do",
        "Snapshot=t11.inf",
                 "Mode=HTML",
LAST);
//可以自己手工,也可以让 correlate 定义一个动态参数
web_reg_save_param( "WCSParam_Diff2", "LB= name='", "RB='", "Ord=7", "Search=Body", "RelFrameId=1", LAST );
web_submit_form("ScheduleCreationAction.do",
"Snapshot=t12.inf",
ITEMDATA,
"Name=PTName", "Value={schedule_name}", ENDITEM, "Name=headerTempID", "Value=preProductionHeaderTemplate", ENDITEM, "Name=selectHeader", "Value=1", ENDITEM,
        "Name=schTempID", "Value=preProductionDetailTemplate", ENDITEM,
        LAST);
    web_url("Folder.jsp_5",
        "URL=http://172.17.16.5/xpc71/jsp/com/folder/Folder.jsp",
        "Resource=0",
        "RecContentType=text/html",
        "Referer=http://172.17.16.5/xpc71/LoginAction.do",
        "Snapshot=t13.inf",
        "Mode=HTML",
        LAST);
    lr_end_transaction("create pre production schedule", LR_AUTO);
    lr_rendezvous("createcs");
    lr_start_transaction("create cs");
web_submit_data("CostingPreCreateAction.do", "Action=http://172.17.16.5/xpc71/CostingPreCreateAction.do", "Method=POST",
"RecContentType=text/html", "Referer=http://172.17.16.5/xpc71/ScheduleCreationAction.do", "Snapshot=t14.inf",
"Mode=HTML",
ITEMDATA,
"Name=scheduleID", "Value={schedule_id}", ENDITEM, "Name=scheduleName", "Value={schedule_name}", ENDITEM, "Name=VS022264", "Value=Spring 2004", ENDITEM, "Name=VS372264", "Value=ANF", ENDITEM, "Name={WCSParam_Diff2}", "Value=test001", ENDITEM, "Name=dParentID", "Value=", ENDITEM,
"Name=itemID", "Value=", ENDITEM,
"Name=ifRegen", "Value=Y", ENDITEM,
"Name=editable", "Value=true", ENDITEM,
"Name=calendar", "Value=", ENDITEM,
"Name=respPartyID", "Value=", ENDITEM,
"Name=respPartyName", "Value=", ENDITEM,
"Name=listParentID", "Value=-1", ENDITEM,
"Name=shareParty", "Value=", ENDITEM,LAST);
    web_url("menuAction.do_3",
    "URL=http://172.17.16.5/xpc71/menuAction.do?currentMenu=3&operation=changeM
enuOnly",
        "Resource=0",
        "RecContentType=text/html",
        "Referer=http://172.17.16.5/xpc71/LoginAction.do",
        "Snapshot=t15.inf",
        "Mode=HTML",
        LAST);
    web_url("Folder.jsp_6",
        "URL=http://172.17.16.5/xpc71/jsp/com/folder/Folder.jsp",
        "Resource=0",
        "RecContentType=text/html",
        "Referer=http://172.17.16.5/xpc71/LoginAction.do",
        "Snapshot=t16.inf",
        "Mode=HTML",
        LAST);
lr_end_transaction("create cs", LR_AUTO);

脚本里面有 2 个函数,解释一下:1.几个函数的解释:

1) int web_url (const char *Name, const char * url, <List of Attributes>,

[EXTRARES, <List of Resource Attributes>,] LAST ); 这个函数 load 指定的 web 页面 .
*Name:页面的name;

  •  url:页面的 url,Resource:指示 the URL 是否是一个资源。0,不是,1,是。

  •  RecContentType:录制脚本过程中,Header 响应的类型,e.g. text/html,

       application/x- javascript
    
  •  Referer – 参考 web 页的 the URL

  •  Snapshot - snapshot 文件名(扩展名 inf), correlation 的时候要的。

  •  Mode – 录制的级别: HTML or HTTP

  •  Last- 属性列表的结束标志。

2) int web_submit_data ( const char *StepName,//页面文件名, <List of attributes>, ITEMDATA,//Item 数据
<List of data>,
[ EXTRARES, <List of Resource Attributes>,]

LAST );
这个函数以 GET and POST requests 方式发送 form。
*StepName:
这里有个例子:

the web_submit_data function submits a form using the POST method: web_submit_data("customerinfo.asp",
    "Action=http://lazarus/webflight/customerinfo.asp",
    "Method=POST",
    "TargetFrame=",
    "EncType=multipart/www-urlencoded"
    "RecContentType=text/html"
    ITEMDATA,
    "name=flight", "value=6593", ENDITEM,
    "name=reserveFlight", "value=Next >",ENDITEM,
LAST);

2.3 脚本的参数化

如果用户在录制脚本过程中,填写提交了一些数据,比如创建一个新的document。这些 操作都被记录到了脚本中。当多个虚拟用户运行脚本时,都会提交相同的记录,这样做会被 应用禁止,会出错,这样也不符合实际的运行情况,而且有可能引起冲突。为了更加真实的 模拟实际环境,需要各种各样的输入。参数化输入是一种不错的方法

参数化包含以下两项任务:
1 在脚本中用参数取代常量值。
2 设置参数的属性以及数据源。 参数化仅可以用于一个函数中的参量。你不能用参数表示非函数参数的字符串。另外,不是 所有的函数都可以参数化的。

我举一个例子来说明,还是我上面那个脚本:

web_submit_form("ScheduleCreationAction.do",
"Snapshot=t12.inf",
ITEMDATA,
"Name=PTName", "Value=performance0001", ENDITEM, "Name=headerTempID", "Value=preProductionHeaderTemplate", ENDITEM, "Name=selectHeader", "Value=1", ENDITEM,
        "Name=schTempID", "Value=preProductionDetailTemplate", ENDITEM,
        LAST);

因为每次创建文档的时候,需要用不同的名字,系统禁止同名,如果同名就会出错,所以要把PTName值参数化,我们只要选中“performance0001”,然后点鼠标右键, 选择“Replace with a parameter. ”,出现以下窗口: 

参数类型解释:
DateTime:很简单,在需要输入日期/时间的地方,可以用DateTime 类型来替代。其属 性设置也很简单,选择一种格式即可。当然也可以定制格式。
Group Name:暂时不知道何处能用到,但设置比较简单。在实际运行中,LoadRunner 使用该虚拟用户所在的Vuser Group 来代替。但是在VuGen 中运行时,Group Name将会是None Load Generator Name:在实际运行中,LoadRunner 使用该虚拟用户所在Load Generator 的机器名来代替。
Iteration Number:在实际运行中,LoadRunner使用该测试脚本当前循环的次数来代替。 Random Number:随机数。很简单。在属性设置中可以设置产生随机数的范围 Unique Number:唯一的数。在属性设置中可以设置第一个数以及递增的数的大小。 注意:使用该参数类型必须注意可以接受的最大数。例如:某个文本框能接受的最大数为 99。当使用该参数类型时,设置第一个数为1,递增的数为1,但100个虚拟用户同时运行时, 第100 个虚拟用户输入的将是100,这样脚本运行将会出错。注意:这里说的递增意思是各 个用户取第一个值的递增数,每个用户相邻的两次循环之间的差值为1。举例说明:假如起 始数为1,递增为5,那么第一个用户第一次循环取值1,第二次循环取值2;第二个用户第一 次循环取值为6,第二次为7;依次类推。
Vuser ID:设置比较简单。在实际运行中,LoadRunner 使用该虚拟用户的ID 来代 替,该ID 是由Controller 来控制的。但是在VuGen 中运行时,Vuser ID 将会是 –1。
User Defined Function:从用户开发的dll 文件提取数据。

File:需要在属性设置中编辑文件,添加内容,也可以从现成的数据库中取数据

我们将会重点介绍这种参数类型,这也是 LR 的缺省参数类型,就是把准备好的数据放 在文件或者用 sql 语句从数据库中取出来,让 VU 来读取。

 “Select next row ”有以下几种选择:多个VU如何取值
Sequential:按照顺序一行行的读取。每一个虚拟用户都会按照相同的顺序读取 Random:在每次循环里随机的读取一个,但是在循环中一直保持不变

Unique :每个VU取唯一的值。注意:使用该类型必须注意数据表有足够多的数。比 如Controller 中设定20 个虚拟用户进行5 次循环,那么编号为1 的虚拟用户取前5个数, 编号为2 的虚拟用户取6-10 的数,依次类推,这样数据表中至少要有100个数据,否则 Controller 运行过程中会返回一个错误。

Same Line As 某个参数(比如Name):和前面定义的参数Name 取同行的记录。通常 用在有关联性的数据上面。这个也是很有用的,比如有时候我们要求指定VU取读取指定数据, 就可以这样定义:

创建参数文件,共两列,假设userID,DOCID,userid设定取数方式是unique,DOCID则 设成the same line as userid,如果第一行数据为0001,DOC1,则如果用户0001登录成功,在 打开文档时,便会打开DOC1文档。

“Update value on”有如下几种选择:多次迭代如何取值
once 在所有的反复中都使用同一个值,
each iteration 则每次反复都要取新值,
each occurrence 则只要发现该参数就要重新取值,也就是如果一个 action 中有多个 该参数,每遇到一个就要重新取一个值。

第三部分:创建运行场景

3.1 Run-Time Setting

 

 

 

 

 和 TD 的连接,LR 可以很方便的和 TD 连接,把脚本放在 TD 中,

 

3.2 几种场景类型的选择

录制好脚本之后,就可以把脚本加入到场景里面去了,这里首先介绍一下 LR 的场景类 型,LR 有 2 种大的场景类型:

 

  1. Manual Scenario:该项要完全手动的设置场景,这项下面还可以设置为每一个脚本分 配要运行的虚拟用户的百分比,可在Controller的Scenario菜单下设置。

  2. Goal—Oriented Scenario:如果你的测试计划是要达到某个性能指标,比如:每秒多 少点击,每秒多少transactions,能到达多少VU,某个Transaction在某个范围VU(500 -1000)内的反应时间等等,那么就可以使用面向目标的场景。

  3. 选择手工场景,添加脚本到场景中,

 

3.3场景的设置

Design:设计测试场景的静态部分,设置模拟用户生成器、模拟用户数量、 模拟用户组等。

Run:设计测试的动态部分,主要指添加性能计数器,在脚本运行的过程中可以通过这些计 数器反馈的数据。

建立了测试场景后,我们可以对 Edit Schedule 进行设置,设置测试开始执行的时间, 对于手动设计的测试还可以设定它的持续时间,以及何时起用或禁止调用模拟用户。

 

 

3.3.1 设置集合点

如果在脚本中设置了集合点,还需要在Controller中设置集合点策略。在菜单中调出设置集 合点策略的窗口.,脚本运行的时候,在这里可以看到VU的状态。

 

3.3.2 设置集合点策略

 

如果选择场景类型为Goal—Oriented Scenario,添加脚本到场景中,它的场景设置是这样的

 (以上的说明是以选择的目标为Virtual Users 时的) 

 

各种目标类型的应用范围:

Virtual Users Goal

如果需要测试多少人可以同时运行Web 应用,那么推荐定义Virtual Users Goal。运行定义该目标类型的场景和运行Manual 类型的场景类似。

Hits per Second

如果想测试Web Server 的真正实力,推荐定义目标类型为:Hits per Second、Pages perMinute 或者Transactions per Second,这些类型都需要指定一个虚拟用户的最小值和 最大值的范围。

Controller 试图使用最少的虚拟用户来达到定义的目标。如果使用最少的用户,不能 达到目标,Controller 会增加用户数,直到达到定义的最大值。如果使用了最多的虚拟用 户数,定义的目标还没有实现,那么需要增加最大用户数,重新执行场景。

Transactions per Second

可以选择一个在脚本里面已经定义好的事务

Transactions Response Time

如果想知道在多少用户并发访问网站时,事务的响应时间达到性能指标说明书中规定响 应时间的最大值,那么推荐使用Transactions Response Time 类型。指定需要测试的事务 的名
称,虚拟用户数量的最小值和最大值,还有预先定义好的事务的响应时间。

在场景运行中,如果使用了最多的虚拟用户,还不能达到定义的最大响应时间,说明Web Server 还有能力接纳定义的虚拟用户的最多数量;如果在使用了部分虚拟用户,就达到了 定义的最大的响应时间,或者LoadRunner 提示如果使用最多数量的虚拟用户时将要超过最 大响应时间,那么需要重新设计或者修补应用程序,同时可能需要升级Web Server 的软硬 件。


Pages per Minute

每分钟多少页面
如果你定义的类型是Pages per Minute、Hits/Transactions per Second,Controller

首先用最小用户数除以定义的目标,得到一个值,然后确定每个用户应该达到的 hits/transactions或者pages per minute,然后controller 开始按照以下的策略加载用户: 如果选择的是自动的加载虚拟用户,LoadRunner 会首先加载50 个用户。如果定义的最 大用户数小于50,LoadRunner 就会一次加载所有的虚拟用户。 如果选择的是在场景运行一段时间后达到目标,LoadRunner 就会尝试在定义的这段时 间内达到目标,根据时间限制和计算出的每个用户的hits、transactions 或者pages, LoadRunner 确定第一批加载多少用户。 如果选择的是按照一定的阶段达到目标(也就是先在x 长时间内达到y pages/hits,然 后再达到下一个目标),LoadRunner 计算每个用户应该达到的数字后,再确定第一批加载 多少用户。每加载一批用户后,LoadRunner 会判断是否达到这批用户的目标。如果这批用 户的目标没有达到,LoadRunner 重新计算每一个用户应该达到的目标数字后,重新调整下 一批加载用户的数量。默认情况下,LoadRunner 每两分钟加载一批用户。如果Controller 加 载了最多数量的用户还没有达到预定的目标,LoadRunner 会重新计算每个用户的目标,然 后同时运行最大数量的用户,尝试达到预定的目标。

如果出现以下情况,Pages per Minute、Hits/Transactions per Second 类型的场景会置 于“Failed”状态:
Controller 使用了指定的最大数量的用户,并且两次都没有达到目标 所有的用户运行都失败

没有足够的Load Generators 机器(现有的机器已经超载运行的情况下) Controller 增加了几批用户后,pages per minute 或者hits/transactions per second 没有增加
Controlller 加载第一批用户后,定义的目标没有被捕捉到

3.3.3 这里介绍一下多机联合产生负载

通过 Generator 我们可以设定生成模拟用户的机器,这些机器需要安装 LR Generator, 启动 Agent 进程,不需要脚本,只是调用它的资源。这些机器可以是实际存在的,也可是通 过模拟 IP 模拟的机器。模拟 IP 通过 IP Wiazrd 工具生成,在上图中点击 Add,可以添加模 拟的生成器,Connect 即可。

3.3.4 LR 对服务器资源的监视

LR只能监视它支持的服务器的资源,它支持大部分常见的服务器。 System Resource:包括windows平台,Unix平台等
Web Server:包括Apache、IIS、Sun的iplanet等
Application server:包括Weblogic、WebSphere等

Database server:包括DB2,Oracle,Sql server,Sybase等

Java: ejb,J2ee等,需要一个ejbdetector.jar文件 1.对Windows(Win2k server)的监视:

对windows的监视相对比较简单,监视前首先需要用有管理员权限的帐号连接被监 server,例如:net use \\qa-test /user:donny ,输入密码。然后就可以添加计数器, 比较常用的计数器有:
Memory:Available Mbytes 物理内存的可用数(单位 Mbytes)至少要有10% 的物理内存 值

Processor:%Processor Time CPU 使用率。这是查看处理器饱和状况的最佳计数器。显示 所有 CPU 的线程处理时间。如果一个或多个处理器的该数值持续超过 90%,则表示此测试 的负
载对于目前的硬件过于沉重。为多处理器服务器添加该计数器的 0 到 x 个实例。 Processor Queue Length:是指处理列队中的线程数,小于2。处理器瓶颈会导致该值持续 大于2。

Context Switches/sec:如果切换次数到5000*CPU个数和10000*CPU个数中,说明它忙于切 换线程
Network Interface:Bytes Total/sec 为发送和接收字节的速率,包括帧字符在内。判断 网络连接速度是否是瓶颈,可以用该计数器的值和目前网络的带宽比较。

SQL Server2000:%Processor Time,CPU 使用率
General Statistics,Logins/sec,这是每秒登录到 SQL Server 的计数。
SQL Statistics: Batch Requests/sec,每秒收到的 Transact-SQL 命令批数。这一统计信息受所有约束(如I/O、用户数、高速缓存大小、请求每秒收到的 Transact-SQL 命令批 数。这一统计信息受所有约束(如I/O、用户数、高速缓存大小、请求的复杂程度等)影响。 批请求数值高意味着吞吐量很好。

然后添加计数器对话框

 

2.对Unix(Linux等)的监视,需要配置相应的服务器端,可以查看帮助文件,这里就只举 一个例子了。

1) LoadRunner 如何监控Apache,需要修改apache的配置文件httpd.conf.

 <Location /server-status>
        SetHandler server-status
Order deny,allow
Allow from all
Allow from .your-domain.com
</Location>

把这节加在httpd.conf里面, restart apache即可。

第四部分:利用Analysis 分析结果

LR的报表分析功能也异常强大,有各种各样的报表,甚至可以将单个报表组合,也可以 导出到Excel文件和Html文件。这里重点谈谈页面分解和报表组合。

4.1 页面分解

如果某个transaction的时间过长,为了分析问题出在哪里?就可以利用页面分解了,它可 以把每个页面分解成:

DNS解析时间:浏览器访问一个网站的时候,一般用的是域名,需要dns服务器把这个域名解 析为IP,这个过程就是域名解析时间,如果我们在局域网内直接使用IP访问的话,就没有这 个时间了。

Connection:解析出Web Server 的IP地址后,浏览器请求被送到了Web Server,然后 浏览器和Web Server 之间需要建立一个初始化HTTP连接,服务器端需要做2件事:一是接收 请求,二是分配进程,建立该连接的过程就是connection时间。

First Buffer:建立连接后,从Web Server 发出第一个数据包,经过网络传输到客户 端,浏览器成功接受到第一字节的时间就是First Buffer。这个度量时间不仅可以表示Web Server 的延迟时间,还可以表示出网络的反应时间。

Receive:从浏览器接收到第一个字节起,直到成功收到最后一个字节,下载完成止, 这段时间就是receive时间。

其他的时间还有SSL Handshaking(SSL 握手协议,用到该协议的页面比较少)、 ClientTime(请求在客户端浏览器延迟的时间,可能是由于客户端浏览器的think time 或 者客户端其他方面引起的延迟)、Error Time(从发送了一个HTTP 请求,到Web Server发 送回一个HTTP 错误信息,需要的时间)

为了确认问题缘由到底是服务器还是网络,选择“Time to First Buffer Breakdown”,

 发现network时间比Server时间要高的多,从而确定问题是network引起的。 

4.2 报表组合

Analysis 默认的图表都是以时间作为横坐标,然而在分析结果的过程中,我们可能需 要以“运行的用户数”作为横坐标,来比较结果。假如我们要画出 Windows Resources — —VUsers 的图表,可以这样操作。首先打开Windows Resources 图表,然后在图表上点鼠 标右键,选择Merge Graphs。

 出现Merge Graphs 对话框

选择第一项“Overlay”,出现以下的图表,这样是把两个图表进行了合并,两条曲线的纵 轴
共用一个原点,横轴还是时间轴。 选择第二项“Title”,出现以下的图表,这样是把两个图表进行了合并,两条曲线的纵轴 不再共用一个原点,VUsers 的原点在Windows Resouces 的上面,横轴还是时间轴。 选择第三项“Correlate”,LoadRunner 提示信息

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/202401.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EG系列网关+CLC控制器串口远程下载程序操作说明

EG系列网关CLC控制器串口远程下载程序操作说明 前言&#xff1a;本文档主要说明了使用蓝蜂虚拟网络工具远程给PLC下载程序的步骤及其注意事项。使用蓝蜂虚拟网络工具&#xff0c;不仅支持程序的远程下载&#xff0c;同样支持程序的远程上传与在线监控。 注意&#xff1a;蓝蜂…

vivado综合分析与收敛技巧3

1、最优化 RAMB 输入逻辑以允许输出寄存器推断 以下 RTL 代码片段可从块 RAM &#xff08; 实际上为 ROM &#xff09; 生成关键路径 &#xff0c; 其中包含多个止于触发器 (FF) 的逻辑层次。 RAMB单元已在无可选输出寄存器 (DOA-0) 的情况下完成推断 &#xff0c; 这给 R…

漏洞复现--安恒明御安全网关 aaa_local_web_preview 任意文件上传

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

selenium使用记录

本文记录python环境下使用selenium的一些步骤 Step1&#xff1a;安装并配置驱动 pip install selenium # 使用pip在对应python中安装selenium包为了让selenium能调用指定的浏览器&#xff0c;需要下载对应浏览器的驱动程序&#xff08;这里以edge为例子&#xff09; #Firefo…

高效管理文件方法:根据文件大小智能移动至目标文件夹

在日常的工作中&#xff0c;会遇到大量的文件&#xff0c;从几个KB的小文档到几个GB的大数据文件。如何有效地管理这些文件&#xff0c;以便能够快速找到所需的资料&#xff0c;是一项重要的任务。传统的文件管理方式往往会在大量的文件和文件夹中迷失&#xff0c;而无法快速找…

【教程】 一文部署配置并入门 Redis

综述 什么是Redis Redis官网——Redis.io Redis, 作为一个高性能的键值对数据库&#xff0c;主要应用于以下场景&#xff1a; 缓存系统&#xff1a;由于其高速读写能力&#xff0c;Redis 非常适合用作缓存系统&#xff0c;减少数据库负载。 会话存储&#xff08;Session St…

mabatis基于xml方式和注解方式实现多表查询

前面步骤 http://t.csdnimg.cn/IPXMY 1、解释 在数据库中&#xff0c;单表的操作是最简单的&#xff0c;但是在实际业务中最少也有十几张表&#xff0c;并且表与表之间常常相互间联系&#xff1b; 一对一、一对多、多对多是表与表之间的常见的关系。 一对一&#xff1a;一张…

武汉凯迪正大KDZD5289硫化曲线测试仪(电脑无转子硫化仪)

电脑无转子硫化仪 硫化时间测试仪 硫化曲线仪 硫化曲线测试仪 武汉凯迪正大KDZD5289产品概述 KDZD5289硫化曲线测试仪&#xff08;电脑无转子硫化仪&#xff09;采用电脑控制进口温控仪进行准确控温&#xff0c;计算机适时进行数据处理并可进行统计、分析、存储对比等&#xff…

【开源视频联动物联网平台】开箱即用的物联网项目介绍

写一个开箱即用的物联网项目捐献给Dromara组织 一、平台简介 MzMedia开源视频联动物联网平台&#xff0c;简单易用&#xff0c;更适合中小企业和个人学习使用。适用于智能家居、农业监测、水利监测、工业控制&#xff0c;车联网&#xff0c;监控直播&#xff0c;慢直播等场景。…

卷积神经网络(CNN)注意力检测

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据 二、数据预处理1.加载数据2. 可视化数据4. 配置数据集 三、调用官方网络模型四、设置动态学习率五、编译六、训练模型七、模型评估1. Accuracy与Loss图2. …

docker-compose部署zabbix+grafana

1.引言 1.1目的 zabbixgrafana实现图形化监控 2.部署环境 服务器ip服务版本192.168.5.137zabbix-server6.0.21192.168.5.137grafana10.2.2192.168.5.152zabbix-client6.0.21 3.部署zabbix-server 3.1 创建zabbix目录 mkdir zabbix3.2 编写docker-compose文件 cd zabbix…

从0开始学习JavaScript--JavaScript 工厂模式

JavaScript 工厂模式是一种强大的设计模式&#xff0c;它提供了一种灵活的方式来创建对象。本文将深入讨论工厂模式的基本概念、多种实现方式以及在实际应用中的各种场景。 工厂模式的基本概念 工厂模式旨在通过一个函数或方法来创建对象&#xff0c;而不是通过类直接实例化。…

00Hadoop数据仓库平台

在这里是学习大数据的第一站 什么是数据仓库常见大数据平台组件及介绍 什么是数据仓库 在计算领域&#xff0c;数据仓库&#xff08;DW 或 DWH&#xff09;也称为企业数据仓库&#xff08;EDW&#xff09;&#xff0c;是一种用于报告和数据分析的系统&#xff0c;被认为是商业智…

比特币上的有状态多重签名

无需链下通信 介绍 随着区块链和加密货币空间的发展&#xff0c;越来越需要增强安全措施来保护数字资产。 应对这一挑战的突出解决方案之一是多重签名&#xff08;多重签名&#xff09;钱包。 这些钱包在执行交易之前需要多方签名&#xff0c;从而提供额外的安全层来防止未经授…

vue+el-tooltip 封装提示框组件,只有溢出才提示

效果 封装思路 通过控制el-tooltip的disabled属性控制是否提示通过在内容上绑定mouseenter事件监听内容宽度和可视宽度&#xff0c;判断内容是否溢出 封装代码 <template><div style"display: flex" class"column-overflow"><el-tooltip…

linux 讨论题合集(个人复习)

常规文件的权限是什么&#xff1f;如何分配或修改这些权限&#xff1f;文件夹&#xff08;目录&#xff09;的权限是什么&#xff1f;显示常规文件和文件夹的区别 讨论&#xff1a;①常规的文件权限有四种&#xff0c;r可读、w可写、x可执行、-没有权限&#xff1b;②可以使用c…

聚焦清晰度评价指标所用到的各种算法

首先&#xff0c;我想吐槽一下&#xff0c;看了好几篇聚焦评价函数的文章&#xff0c;说到底都是一篇文章转载或者重复上传&#xff0c;介绍了将近 15 种清晰度的算法&#xff0c;原文找了半天都没找到在哪&#xff0c;最多也仅能找到一些比较早的转载。 无参考图像的清晰度评…

ThinkPHP的方法接收json数据问题

第一次接触到前后端分离开发&#xff0c;需要在后端接收前端ajax提交的json数据&#xff0c;开发基于ThinkPHP3.2.3框架。于是一开始习惯性的直接用I()方法接收到前端发送的json数据&#xff0c;然后用json_decode()解析发现结果为空&#xff01;但是打印出还未解析的值却打印得…

(C++)复写零--双指针法

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://le…

C/C++内存管理(含C++中new和delete的使用)

文章目录 C/C内存管理&#xff08;含C中new和delete的使用&#xff09;1、C/C内存分布2、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free3、C动态内存管理3.1、new/delete操作内置类型3.2、new/delete操作自定义类型 4、operator new与operator delete函数5、…