2007年2月14日

    在近期的某性能测试项目中,使用LR 11做测试,遇到了一个问题:在录制的脚本中,许多请求都带有EXTRARES,如:
     web_submit_data("clientlog.jspx_23", 
"Action=https://gaa-ad.pp2.shanghaionstar.com:8101/Advisor/faces/xAdvisorWeb/bundles/gaacommon/jsf/clientlog.jspx?message=Alerts%20refresh%20completed&clientTime=1466056941075", 
"Method=POST", 
"RecContentType=text/html", 
"Referer=https://gaa-ad.pp2.shanghaionstar.com:8101/Advisor/xAdvisorWeb/desktop/desktop.jsp", 
"Snapshot=t57.inf", 
"Mode=HTML", 
ITEMDATA, 
EXTRARES, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1712&y=854&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1713&y=854&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1715&y=854&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1714&y=854&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1712&y=855&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1713&y=855&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1714&y=855&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1715&y=855&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1712&y=856&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1713&y=856&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1714&y=856&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1715&y=856&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1712&y=857&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1713&y=857&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1714&y=857&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1715&y=857&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1712&y=858&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1713&y=858&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1714&y=858&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1715&y=858&z=11", "Referer=", ENDITEM, 
LAST);
     这些EXTRARES资源请求实际上是在上一个页面请求时发起,并通过异步的方式返回的一些地图数据。由于在录制脚本的过程中,上一步操作未能等到这些数据全部返回便开始了下一步的操作,因此在随后的脚本中,LR将这些请求作为EXTRARES
资源附在了这些请求之后。如此一来就造成了一个问题:这些请求的响应时间变长,但对于真实的用户而言,这些请求的响应时间却并没有那么长(因为这些地图数据在后台加载,用户感受不到)。表面上看来,似乎LR测试得到的结果与实际“不一致”了。而另一方面,这些资源请求又是真实存在的,对于服务器产生了压力,所以也不能简单粗暴地直接在脚本中去掉。
    最后,我们采取的办法是:将这些地图数据的加载单独写成一个web_url,使它对服务器产生真实的负载,并把它放在定义的事务之外。脚本如下:
     web_url("map",
"URL=http://10.16.93.182:22002/maptile/maptile?x=1711&y=854&z=11",
EXTRARES, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1711&y=854&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1712&y=854&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1713&y=854&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1714&y=854&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1715&y=854&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1711&y=855&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1712&y=855&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1714&y=855&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1713&y=855&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1715&y=855&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1711&y=856&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1712&y=856&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1713&y=856&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1714&y=856&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1715&y=856&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1711&y=857&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1712&y=857&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1713&y=857&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1714&y=857&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1715&y=857&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1711&y=858&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1712&y=858&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1713&y=858&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1714&y=858&z=11", "Referer=", ENDITEM, 
"Url=http://10.16.93.182:22002/maptile/maptile?x=1715&y=858&z=11", "Referer=", ENDITEM, 
LAST);
    同时,将后续脚本中的EXTRARES资源请求删除。

    这样一来,就既模拟了服务器端真实的负载场景,又避免了客户端实际响应时间不一致的问题。
         


posted @ 2016-07-08 12:54 xingcyx 阅读(1486) | 评论 (0)编辑 收藏
 
