LR 不能选择URLlr11录制脚本为空模式是怎么回事

LR常见问题整理
LR常见问题整理
1、LoadRunner录制脚本时为什么不弹出IE浏览器?
  当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决:启动浏览器,打开Internet选项对话框,切换到高级标签,去掉"启用第三方浏览器扩展(需要重启动)"的勾选,然后再次运行VuGen即可解决问题。
  提示:通常安装Firefox等浏览器后,都会勾选上面得选项,导致不能正常录制。因此建议运行LoadRunner得主机上保持一个干净的测试环境。
2、录制Web脚本时,生成的脚本中存在乱码该如何解决?
  录制脚本前,打开录制选项配置对话框Record-Options,进入到Advanced标签,先勾选"Support
charset",然后选择中支持UTF-8。再次录制,就不会出现中文乱码问题了。
3、HTML-based
script与URL-based script的脚本有什么区别?
  使用"HTML-based
script"的模式录制脚本,VuGen为用户的每个HTML操作生成单独的步骤,这种脚本看上去比较直观;使用"URL-based
script"模式录制脚本时,VuGen可以捕获所有作为用户操作结果而发送到服务器的HTTP请求,然后为用户的每个请求分别生成对应方法。
  通常,基于浏览器的Web应用会使用"HTML-based
script"模式来录制脚本;而没有基于浏览器的Web应用、Web应用中包含了与服务器进行交互的Java
Applet、基于浏览器的应用中包含了向服务器进行通信的JavaScript/VBScript代码、基于浏览器的应用中使用了HTTPS安全协议,这时使用"URL-based
script"模式进行录制。
4、为什么脚本中添加了检查方法Web-find,但是脚本回放时却没有执行?
  由于检查点功能会耗费一定的资源,因此LoadRunner默认关闭了对文本及图像的检查。要想开启检查功能,必须修改运行时的配置Run-time
Setting,进入"Run-time Setting"对话框,依次进入"Internet
Protocol→Preferences",勾选Checks下的"Enable Image and text
check"选项即可,检查执行结果时推荐使用web_reg_find方法。
5、运行时的Pacing设置主要影响什么?
  Pacing主要用来设置重复迭代脚本的间隔时间。共有三种方法:上次迭代结束后立刻开始、上次迭代结束后等待固定时间、按固定或随机的时间间隔开始执行新的迭代。根据实际需要设置迭代即可。通常,没有时间间隔会产生更大的压力。
6、运行时设置Log标签中,如果没有勾选"Enable
logging",则手工消息可以发送吗?
  Enable
logging选项仅影响自动日志记录和通过lr_log_message发送的消息。即使没有勾选,虚拟用户脚本中如果使用lr_message、lr_output_message、lr_error_message,仍然会记录其发出的消息。
7、LoadRunner
8.0版本的VuGen在录制Web Services协议的脚本时一切正常,而回放时报出错误提示"Error:server returned an
incorrectly formatted SOAP response"。这时说明原因引起的?
  造成这种情况的主要原因是LoadRunner 8.0的VuGen在录制Web
Service协议的脚本时存在一个缺陷:如果服务器的操作系统是中文的,VuGen会自动将WSDL文件的头改为&?xml version="1.0"
encoding="zh_cn"?&,因此会有上面的错误提示。
  解决方法:把"LR80WebservicesFPI_setup.exe"和"lrunner_web_sevices_path_1.exe"两个补丁打上即可解决。
8、VuGen支持Netscape的客户证书吗?
  不支持。目前的VuGen 8.0版本中仅支持Internet
Explorer的客户端证书。录制脚本时可以先从Netscape中导出所需的证书,然后将其导入到Internet
Explorer中,并确保以相同的顺序导出和导入这些证书。而且,在每台将要录制或运行需要证书的Web Vuser脚本的计算机上都要重复执行前面的过程。
9、VuGen会修改录制浏览器中的代理服务器设置吗?。
  会修改。在开始录制基于浏览器的Web