LoadRunner 12录制的脚本在LoadRunner 11的controller上无法运行,提示该VUSER类型没有license。
原因:LR12的VUSER type是Mobile。
解决方法:
用文本编辑器打开脚本的.usr文件,如03_HandEmergencyCall.usr,
AdditionalTypes=Mobile
ActiveTypes=Mobile
GenerateTypes=Mobile
RecordedProtocols=
修改为:
AdditionalTypes=QTWeb
ActiveTypes=QTWeb
GenerateTypes=QTWeb
RecordedProtocols=QTWeb
posted @ 2016-06-30 15:17 xingcyx 阅读(1639) | 评论 (0)编辑 收藏
 
    大多数情况下,在LoadRunner的脚本中设置参数还是比较简单的,但是正所谓人在江湖飘,哪能不挨刀?有的时候我们也会遇到一些特殊的情况,对脚本中的参数需要做一些特殊的处理。比如我最近在几个项目的性能测试脚本编写过程中,就遇到了这种情况。
    第一个项目其实是我同事遇到的。他们的系统报文中有一个参数的限制条件:要求必须是数字型,且长度为9位,如果不足9位,需要在后面补齐空格,而且还需要保证参数值唯一。我们暂且不去追究为啥这个系统会设置这么坑爹的一个限制,在这里的重点是说明在这样的情况下,我们该如何去设置参数?由于这个系统要求参数值唯一,所以我首先想到的还是利用LoadRunner的参数类型去控制,因为只有这样才能在并发的情况下,保证参数值的唯一性。
    总体思路拢共分三步:1、设置一个类型为unique number的参数类型,转换为字符型;2、根据字符串的长度,补齐空格为9位;3、将字符串转换为参数并替换
    具体的代码如下:
    

char str[10];
 int len;

 int num;
 int i;


//获取参数的长度 

 len=strlen(lr_eval_string("{old_param}"));

 
num=9-len;


 strcpy(str,lr_eval_string("{old_param}"));

 for(i=1;i<=num;i++)
 {
  //在字符串后面加上空格
  strcat(str," ");
 }


//转换为参数
lr_param_sprintf("new_param",str);


     第二个项目的情况相对比较好理解一些。要测试的是一个批量提交的业务,用户在页面上选择10笔数据后,作为一个批次一起提交。需要参数化的参数有两个:客户编号(custid)和业务编号(loanid),需要从参数文件中每次取10个参数。并拼接成需要的报文格式,以逗号分隔开。做法与上一个项目大同小异,只不过这里的参数类型要设置成file型。需要注意的是,由于参数文件中的custid和loanid是一行一笔数据,而我们每次需要使用的是10笔数据,因此在update values那里需要设置成每次出现时更新参数值。


    代码示例如下:
   //获取批次的custid和loanid,每批次取10笔数据
 for (i=1;i<=9;i++)
 {
  strcpy(scustid,lr_eval_string("{custid}"));
  strcat(bat_custid,scustid);
   //custid间用“,”分隔
  strcat(bat_custid,",");

  strcpy(sloanid,lr_eval_string("{loanid}"));
  strcat(bat_loanid,sloanid);
  //loanid间用“,”分隔
  strcat(bat_loanid,",");
  
 }

 strcat(bat_custid,lr_eval_string("{custid}"));
 strcat(bat_loanid,lr_eval_string("{loanid}"));

 //转换成LR的参数
 lr_param_sprintf("p_custid",bat_custid);
 lr_param_sprintf("p_loanid",bat_loanid);


    
posted @ 2014-01-08 20:35 xingcyx 阅读(3695) | 评论 (0)编辑 收藏
 
软件测试泰斗传道解惑 Google软件测试精髓完美呈现 《Google软件测试之道》
posted @ 2013-10-17 20:05 xingcyx 阅读(1063) | 评论 (0)编辑 收藏
 
     摘要: 参加公司管理培训后的心得  阅读全文
posted @ 2009-09-29 16:35 xingcyx 阅读(1640) | 评论 (2)编辑 收藏
 
     摘要: 昨天在试用QC的时候,虽然出现了一个小小的意外,但情况仍然在我的掌控之中。  阅读全文
posted @ 2009-03-12 12:13 xingcyx 阅读(3526) | 评论 (1)编辑 收藏
 
     摘要: 降龙十八掌升级版。  阅读全文
posted @ 2009-02-19 14:58 xingcyx 阅读(2528) | 评论 (3)编辑 收藏
 
     摘要: LambdaProbe 是一款强大的免费开源工具,LambdaProbe拥有几乎所有Tomcat Manager的功能, 可以说是一个增强版本的 Tomcat Manager。除此之外,Tomcat Probe 还拥有很多让开发者和系统管理者更方便的性能。从而使得Tomcat对开发者和管理者更加透明。  阅读全文