Vuser脚本时,VuGen首先会启动指定的浏览器。然后,VuGen会指示浏览器访问VuGen代理服务器。为此,VuGen会修改录制浏览器上的代理服务器设置。默认情况下,VuGen会立即将代理服务器设置更改为Localhost:7777。录制之后,VuGen会将原始代理服务器设置还原到该录制浏览器中。因此,在VuGen进行录制的过程中,不可以更改代理服务器设置,否则将无法正常进行。
10、LoadRunner脚本如何输出当前系统时间?
  LoadRunner提供了char *ctime(const time_t
*time)函数,调用参数为一个Long型的整数指针,用于存放返回时间的数值表示。
  调用语句与返回值如下示例:
  typedef long
    Action()
      {
        & && &&&time_
        & &&
&&&lr_message("Time in seconds since 1/1/70: %ld\n",time(&t));
        &
&& &&&lr_message("System time and date:
%s",ctime(&t));
      }
  输出结果为:
    Time in seconds since 1/1/70:
    System time and date:Wed Jul 25 10:19:28 2007
11、一些Web虚拟用户脚本录制后立刻回放没有任何问题,但是当设置迭代次数大于1时,如果进行回放则只能成功迭代一次。为什么从第二次迭代开始发生错误?
  这种现象多是由于在"Run-time Setting"的"Browse Emulation"的设置中,勾选了"Simulate a new user
on each iteration"及其下面的选项"Clear cache on each
iteration"这两个选项的含义是每次迭代时模拟一个新的用户及每次迭代时清除缓存。
  由于脚本迭代时,init和end只能执行一次,如果每次迭代都模拟一个新的用户并清除缓存,则用户登录信息将一并清除,因此迭代时可能会发生错误。
12、虚拟客户脚本"Run-time
Setting"中的线程和进程运行方式的区别?
  如果选择"Run Vuser as a process",则场景运行时会为每一个虚拟用户创建一个进程;选择"Run Vuser as a
thread"则将每个虚拟用户作为一个线程来运行,在任务管理器中只看到一个mmdrv.exe,这种方式的运行效率更高,能造成更大的压力,时默认选项。
另外,如果启用了IP欺骗功能,则先在Controller中选中Tools菜单下的"Expert
Mode",然后将Tools菜单下的"Options&General"标签页中的IP地址分配方式也设置为与Vuser运行方式一致,同为线程或进程方式。
13、在Controller中运行Web相关测试场景时,经常会有很多超时错误提示,如何处理这类问题?
  这主要有脚本的默认超时设置引起。当回放Web脚本时,有时候由于服务器响应时间较长,会产生超时的错误。这时需要修改脚本的运行时配置。
  进入"Run-time
Setting"对话框后,依次进入"Internet
Protocol→Preference"。然后点击"Options…"按钮,进入高级设置对话框,可以修改各类超时设置的默认值。
14、为什么Windows系统中的CPU、内存等资源仍然充足,但是模拟的用户数量却上不去?
  在Windows计算机的标准设置下,操作系统的默认限制只能使用几百个Vuser,这个限制与CPU或内存无关,主要是操作系统本身规定了默认的最大线程数所导致。要想突破Windows这个限制,须修改Windows注册表。以Windows
Professional为例。
  (1)打开注册表后,进入注册表项HKEY_LOCAL_MACHINE中的下列关键字:System\CurrentControlSet\Control\Session
Manager\SubSystems。
  (2)找到Windows关键字,Windows关键字如下所示:
      %SystemRoot%\system32\csrss.exe
bjectDirectory=\Windows
      SharedSection=2 Windows=On
SubSystemType=Windows
ServerDll=basesrv,1
      ServerDll=winsrv:UserServerDllInitialization,3
ServerDll=winsrv:ConServerDllInitialization,2
      ProfileControl=Off
MaxRequestThreads=16
      SharedSection=2关键字的格式为xxxx,yyyy,zzz。其中,xxxx定义了系统范围堆的最大值(以KB为单位),yyyy定义每个桌面堆得大小。
  (3)将yyyy的设置从3072更改为8192(即8MB),增加SharedSection参数值。
  通过对注册表的更改,系统将允许运行更多的线程,因而可以在计算机上运行更多的Vuser。这意味着能够模拟的最大并发用户数量将不受Windows操作系统的限制,而只受硬件和内部可伸缩性限制的约束。
15、Controller中设置了用户并发数量,但是运行时为何初始化的用户数量少于实际数量?
  主要时设置问题。在Tools→options→Run-time
setting中可以设置每次最多初始化的虚拟用户。如果需要100个并发用户,则将该值设置为大于100的数值。另外,注意LoadRunner相关协议License的更新,确保使用的License能够允许所需要的并发用户数量。
16、如何让场景的用户执行发生错误继续运行,以保证不间断进行压力测试?
  用VuGen打开虚拟用户脚本后,进入"Run-time
Settings"对话框后,依次进入"General→Miscellaneous",可以看到Miscellaneous设置中关于"Error
Handling"的配置。勾选"Continue on error"即可让虚拟用户发生错误继续运行。
17、为什么.NET虚拟用户有时不能在远程主机执行?
  主要时LoadRunner的版本问题。根据笔者的经验,如果是Microsoft Visual Studio
2005开发的虚拟用户,同时LoadRunner客户端的版本低于8.1,执行Controller的主机将会发生错误。
  因此要想正确的运行Microsoft
Visual Studio
2005开发的.NET虚拟用户,客户端最好装8.1以上的版本,Controller的主机则安装8.0和8.1两个版本均可。此外,产生压力的LoadRunner客户端上预先应该安装.NET运行环境,如果Microsoft
Visual Studio 2005开发的是.NET虚拟用户,则应该安装Microsoft .NET Framework SDK v2.0。
18、测试分析结果中会统计Action时间,而实际上可能并不须要这些数据,如何只显示自己定义的用户事务?
  进入脚本的运行时设置,依次进入General→Miscellaneous。默认情况下,自动事务配置"Automatic
Transactions"下有两个选项:第一个是把脚本的Action部分定义为一个事务;第二个时把脚本的每一部分定义为一个事务。去掉这两个勾选后,测试结果将会只显示自己定义的用户事务。
19、测试结果中,Summary和平均事务响应时间图里的各个事务的最大值、平均值、最小值为什么显示不一样?
  主要是受采样时间的影响。Summary里的事务平均响应时间是根据整个场景执行过程得到的数据计算所得,最大值与最小值也是从整个场景中得到的。平均事务响应时间图主要时按照LoadRunner分析出来的采样频率来获取事务响应时间的最大值与最小值,然后计算平均值。
可以通过"Set
Granularity"来修改平均事务响应时间图的采样频率。如果把"Granularity"设为场景执行时间,则统计结果将会一致。
20、统计结果中的总点击量Total
Hits时用户的鼠标点击次数吗?
Hits不时按照用户的鼠标点击次数来计算的,而是按照各个虚拟客户端向后台发起的总的请求数来进行统计的。例如在向服务器请求的一个页面中,如果该页面包含5个图片,用户只要单击鼠标就可以访问该页面,而单个虚拟用户在LoadRunner访问的点击量为1+5=6次。
21、有些Web测试结果分析图(例如每秒返回页面数)在测试结果分析图中无法看到,如何进行配置?
  用VuGen打开虚拟用户脚本后,进入"Run-time Settings"对话框后,依次进入"Internet
Protocol&Preference",可以看到一些Web性能图配置。
  勾选上面得选项后,Controller将会在测试执行过程中生成数据,然后可在Analysis中查看相应的性能结果分析图。
发布此文章仅为传递网友分享,不代表观点,若侵权请联系我们删除,将不对此承担任何责任。
------分隔线----------------------------热门关键词:
热门关键词:
LoadRunner中HTTP协议的录制及两种录制模式的比较
16:52:32 点击: 次&
一、脚本编写  1, “HTML Cbase scrīpt”和“URL-base scrīpt”的区别  1)“HTML Cbase scrīpt”默认模式,为每个用户请求生成单独的函数  如:  Action()   {   web_url("WebTours"   "URL=http://127.0.0.1:1080/WebTours/"   "Resource=0"   "RecContentType=text/html"   "Referer="   "Snapshot=t4.inf"   "Mode=HTML"   LAST)   web_submit_form("login.pl"   "Snapshot=t5.inf"   ITEMDATA   "Name=username" "=jojo" ENDITEM   "Name=password" "=bean" ENDITEM   "Name=login.x" "=53" ENDITEM   "Name=login.y" "=13" ENDITEM   LAST)   return 0   }   2)“URL-base scrīpt”可以捕获所有作为用户操作的结果发送到服务器的HTTP请求,然后一一记录下来。可以捕获非HTML应用程序,例如小程序和非浏览器应用程序。  如:  Action()   {   web_url("WebTours"   "URL=http://127.0.0.1:1080/WebTours/"   "Resource=0"   "RecContentType=text/html"   "Referer="   "Snapshot=t1.inf"   "Mode=HTTP"   LAST)   web_concurrent_start(NULL)   web_url("header.html"   "URL=http://127.0.0.1:1080/WebTours/header.html"   "Resource=0"   "RecContentType=text/html"   "Referer=http://127.0.0.1:1080/WebTours/"   "Snapshot=t2.inf"   "Mode=HTTP"   LAST)   web_url("welcome.pl"   "URL=http://127.0.0.1:1080/WebTours/welcome.plsignOff=true"   "Resource=0"   "RecContentType=text/html"   "Referer=http://127.0.0.1:1080/WebTours/"   "Snapshot=t5.inf"   "Mode=HTTP"   LAST)   web_concurrent_end(NULL)   web_concurrent_start(NULL)   web_url("hp_logo.png"   "URL=http://127.0.0.1:1080/WebTours/images/hp_logo.png"   "Resource=1"   "RecContentType=image/png"   "Referer=http://127.0.0.1:1080/WebTours/header.html"   "Snapshot=t3.inf"   LAST)   web_url("webtours.png"   "URL=http://127.0.0.1:1080/WebTours/images/webtours.png"   "Resource=1"   "RecContentType=image/png"   "Referer=http://127.0.0.1:1080/WebTours/header.html"   "Snapshot=t4.inf"   LAST)   web_concurrent_end(NULL)   web_concurrent_start(NULL) web_url("home.html"   "URL=http://127.0.0.1:1080/WebTours/home.html"   "Resource=0"   "RecContentType=text/html"   "Referer=http://127.0.0.1:1080/WebTours/welcome.plsignOff=true"   "Snapshot=t6.inf"   "Mode=HTTP"   LAST)   web_url("nav.pl"   "URL=http://127.0.0.1:1080/WebTours/nav.plin=home"   "Resource=0"   "RecContentType=text/html"   "Referer=http://127.0.0.1:1080/WebTours/welcome.plsignOff=true"   "Snapshot=t7.inf"   "Mode=HTTP"   LAST)   web_concurrent_end(NULL)   web_url("mer_login.gif"   "URL=http://127.0.0.1:1080/WebTours/images/mer_login.gif"   "Resource=1"   "RecContentType=image/gif"   "Referer=http://127.0.0.1:1080/WebTours/nav.plin=home"   "Snapshot=t8.inf"   LAST)   web_submit_data("login.pl"   "Action=http://127.0.0.1:1080/WebTours/login.pl"   "Method=POST"   "RecContentType=text/html"   "Referer=http://127.0.0.1:1080/WebTours/nav.plin=home"   "Snapshot=t9.inf"   "Mode=HTTP"   ITEMDATA   "Name=userSession" "=7643fAADzHHpAfDAAccpAzcD" ENDITEM   "Name=username" "=jojo" ENDITEM   "Name=password" "=bean" ENDITEM   "Name=JSFormSubmit" "=off" ENDITEM   "Name=login.x" "=56" ENDITEM   "Name=login.y" "=11" ENDITEM   LAST)   web_concurrent_start(NULL)   web_url("login.pl_2"   "URL=http://127.0.0.1:1080/WebTours/login.plintro=true"   "Resource=0"   "RecContentType=text/html"   "Referer=http://127.0.0.1:1080/WebTours/login.pl"   "Snapshot=t10.inf"   "Mode=HTTP"   LAST)   web_url("nav.pl_2"   "URL=http://127.0.0.1:1080/WebTours/nav.plpage=menu&in=home"   "Resource=0"   "RecContentType=text/html"   "Referer=http://127.0.0.1:1080/WebTours/login.pl"   "Snapshot=t11.inf"   "Mode=HTTP"   LAST)   web_concurrent_end(NULL)   web_concurrent_start(NULL)   web_url("in_home.gif"   "URL=http://127.0.0.1:1080/WebTours/images/in_home.gif"   "Resource=1"   "RecContentType=image/gif"   "Referer=http://127.0.0.1:1080/WebTours/nav.plpage=menu&in=home"   "Snapshot=t12.inf"   LAST)   web_url("flights.gif"   "URL=http://127.0.0.1:1080/WebTours/images/flights.gif"   "Resource=1"   "RecContentType=image/gif"   "Referer=http://127.0.0.1:1080/WebTours/nav.plpage=menu&in=home"   "Snapshot=t13.inf"   LAST)   web_url("signoff.gif"   "URL=http://127.0.0.1:1080/WebTours/images/signoff.gif"   "Resource=1"   "RecContentType=image/gif"   "Referer=http://127.0.0.1:1080/WebTours/nav.plpage=menu&in=home"   "Snapshot=t14.inf"   LAST)   web_url("itinerary.gif"   "URL=http://127.0.0.1:1080/WebTours/images/itinerary.gif"   "Resource=1"   "RecContentType=image/gif"   "Referer=http://127.0.0.1:1080/WebTours/nav.plpage=menu&in=home"   "Snapshot=t15.inf"   LAST)   web_concurrent_end(NULL)   return 0   }   3)如何选择?什么时候选择url的录制方式:  * 不是基于浏览器的  * 基于浏览器但是包含javascrīpt,并且发送了请求到服务器  * 使用了https 安全协议  4)两种脚本的内容比较:  * http脚本直观,易于理解和维护  * url 内容多,可伸缩性强,记录了更详细的用户操作信息。  2,HTML 高级选项:  1) 默认是选择描述用户行为的脚本  2) 仅包含明确的URL脚本,录制结果如下:  Action()   {   web_url("WebTours"   "URL=http://127.0.0.1:1080/WebTours/"   "Target="   "Resource=0"   "RecContentType=text/html"   "Referer="   "Snapshot=t1.inf"   "Mode=HTML"   LAST)   web_url  "URL=/download"Target="   "Resource=0"   "RecContentType=text/html"   "Referer="   "Snapshot=t2.inf"   "Mode=HTML"   LAST)   web_url.htm_2"   "URL=/download/"Target="   "Resource=0"   "RecContentType=text/html"   "Referer="   "Snapshot=t3.inf"   "Mode=HTML"   LAST)   web_url"URL=/download/"   "Target="   "Resource=0"   "RecContentType=text/html"   "Referer="   "Snapshot=t4.inf"   "Mode=HTML"   LAST)   web_submit_data("login.pl"   "Action=http://127.0.0.1:1080/WebTours/login.pl"   "Method=POST"   "Target="   "RecContentType=text/html"   "Referer=http://127.0.0.1:1080/WebTours/nav.plin=home"   "Snapshot=t5.inf"   "Mode=HTML"   ITEMDATA   "Name=userSession" "=5848fAADziVpffiDDDDDDAAccpAiQDf" ENDITEM   "Name=username" "=jojo" ENDITEM   "Name=password" "=bean" ENDITEM   "Name=JSFormSubmit" "=off" ENDITEM   "Name=login.x" "=52" ENDITEM   "Name=login.y" "=8" ENDITEM   LAST)   return 0   } 3,录制header   默认设置是不录制,选择需要录制的Headers,以便服务器能够正确处理编码信息。需要注意的是“accept-language”像websphere这类服务器会根据HTTP 请求中的Header来确定编码。
阅读上一篇:阅读下一篇:
找课114全国免费课程咨询热线,为您推荐口碑最好的中小学课外辅导、少儿英语、成人英语、出国留学机构(其他课程咨询恕不接待)
北京 400-001-&上海 400-001-&广州 400-001- 深圳 400-001-&天津 400-001-&杭州 400-001- 南京 400-001-&苏州 400-001-&济南 400-001- 青岛 400-001-&武汉 400-001-&重庆 400-001-
成都 400-001-&西安 400-001-&宁波 400-001-大连 400-001-
温馨提示:拨打招生免费咨询电话方法,先拨通400-001-9911,再根据语音提示按分机号,等待接通,欢迎您的来电。(电话接听时间段:周一至周日上午9:00―晚上20:00)
??????????
????????????????????
??????????
??????????
???????????????
音频公开课
5780
2071
2709
1787
2251
2297
3673
2376
7463
3098
4699
4417
4053
10380
8867
8702
7884
14961
12824
12755
三百六十行,欢迎各培训机构加盟LoadRunner中的录制模式设置_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
23页2下载券12页免费3页免费3页免费14页免费 27页1下载券3页免费3页免费2页免费3页免费
喜欢此文档的还喜欢134页1下载券13页免费16页1下载券11页免费14页免费
LoadRunner中的录制模式设置|说​明​了​L​o​a​d​R​u​n​n​e​r​中​的​录​制​模​式​设​置
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢LR技术 - 海 - 51Testing软件测试网 51Testing软件测试网-中国软件测试人的精神家园 - Powered by X-Space
海是我向往的地方,吸纳和咆哮是他的魅力!!!
& 14:36:14
1.概述&&&&&&&在山东BOSS性能压力过程中,发现脚本对于整个压力测试过程的重要性,一个压力测试脚本录制和编辑修改得怎么样直接影响后面压力测试的执行。通常情况下,脚本应尽可能的精简,就像写代码一样。针对BOSS系统的特点,认为把单一业务录制成一个Action,并在脚本中添加Transaction,Find检查(可以采用URL-based scrīpt方式录制并事先设定),Rendezvous,参数化等基本元素,然而有时我们会发现光有这些基本元素还不能满足我们的要求。比如在Controller中运行我们的脚本时,一旦压力过大或某种原因导致某一业务失败,而此时我们很想尽快地找出错误的原因。当然此时我们第一想到的是,查找,但是有时发现查找日志很不方便,因此我们希望寻求一种更快捷的方式,希望能直接从Controller的Errors错误中找到出错的服务号码、在第几次Iteration的哪个Transaction出错。实现的方式,当然是通过简单的编程来调用错误日志里的信息,另外本文中还简单介绍了关于工具使用的一些常用注意事项、脚本处理技巧和一些常用性能参数的分析及中机器瓶颈的定义和查看机器瓶颈的相关命令。&&&&&&&下面再具体的一一介绍。2.一个规范的性能测试脚本就像一段规范的程序代码一样,需要基本的说明信息:在下面要介绍的脚本中,我把这些信息以注释的形式放在vuser_init最前面:/*@corporation:Copyright By *** Technologies CO.,LTD. All Rights Reserved.@Athour:XuLinLin@Date:@Name:异地缴费压力测试脚本@Parameter:BOSSURL,LogName,PhoneNum,iteration,FanHui@Data:BOSSURL:BOSSURL. //由于BOSS压力测试前台展现环境多,故将地址也参数化。LogName:LogName. //登录用操作员,选择具备异地缴费权限的操作员,这里选择的是德州操作员300个。PhoneNum:PhoneNum. //用于异地缴费的服务号码,这里选择的是烟台的正常在用的标准全球通号码3000个。iteration:iteration. //用于压力测试出错时,打印出错所在的循环次数。@Descrīption:此脚本用于测试异地缴费的性能及稳定性,选用德州的操作员对烟台的标准全球通号码进行异地缴费,目标是通过vuser模仿真实操作员进行异地缴费,达到验证或测试系统性能和稳定性的目的。@Notes:脚本的录制使用的是LoadRunner8.0的VU,采用的是URL-based scrīpt方式,需要特别注意的是Recording Options(按Ctrl+F7)的Advanced选项里的Surport Charset一般情况默认为不选,除非字符集合采用的是国际标准才选中UTF-8选项,否则会出现汉字乱码现象。*/3.通常情况下,任何业务必须在登陆成功后才能做,所以有必要对登陆成功与否进行判断:下面我从脚本中取出相关部分进行简单介绍:vuser_init(){ //定义变量用于判断登陆是否成功web_reg_find("Text="山东移动BOSS"",LAST);…….…….web_submit_data("reguserAction.do", //登陆提交数据Action。"Action="http://{BOSSURL}/boss/reguserAction.do"","Method="POST"","RecContentType="text/html"","Referer="http://{BOSSURL}/boss/index.jsp"","Snapshot="t12.inf"","Mode="HTTP"",ITEMDATA,"Name="logname"", "Value="{LogName}"", ENDITEM,"Name="password"", "Value=", ENDITEM,LAST);status = web_submit_data("reguserAction.do", //取成功与否标志"Action="http://{BOSSURL}/boss/reguserAction.do"","Method="POST"","RecContentType="text/html"","Referer="http://{BOSSURL}/boss/index.jsp"","Snapshot="t12.inf"","Mode="HTTP"",ITEMDATA,"Name="logname"", "Value="{LogName}"", ENDITEM,"Name="password"", "Value=", ENDITEM,LAST);if (status ="=" LR_FAIL) //一旦登陆失败,脚本给出提示报错信息。{lr_error_message("错误信息: %s", "不能正常登陆!");return -1;}}4.事务的定义,很简单,也很有必要,尽量是每个定义的事物符合逻辑和小。在下面的脚本中,在异地缴费这一业务中定义了两个Transaction:准备异地缴费数据和提交异地缴费,见如下脚本代码:lr_start_transaction("准备异地缴费数据");web_set_max_html_param_len("4096");……….web_submit_data("chargeacc.do","Action="http://{BOSSURL}/boss/charge/commonbusiness/acccharge/chargeacc.do?act=queryaccount"","Method="POST"","RecContentType="text/html"","Referer="http://{BOSSURL}/boss/charge/commonbusiness/acccharge/acccharge.jsp?act=first"","Snapshot="t74.inf"","Mode="HTTP"",ITEMDATA,"Name="isconfirm"", "Value="no"", ENDITEM,"Name="chargetype"", "Value="telnumber"", ENDITEM,"Name="telnumber"", "Value="{PhoneNum}"", ENDITEM,"Name="nowfee"", "Value="0.0"", ENDITEM,"Name="factfee"", "Value=", ENDITEM,"Name="totalfee"", "Value="0.0"", ENDITEM,LAST);lr_end_transaction("准备异地缴费数据", LR_AUTO);5.增强脚本,对脚本进行简单的编程。增强脚本,对脚本进行简单的编程,为性能或压力测试提供方便,这也是写本文的宗旨,下面对此做简单的介绍:&&&&&&& 5.1首先,定义成功与否的判断标志或字符串。&&&&&&&在此,我把判断成功与否的标志定义在异地缴费Action最前面,具体定义如下:char fanhuiflag[30]="操作业务数据成功!";但是大家可能会问,字符串"操作业务数据成功!"从何处而来,可以肯定的不能凭空想象,成功标志可从两三种方式来取得:第一种:也是最简单的一种,直接从脚本中取得,具体操作是以View Tree方式找到相关的界面,然后从Server Response的Snapshot的Body里去取。见下面的:注:Snapshot在录制前要将Recording Options&Advanced里的Save snapshot resources locally选项选中。&&&&&&&&第二种方式,从脚本代码中去取,即取find函数中相关字符串,具体做法是,找到在提交事件前的web_reg_find函数,然后从中取相关字符串。web_reg_find("Text="---------操作业务数据成功!--------"",LAST);值得注意的是要有web_reg_find函数,可以在录制前选中Recording Options&Advanced里的Generate web_reg_find functions for page titles选项。&&&&&&&第三种方式,从本地的snapshot里去取,具体操作,首先找到提交数据事件相关脚本,找到snapshot文件的名称,然后从本地的data文件里去找这个snapshot文件,然后丛中找到我们需要的字符串。web_reg_find("Text="---------操作业务数据成功!--------"",LAST);…….web_submit_data("chargeacc.do_3","Action="http://{BOSSURL}/boss/charge/commonbusiness/acccharge/chargeacc.do?act=submit&atype=commitdata"","Method="POST"","RecContentType="text/html"","Referer="http://{BOSSURL}/boss/charge/commonbusiness/acccharge/chargeacc.do?act=querycustomer"","Snapshot="t129.inf"","Mode="HTTP"",ITEMDATA,"Name="isconfirm"", "Value="no"", ENDITEM,"Name="chargetype"", "Value="telnumber"", ENDITEM,"Name="telnumber"", "Value=", ENDITEM,"Name="nowfee"", "Value="8.8"", ENDITEM,"Name="factfee"", "Value="0.00"", ENDITEM,"Name="totalfee"", "Value="8.8"", ENDITEM,"Name="accountno"", "Value="{WCSParam_Diff1}"", ENDITEM,"Name="factpay"", "Value="8.8"", ENDITEM,"Name="grantpercent"", "Value=", ENDITEM,"Name="grantfee"", "Value="0"", ENDITEM,"Name="takecash"", "Value="8.8"", ENDITEM,"Name="zero"", "Value="0"", ENDITEM,"Name="paytype"", "Value="Cash"", ENDITEM,"Name="remark"", "Value=", ENDITEM,"Name="invoice"", "Value="joininvoice"", ENDITEM,LAST);&&&&&&& 5.2设置和保存判断成功与否的参数,这也是最关键的地方。有一点大家都很清楚,业务成功返回的字符串和失败返回的字符串是不同的,我们所要做的是将返回的字符串做为参数保存下来,然后拿这个参数和我们事先定义好的成功的标志做比较,有两种方式可以设置和保存这一参数,下面简单介绍:第一种方式也是最准确的方式,是以View Tree方式找到相关的界面,然后从Server Response的Snapshot的Body里的成功的返回标志,然后对其进行Create Parameter,这样LoadRunner会自动在脚本中添加web_reg_save_param函数,具体如下:// [WCSPARAM WCSParam_Text2 24操作业务数据成功!_Text2] Parameter {WCSParam_Text2} created by Correlation Studioweb_reg_save_param("WCSParam_Text2","LB="---------"","RB="-"","Ord="1"","RelFrameId="1"","Search="Body"",LAST);&&&&&&&&第二种方式是在提交事件前添加web_reg_save_param函数,具体操作是在提交事件前右击鼠标选择Insert Before选项,然后在弹出的对话框中选择Services里的web_reg_save_param选项,单击OK按纽,然后在弹出的对话框中输入相关的数据。&&&&&&&& 5.3编写相关判断代码段。&&&&&&&在已经定义好判断字符串和设置和保存好成功与否的标志字符串参数后,编写相关判断代码段,这也是最关键的地方,具体代码段如下:if (strcmp(fanhuiflag,lr_eval_string("{WCSParam_Text2}"))!="0){lr_error_message("消息: %s,在第%s次循环时出错,出错号码:%s", "提交异地缴费数据失败!", lr_eval_string("{iteration}"), lr_eval_string("{PhoneNum}"));}简单解释如下:fanhuiflag:前面已经定义好的成功标志字符串的数组名,当然前面也可以用指针来实现,这里不做介绍。WCSParam_Text2:为实现设置和保存好的成功与否返回的字符串的参数;PhoneNum:服务号码的参数化,具体为电话号码。关于参数化,这里不做分析和解释部分。Iteration:为了定位具体的循环而设置的参数。Strcmp函数:LoadRunner自带的字符串比较函数,相等时返回0lr_eval_string函数:LoadRunner自带求字符串函数,函数格式为char * lr_eval_string (const char * instring );(另一种判断方式:先事先定义好int rc="1;" char *fanhuiflag="操作业务数据成功!";然后在定义事务的结尾进行判断:rc="strcmp(str_tip,lr_eval_string(""{re_str_tip}"));if(rc="=0)"{lr_end_transaction("异地缴费_提交", LR_PASS);}else{lr_error_message("异地缴费_提交失败,号码为:%s",lr_eval_string("{msisdn}"));lr_end_transaction("异地缴费_提交", LR_FAIL);}//lr_end_transaction("异地缴费_提交",LR_AUTO);)&&&&&&& 5.4验证我们的需求是否实现&&&&&&&下面简单介绍,整个验证过程,在确保脚本正确和测试环境正常的情况下,我们先在VU里验证下是否真正实现了我们想要的功能,为了方便,我特地将判断条件该为="=而不是!=,通过查看日志来检查。&&&&&&&首先,选中菜单栏里的Run-time Settings子菜单,设置里面的Log选项,选中Enable Logging和Always send messages和Extended log及Parameter substitution。设置Run Logic里的Number of Iterations为2,然后运行,并查看日志。可以得到如下的日志(只取了关键部分的):第一次循环关键部分:YiDiJiaoFei.c(598): Notify: Transaction "提交异地缴费数据" ended with "Fail" status (Duration: 4.8459 Wasted Time: 0.0060).YiDiJiaoFei.c(605): Notify: Parameter Substitution: parameter "WCSParam_Text2" = "操作业务数据成功!"YiDiJiaoFei.c(607): Notify: Next row for parameter iteration = 1 [table = iteration].YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "iteration" = "1"YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "PhoneNum" = ""YiDiJiaoFei.c(607): Error:消息:提交异地缴费数据失败!,在第1次循环时出错,出错号码:第二次循环关键部分:YiDiJiaoFei.c(598): Notify: Transaction "提交异地缴费数据" ended with "Fail" status (Duration: 4.2347 Wasted Time: 0.0064).YiDiJiaoFei.c(605): Notify: Parameter Substitution: parameter "WCSParam_Text2" = "操作业务数据成功!"YiDiJiaoFei.c(607): Notify: Next row for parameter iteration = 2 [table = iteration].YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "iteration" = "2"YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "PhoneNum" = ""YiDiJiaoFei.c(607): Error:消息:提交异地缴费数据失败!,在第2次循环时出错,出错号码:&&&&&&&下面验证执行时,能正确找到出错的号码信息,将脚本加入到场景后,同样设置好Run-time Settings。&&&&&&&设置结果保存路径等相关信息,按Start Scenario执行场景,等出错是单击右上角的Errors,然后选中错误信息再按Details按纽查看错误信息。6.怎么样使多台产生vuser的测试机均匀地对被测试的系统施加压力?在测试的过程中,为了尽可能减少或者避免本身的测试机成为测试过程中的瓶颈,需要使用多台测试机产生vuser对被测试系统施加压力,下面对操作步骤做简单介绍:&&&&&&&在默认模式下使用controller添加多台Generators机器时,不管你怎么加,最终能真正起作用的只有一台(10.19.180.2/3/4或localhost):为了让10.19.180.2/3/4机器同时能真正被添加进去,我们需要做以下几步:改变场景模式,将组模式()改变为百分比模式(percentage mode),具体做法是,选择Scenario菜单下的Convert Scenario to the Percentage Mode;然后,在已经添加好的Load Generators机器列表中同时选择你想选择的机器;最后,点OK按钮就可以得到我们所要的结果了。当然,如有必要我们还可以把场景模式改为Vuser Group Mode,具体做法如下:选择Scenario菜单下的Convert Scenario to the Vuser Group Mode;然后在弹出的对话框中,单击Yes按钮可以得到如下结果,到此为止,添加多台Load Generators测试机整个过程就完成了,其实很简单,关键是你发现了没有。7.怎么样在关联时取列表的最后一个值(在测试重打发票取流水号时需要)?在压力测试脚本的关联过程中,我们有时可能需要关联最新的值(如最新的流水号,通常情况下,最新的流水号放在列表的最下方),所以找最新的流水号就是最列表最下方,如果保存在数组里,那就是找index值最大的那个元素。下面以重打发票(注:具体流程为先缴费,然后查询缴费历史,然后从缴费历史里找到最新的流水号,然后使用此流水号进行重打发票)为例对整个过程做详细的介绍:首先,在缴费历史里找到需要关联的流水号并关联之,具体做法如下,7.1以Tree View方式打开脚本并在对应事件的Page View里找到最新的流水号&&&&&&&找到我们需要关联的流水号(这里为536dxwf0000)后,需要把它给关联,(因为返回的值是事后才知道的,且对于不同的电话号码,对应的返回值不同,所以对于这样的值是需要关联的。)具体做法是打开Server Response页面并在Body里找到需要关联的流水号,然后选中此流水号并在右键弹出的菜单中使用Create Parameter关联之。&7.2单击是(Y)按钮,对应的脚本中会增加如下内容。&&&&&&&单击View scrīpt图标以scrīpt模式查看关联情况。7.3到此为止脚本中多出如下代码段,下面对它做一定的分析:web_reg_find("Text="缴费历史查询"",LAST);// [WCSPARAM WCSParam_Text1 23 536dxwf0000] Parameter {WCSParam_Text1} created by Correlation Studioweb_reg_save_param("WCSParam_Text1","LB="formnum="","RB=\"","Ord=8","RelFrameId=1","Search=Body",LAST);//后面的内容为注释部分,说明流水号536dxwf0000已经关联并保存到WCSParam_Text1参数中。&&&&&&& web_reg_save_param()为LoadRunner的保存参数所用的函数,其作用是将返回流水号保存到WCSParam_Text1参数中,以便使用不同的号码进行缴费历史查询出来的流水号能随着时间的变化流水号也跟着变化,而不是录制脚本时的536dxwf0000,这样可以避免在重打发票时不会报诸如此流水号不存在等类似错误信息。然而现在的问题是怎么将此流水号对应到重打发票对应的地方。另一个问题是,不是所有的号码缴费后查询到的流水号数量都和录制脚本时查询到的流水号相同,事实上每做一笔除查询类的操作都会有一个流水号。而我们关注的是怎么取到最新的缴费的流水号,下面详细介绍相关步骤。5.1修改web_reg_save_param()函数相关部分,很简单,把"Ord="8"",改为"Ord=ALL",目的是找最TOP的那个参数值。5.2光保存和取参数还不够,我们需要把参数能正确传递到重打发票对应的地方,为此我采取的做法如下:&&&&&&&在缴费历史事件脚本最前面定义两个变量,目的是为了将流水号以字符串的形式保存在变量里(因为LoadRunner不支持在web_submit_data()函数里直接使用变量):具体做法是:char WCSParam_Text1Pram[50]; //保存取到的流水号char WCSParam_Text1PramVal[50]; //保存以"Value="流水号""取到的流水号。&&&&&&&将关联好的流水号存到变量里,在此的做法是在对应的web_submit_data()函数后添加如下代码段:lr_message("WCSParam_text1:%s",lr_eval_string("{WCSParam_Text1}"));//打印出关联的参数WCSParam_Text1的值。sprintf(WCSParam_Text1Pram,"{WCSParam_Text1_%s}",lr_eval_string("{WCSParam_Text1_count}"));//把取到流水号保存到WCSParam_Text1Pram里,具体形式为sprintf(WCSParam_Text1PramVal,"Value="%s"",lr_eval_string(WCSParam_Text1Pram));//组合流水号和”Value=”并保存到WCSParam_Text1PramVal变量中。lr_message("The value argument is : %s", WCSParam_Text1PramVal);//打印出字符串变量WCSParam_Text1PramVal的值。&5.3找到重打发票中响应的流水号,并把其中的"Value="536dxwf0000""替换成WCSParam_Text1PramVal,在这里总共有两处。&&&&&&&&到此为止,流水号的关联已经基本上处理完毕,下面我们执行脚本,来验证我们想要的是不是真的有效。(注,参数化的问题在本文中不做具体介绍)为了看到明显的效果,我们需要将日志的处理做简单设置。&&&&&&&然后执行脚本,查看相关执行日志,可以得到类似下面得消息。&8.使用LoadRunner一些常用的注意事项:Note1:VuGen仅能录制平台上的会话,但是,录制的Vuser脚本既可以在Windows平台上运行,也可以在UNIX平台上运行。通用Vuser函数和特定于协议的函数,它们共同构成了LoadRunner API,并使Vuser能够直接与服务器通信。Note2:用于运行Vuser脚本的C解释器仅支持ANSI C语言。它不支持Microsoft对ANSI C的任何扩展。通常情况下,可以将登录到服务器的活动录制到vuser_init部分中、将客户端活动录制到Actions部分中,并将注销过程录制到vuser_end部分中。Note3:只能向Action部分(而不是init或end部分)添加集合。Note:不要从事务内部发送消息,因为这可能使事务执行时间变长,并扭曲事务结果。Note4:如果使用日志运行时设置修改脚本的调试级别,则lr_message、lr_output_message和lr_log_message函数的行为将不会更改,它们将继续发送消息。Note5:录制Vuser脚本时,Vuser脚本中将不生成lr_think_time语句。Note6:VuGen新建参数,但不会自动替换任何在脚本中选定的字符串。Note7:不要将参数命名为unique,因为该名已被VuGen使用。Note8:如果在常规运行时设置文件夹中将“错误处理”设置为“出现错误时仍继续”,则错误消息仍将被发送到输出窗口。Note9:因为生成的服务器消息很长,而且日志记录会降低系统的运行速度,所以请仅为脚本中特定的代码块激活服务器消息日志记录功能。Note10:启用“出现错误时仍继续”功能时,将覆盖0严重级别;即使发生错误,也将继续执行脚本。然而,如果禁用了“出现错误时仍继续”功能,但将严重级别指定为1,则当发生数据库错误时仍将继续执行脚本。Note11:下列协议不是线程安全协议:Sybase-Ctlib、Sybase-Dblib、Informix、Tuxedo和PeopleSoft-Tuxedo。Note12:对于支持树视图的协议(如“视图”菜单所示),在树视图中运行Vuser脚本时,VuGen将从Vuser脚本中的第一个图标开始运行该脚本。Note13:要显示运行时查看器,必须安装Microsoft Internet Explorer 4.0或更高版本。Note:Vuser生成“结果摘要”报告时,事务时间可能会增加。Vuser可以仅在从VuGen运行时才生成“结果摘要”报告。使用Controller运行Web Vuser脚本时,Vuser不能生成报告。Note14:当使用Javascrīpt和VBscrīpt Vuser时,在脚本中用到的COM对象必须完全的兼容。这使下列情况成为了可能:一个应用程序操纵另一个应用程序中的对象,或者公开对象以便操纵它们。9.性能参数解析:WEB资源参数&&&&&&&每秒点击次数:中Vuser每秒向Web服务器提交的HTTP请求数,依据点击次数来评估Vuser产生的负载量。&&&&&&&吞吐量:案运行过程中服务器上每秒的吞吐量。吞吐量的度量单位是字节,表示Vuser在任何给定的某一秒上从服务器获得的数据量,依据服务器吞吐量来评估Vuser产生的负载量。&&&&&&&每秒HTTP响应数:中每秒从Web服务器返回的HTTP状态代码号(表示HTTP请求的状态,例如“the request was successful”、“the page was not found”)&&&&&&&每秒页面数:每秒钟从服务器下载的网页数,依据下载的页面数来评估Vuser产生的负载量。&&&&&&&每秒重试次数:中每秒钟内服务器尝试的连接次数,在下列情况下将重试服务器连接:初始连接未经授权、要求代理服务器身份验证、服务器关闭了初始连接、初始连接无法连接到服务器或者服务器最初无法解析负载生成者的IP地址。&&&&&&&连接数:每个时间点上打开的TCP/IP连接数。&&&&&&&每秒SSL连接数:每秒打开的新的以及重新使用的SSL连接数。当对安全服务器打开TCP/IP连接后,浏览器将打开SSL连接,因为新建SSL连接需要消耗大量的资源,所以应该尽量少地打开新的SSL连接。网页细分图&&&&&&&注意:由于要从客户端测定服务器时间,因此,如果发送初始HTTP请求到发送第一次缓冲这一段时间内网络性能发生变化,则网络时间可能会影响此测定。因此,所显示的服务器时间是一个估计值,可能不太精确。DNS解析:显示使用最近的DNS服务器将DNS名称解析为IP地址所需的时间。“DNS查找”度量是指示DNS解析问题或DNS服务器问题的一个很好的指示器。&&&&&&&连接:显示与包含指定URL的Web服务器建立初始连接所需的时间。连接度量是一个很好的网络问题指示器。此外,它还可表明服务器是否对请求作出响应。&&&&&&&第一次缓冲:显示从初始HTTP请求(通常为GET)到成功收回来自Web服务器的第一次缓冲时为止所经过的时间。第一次缓冲度量是很好的Web服务器延迟和网络滞后指示器。注意:由于缓冲区大小最大为8K,因此第一次缓冲时间可能也就是完成元素下载所需的时间。&&&&&&& SSL握手:显示建立SSL连接(包括客户端hello、服务器hello、客户端公用密钥传输、服务器证书传输和部分可选阶段)所用的时间,自此点之后,客户端与服务器之间的所有通信都将被加密。SSL握手度量仅适用于HTTPS通信。&&&&&&&接收:显示从服务器收到最后一个字节并完成下载之前经过的时间。“接收”度量是很好的网络质量指示器(查看用来计算接收速率的时间/大小比率)。&&&&&&& FTP验证:显示验证客户端所用的时间。如果使用FTP,则服务器在开始处理客户端命令之前,必须验证该客户端。“FTP验证”度量仅适用于FTP协议通信。&&&&&&&客户端时间:显示因浏览器思考时间或其他与客户端有关的延迟而使客户机上的请求发生延迟时,所经过的平均时间。&&&&&&&错误时间:显示从发出HTTP请求到返回错误消息(仅限于HTTP错误)这期间经过的平均时间。&&&&&&&系统资源(UNIX资源参数):CPU utilization :CPU的使用时间百分比Disk rate :磁盘传输速率Paging rate :每秒钟读入物理内存或写入页面文件中的页数Page-in rate :每秒钟读入到物理内存中的页数Page-out rate :每秒钟写入页面文件和从物理内存中删除的页数Collision rate :每秒钟在以太网上检测到的冲突数Context switches rate :每秒钟在进程或线程之间的切换次数Average load :上一分钟同时处于“就绪”状态的平均进程数Swap-in rate :正在交换的进程数System mode CPU utilization :在系统模式下使用CPU的时间百分比User mode CPU utilization :在用户模式下使用CPU的时间百分比网络监视参数&&&&&&&网络延迟时间:源计算机与目标计算机(例如,数据库服务器和Vuser负载生成器)之间的整个路径的延迟。&&&&&&&网络子路径时间:从源计算机到路径上每个节点的延迟。注意:从源计算机到每个节点的延迟是同时而又独立地度量的。因此,从源计算机到其中一个节点的延迟可能大于源计算机与目标计算机之间的整个路径上的延迟。&&&&&&&网络段延:路径上每个段的延迟。&&&&&&&验证网络是否是瓶颈:可以合并各种图来确定网络是否是瓶颈。例如,通过使用网络延迟时间图和运行Vuser图,可以确定Vuser的数量如何影响网络延迟。网络延迟时间图指示在方案运行期间的网络延迟。数据库服务器&&&&&&& User Calls :在每次登录、解析或执行时,Oracle会分配资源(Call State对象)以记录相关的用户调用数据结构。在确定活动时,用户调用与RPI调用的比指明了,因用户发往Oracle的请求类型而生成的内部工作量&&&&&&& Total file opens :由实例执行的文件打开总数。每个进程需要许多文件(控制文件、日志文件、数据库文件)以便针对数据库进行工作&&&&&&& Opened cursors current :当前打开的光标总数&&&&&&& DB block changes :由于与一致更改的关系非常密切,此统计计算对SGA中所有块执行的、作为更新或删除操作一部分的更改总数。这些更改将生成重做日志项,如果事务被提交,将是对数据库的永久性更改。此统计是一个全部数据库作业的粗略指示,并且指出(可能在每事务级上)弄脏缓冲区的速率。10.AIX机器性能瓶颈定义:瓶颈定义CPU bound : vmstat : when %user+%sys greater than 80%;Disk I/O bound : vmstat : when %iowait greater than 40%(AIX4.3.3 or later);Application disk bound :vmstat : when %tm_act greater than 70%;Paging space low : lsps -a : when used paging space greater than 70% active;Paging bound : iostat vmstat : paging logical volumes %tm_act greater than 30% of the I/O(iostat) and paging activity greater than 10* the number of CPUs(vmstat);Thrashing : vmstat sar :rising page outs, CPU wait and run queue;11.系统性能分析命令:cpu : vmstat,iostat,topas,nmon,ps,sar,time,timex,netpmon,trace,内存:vmstat,topas,nmon,ps,svmon,lsps,filemon,trace,磁盘:iostat,topas,nmon,lvmstat,iostat -d, lvmstat, lsps,filemon,lsattr,网络:netstat,topas,nmon,entstat,nfsstat,ifconfig,iptrace,ipreport,trace,监视CPU使用情况:vmstat 2 ; iostat -t 2 6;sar -P ALL 2 3;监视内存使用情况:vmstat 2 10;svmon -G;svmon -Pau 10;监视I/O使用情况:iostat 5;sar -d 3 3;监视网络使用情况:netstat -netstat -m;netstat -v;&}

我要回帖

更多关于 屏幕录制 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信