posted @ 2008-08-05 12:55 xingcyx 阅读(5676) | 评论 (0)编辑 收藏
 
     摘要: 根据前天在群里和同行朋友的聊天记录整理而写成。由于这两天工作比较忙,所以一直拖了2天才整理完毕。
将各位朋友比作奸臣小人,实乃玩笑,请勿介意!^_^  阅读全文
posted @ 2008-08-01 22:41 xingcyx 阅读(2690) | 评论 (7)编辑 收藏
 
     摘要: Tomcat菜鸟修习记  阅读全文
posted @ 2008-07-25 09:25 xingcyx 阅读(14146) | 评论 (8)编辑 收藏
 
     摘要: 解决LoadRunner录制结束后非正常关闭的一个“土”办法  阅读全文
posted @ 2008-07-16 13:02 xingcyx 阅读(3382) | 评论 (11)编辑 收藏
 
     摘要: 梁山辩论会之测试的重要性。
声明一:本文内容绝对是我根据今天在测试群中的真实聊天记录整理而成,如有雷同,纯属见了鬼的巧合!
声明二:文中的林冲即是昨天的令狐冲,也就是区区在下。为什么都叫“冲”呢?我也不知道,纯属见了鬼的巧合吧!  阅读全文
posted @ 2008-07-10 14:23 xingcyx 阅读(1325) | 评论 (6)编辑 收藏
 
     摘要: 华山论剑之负载测试与压力测试的区别。
其中的聊天记录部分除了某些搞笑成分外,绝大部分是我在某测试群里和一些同行朋友们的真实聊天记录,只不过我将姓名改成小说中的人物,看过笑笑即可,切勿对号入座,谢谢!  阅读全文
posted @ 2008-07-09 16:30 xingcyx 阅读(1786) | 评论 (7)编辑 收藏
 
     摘要: 下半年公司要在内部组织一次关于性能测试实施的培训,要我当讲师。测试群中的几位朋友知道以后便开玩笑说让我把这次培训当成一次项目,写一个培训计划出来,我也就顺着他们的意思,真的搞了一份项目计划出来,玩笑之作,贴出来供各位朋友评审,欢迎多提评审意见!^_^
  阅读全文
posted @ 2008-05-29 13:59 xingcyx 阅读(1145) | 评论 (11)编辑 收藏
 
     摘要: 这是我参加公司的客户体验培训后写的一篇心得。  阅读全文
posted @ 2008-04-28 17:48 xingcyx 阅读(704) | 评论 (3)编辑 收藏
 
转贴的,觉得很经典:

程序员写出自认为没有Bug的代码
测试组发现20个Bug
程序员修改了10个Bug,并告诉测试组另外10个不是Bug
测试组发现其中5个改动根本无法工作,而又发现15个新Bug
重复3次上两个步骤
为了配合当初制定的发布时间表,产品上市了
用户发现了137个新Bug
领了奖金的程序员不知跑哪去了
新组建的项目组修正了全部137个Bug,但又发现了456个新Bug
公司被恶意收购.收购时,软件的最终版本包含783个Bug
新CEO走马上任雇一名新程序员重写该软件
程序员写出自认为没有Bug的代码
……

posted @ 2008-04-18 08:56 xingcyx 阅读(585) | 评论 (1)编辑 收藏
 
     摘要: 从PL/SQL中导出查询结果,做为LoadRunner的参数化文件。  阅读全文
posted @ 2007-12-14 12:59 xingcyx 阅读(2760) | 评论 (3)编辑 收藏
 
     摘要: 在测试时代论坛上看到有人发贴问性能测试的相关问题,我觉得这些问题比较有代表性,而且也颇值得探讨,于是据我自己的想法简单回复了一下,抛砖引玉,希望大家能各抒已见。  阅读全文
posted @ 2007-12-10 22:50 xingcyx 阅读(448) | 评论 (0)编辑 收藏
 
     摘要: 介绍在LoadRunner中使用windows socket协议的方法。  阅读全文
posted @ 2007-11-16 13:37 xingcyx 阅读(9416) | 评论 (7)编辑 收藏
 
     摘要: 介绍oracle几个常用的监控视图,很有用!  阅读全文
posted @ 2007-11-12 14:04 xingcyx 阅读(1369) | 评论 (0)编辑 收藏
 
     摘要: 介绍如何通过响应报文判断交易的处理情况  阅读全文
posted @ 2007-11-01 14:53 xingcyx 阅读(1680) | 评论 (6)编辑 收藏
 
     摘要: 相信有不少人在使用LoadRunner的过程中都遇到过这样的问题:在录制下来的脚本的中文信息出现了乱码。如何解决这个问题呢?希望这篇文章能够给你带来一些帮助和启发。  阅读全文
posted @ 2007-10-31 12:54 xingcyx 阅读(7251) | 评论 (6)编辑 收藏
 
     摘要: 本文介绍了在LR中使用自定义请求报文向服务器发送请求的方法  阅读全文
posted @ 2007-10-23 13:06 xingcyx 阅读(1820) | 评论 (5)编辑 收藏
 
     摘要: 众所周知,在LoadRunner中,关联是一个很重要的动作,大多数的脚本在录制完成后并不能直接回放,需要通过一定的关联才能成功回放。关联的技巧有很多,这里介绍的就是其中之一  阅读全文
posted @ 2007-10-22 17:01 xingcyx 阅读(8330) | 评论 (5)编辑 收藏
 

在LR中,关联函数web_reg_save_param的NotFound参数有两个选项,含义分别如下:

ERROR:当关联函数未能找到匹配值时,LR将抛出一个Error信息;

       EMPTY:当关联函数未能找到匹配值时,LR将空值赋给该关联的参数值。

默认情况下,该值为Error在大多数情况下,这是可以满足要求的。然而在某些时候,我们可能需要利用关联值做一些条件判断,例如设定当关联到的值为空时,让脚本做一些特殊处理,此时如果使用默认的选项就不合适了,因为当LR识别到该关联值为空时,将抛出一个错误信息,提示未找到关联记录。怎么办呢?此时就可以使用NotFound的另外一个选项,即将NotFound参数值设为Empty

例:

web_reg_save_param("customer","LB=name=\"classiAssetsSelected\" value=\"","RB=\"","NotFound=EMPTY",LAST);

令LR将空值赋给customer参数,然后在后面的脚本中结合判断条件语句,如:

if(strcmp("", lr_eval_string("{customer}")) !=0),就可以让脚本根据判断条件做相应的控制。

posted @ 2007-10-18 13:44 xingcyx 阅读(497) | 评论 (0)编辑 收藏
 
啊,人到齐了,酒席开始了。
你先一个人喝了一小口,这叫单元测试。
你跟旁边的人说哥们咱们随意,这叫交叉测试。
你跟几个经常一起玩的说兄弟几个喝一杯,这叫集成测试。
但是他说不行,这杯要干了,这叫压力测试。
喝完旁边的兄弟桌回来再跟同桌的喝,这叫回归测试。  
于是你说那就大家一起来吧,这叫内部测试。
这个时候领导向全场举杯了,这叫公开测试。
在测试过程中终于有人受不了了
你突然跑向厕所,这叫捕获异常。
你在厕所吐了,反而觉得状态不错,这叫内存泄露。
你在台面上吐了,觉得很惭愧,这叫程序异常。
你在领导面前吐了,觉得很害怕,这叫系统崩溃。


posted @ 2007-09-12 15:38 xingcyx 阅读(869) | 评论 (3)编辑 收藏
 
前段时间在公司给部门的新同事培训LoadRunner,现将培训教材上传。
下载地址:
http://www.blogjava.net/Files/xingcyx/LoadRunner培训.rar
其中“进阶”部分我一直很不满意,没有一个线索串起来,显得太零乱。但不知道应如何改进,请大家多提意见。

posted @ 2007-08-07 10:20 xingcyx 阅读(2216) | 评论 (11)编辑 收藏
 
    在使用LoadRunner进行性能测试时,有时候会遇到一种参数值唯一性要求十分严格的情况,就是不但在同一次测试过程中,要保证所输入的参数值不能重复,而且每一次测试,参数值也不能使用之前使用过的值。可是我们知道,性能测试往往是要多次重复地执行,要么是执行过程中出现一些异常情况,不得不多次重复,要么是对系统进行了优化调整后的回归测试。在这种情况下,如果我们只单纯地使用unique number或者文件类型的unique取值等,都会不可避免地遇到一些麻烦。
   这个时候Date/Time参数也许就可以派上用场了。采用%H%M%S的类型,相当于在脚本中加上一个时间戳,对于该参数值,每一次执行脚本时,LoadRunner都会自动获取系统的当前时间。如果再和其它类型的参数值结合起来使用,比如unique number或文件类型参数,那么参数值重复的机率就大大降低了。
   举个例子来说,如果我们需要将一个18位的证件号码做成唯一型的参数(假设该号码没有格式要求),那么我们可以将前面6位数字设置成Date/Time参数,假设参数名为Time,后12位数字设置成unique number参数,假设参数名为Certno,将二者结合起来使用,那么在脚本中需要输入证件号码的地方,参数值就用{Time}{Certno}组合起来。这样在多次执行脚本的时候,该参数值基本上就不会出现重复的情况了。
   Date/Time参数还有很多种格式,如加上日期等,还可以自己添加格式,大家可以根据需要灵活使用。

posted @ 2007-07-18 10:15 xingcyx 阅读(994) | 评论 (0)编辑 收藏
 
    在设置LoadRunner测试场景时,很多时候都需要设置用户逐渐递增的场景。可能大家通常的做法都是逐步增加用户数,并且分成多次去运行场景,比如第一次运行用100用户,第二次用200用户,第三次用300用户等等。
    其实,还可以有另外一种方法,就是针对同一个脚本设置多个组,使用组策略(点击Edit Schedule按钮,选择Schedule by Group),第一个组为初始用户数,如100,第二个组以50或100递增。每个用户场景都持续稳定地运行一段时间,这样可以把几种用户场景下的测试在一次场景的运行过程中就一次性执行完毕,而且还有一个好处是可以把多个用户场景下的性能结果都整合到同一个结果中,也方便对比、分析。
posted @ 2007-07-18 09:43 xingcyx 阅读(5843) | 评论 (4)编辑 收藏
 
     摘要: 关于在LoadRunner中引用参数值的一个困惑  阅读全文
posted @ 2007-05-29 11:57 xingcyx 阅读(2237) | 评论 (2)编辑 收藏
 
     摘要: 软件系统的性能问题往往难以定位,本文中介绍的方法仅仅是其中的方法之一。
  阅读全文
posted @ 2007-05-15 11:24 xingcyx 阅读(941) | 评论 (3)编辑 收藏
 

        今天下午,太保其它项目组的同事在用LR测试Webservice的时候遇到了一个问题,就跑过来问我。我过去看了一下,原来是在脚本回放的时候报错,错误信息如下:
        server returned an incorrectly formatted SOAP response
        把日志打开,重新运行脚本,查看日志,发现其实结果已经正常返回,但是在SOAP响应的头部,多了一行信息:
         Notify: Saving Parameter "response = <?xml version="1.0" encoding="zh_cn"?>
         在查找了一些相关的资料之后,得知这可能是因为我们使用的操作系统是中文的,所以LR自动添加上去的。决定试验一下,让同事将Windows XP的区域设置改成英语(英国),重启机器后,重新运行脚本,该错误信息不再出现,脚本执行结果正常。
         不过这样的解决方法还不是很完美,因为操作系统上有一些其它软件变成了乱码,甚至打不开,无法运行,希望以后能找到更好的解决方法。

posted @ 2007-04-29 19:20 xingcyx 阅读(1772) | 评论 (1)编辑 收藏
 
     摘要: 做项目真是累啊~~  阅读全文
posted @ 2007-04-07 15:57 xingcyx 阅读(564) | 评论 (3)编辑 收藏
 
     摘要: 外行看热闹,内行看门道。真正的高手要会通过看到的现象去分析内在的本质。  阅读全文
posted @ 2007-02-14 15:47 xingcyx 阅读(10281) | 评论 (28)编辑 收藏