51Testing软件测试论坛

标题: LoadRunner的一个解决方案 [打印本页]

作者: sincky    时间: 2005-11-29 23:53
标题: LoadRunner的一个解决方案
LoadRunner的一个解决方案
某web项目需求信息:要求在用户的登录时间小于5秒(包含登录中下载所有资源的时间)情况下的最大用户并发数。
场景描述:以小规模的用户数每格一定的时间递增用户,递增的用户随正在运行的用户一起并发登录。每个用户的响应时间超过5秒就认为是错误。
LoadRunner实现方式:
1、录制脚本并把登录过程定义为一个事务,在事务前加一集合点;
2、使用手动方案,设置用户数为较大的用户数;
3、设置集合策略,选择“释放:当达到100%运行用户时”;
4、设置加载方式为“每x秒加载y个用户”,数字根据具体情况设置;
5、设置持续时间为“无限期运行”;
6、在Controller的运行时设置中设置“浏览器仿真”,选中“下载非HTML资源”和“每次迭代模拟一个新用户”;
7、在“Internet协议首选项”的高级设置中,选中“在本地保存快照资源”和“出现错误时激活快照”;
8、接上步,单击“设置高级选项”右侧的“选项”按钮,在弹出的窗口中设置“HTTP请求连接超时”“HTTP请求接收超时”“步骤下载超时”均为5秒,并选择“由资源引起的步骤超时是一条警告信息”为否。
9、开始运行脚本。
辅助信息:
1、可以参考“从Controller中监视VU执行脚本的情况”了解Virtual User的执行情况。
2、可在脚本中适当增加检查点。
3、以上第8步可能不太合理,你看出来了吗,一定还有更好的方式吧^_^
作者: sincky    时间: 2005-11-29 23:54
从Controller窗口中查看当前脚本中的参数和vu的迭代次数的脚本实例:
#include "as_web.h"
static int iteration;
Action()
{
char *pp;
//请自定义参数文件NewParam
pp="value={NewParam}";
//在vugen调试窗口中显示当前参数值,在Controller窗口中不会显示出来
lr_output_message("Para is:%s",lr_eval_string("{NewParam}"));
//在Controller监视窗口中显示当前参数值和当前vu迭代次数,在vugen调试窗口中不会显示出来
lr_vuser_status_message("Para is:%s,%dTimes Iteration",lr_eval_string("{NewParam}"),++iteration);
return 0;
}
运行场景时在Controller运行窗口中单击Vusers按钮(开始方案按钮的下面),弹出窗口中可看到信息。
作者: sincky    时间: 2005-11-29 23:54
web_url(); 步骤包含了思考时间,即使是在没有指定的情况下。
解决方式:
        即使没有指定思考时间,系统也会自动为web_url("default.asp")步骤指定思考时间。
        在重播思考时间启用时该步骤会有10秒钟的暂停。忽略思考时间可以使它立即直接访问。
        在Analysis中如果选中筛选器中的包含思考时间选项就可以在结果中看到思考时间。
以下是有关服务请求的细节知识:
        “在某些情况下运行脚本时,LoadRunner会加入它自己的思考时间。其中一种情况是当收到一个401错误时。当请求的cookie设置不正确时,有时应用服务器会返回401错误。LoadRuner一旦收到这个错误信息它就会等待10秒钟并且重新请求资源。这次LoadRunner将会向服务器发送正确的cookie,从而进行访问。”
        “401错误的存在要求站点运行正常。它的工作方式是这样的,第一次请求某个URL或着以一个新的会话返回了URL,服务器需要为此URL认证或指定一个session id,这样就会在错误的请求钟设置一个cookie信息。然后就会重新请求该URL,这次是使用的是一个有效的cookie,然后服务器发送你所请求的信息。”
        “如果没有返回401错误的话就不能生成一个新的cookie。没有新的cookie的话就不能访问服务器。”
        “在这里我们想要做的是让LoadRunner立即重新发送请求而不等待10秒。为了达到这个目的,请在脚本文件夹下default.cfg文件中的[Web]下面加入下面语句:”
         Retry401ThinkTime=0
        “这样设置以后,从Vugen中再次运行脚本或把它加到新的场景中或在已有的场景中删除并重新加入后运行,就不会在重新请求资源时等待10秒钟了。”
作者: sincky    时间: 2005-11-29 23:54
使用自定义的VuGen脚本模板
步骤:
1、创建一个新的脚本;
2、对此脚本进行所需的设置(自定义);
3、保存脚本;
4、现在,拷贝该脚本目录下的default.cfg文件到Program Files\Mercury Interactive\LoadRunner\template\{dir}目录下。{dir}表示你将要创建脚本的出处。例如,Web/HTML虚拟用户的目录是\qtweb\目录。你也可以自定义init.c、end.c和action.c,这样以后新建的脚本都会使用这些模板了。
作者: ni_xh    时间: 2005-12-1 09:30
借鉴。
作者: lotus    时间: 2005-12-1 16:59
very good,楼主性能测试经验丰富呀
谢谢分享
作者: mafangliht    时间: 2005-12-14 15:53
“LoadRunner的一个解决方案
某web项目需求信息:要求在用户的登录时间小于5秒(包含登录中下载所有资源的时间)情况下的最大用户数“

对于这个需求, 步骤8 似乎起着至关重要的作用。一个事务是指从request 发出到 客户端接收到response为止, 不包括下载时间, 但需求中的5s 包含下载时间,期待好的解决方案...
作者: suchboy    时间: 2006-2-27 13:59
标题: 请教二楼的代码该怎么设置?
#include "web_api.h"


Action()
{


char *pp;

//以下这句到底有没有?
int *iteration; //不写这句话会报错,但这个迭代的笔数应该是系统给出的吧? 查了手册,好像又得设才是?


//请自定义参数文件NewParam
pp="value={NewParam}";
//在vugen调试窗口中显示当前参数值,在Controller窗口中不会显示出来
lr_output_message("Para is:%s",lr_eval_string("{NewParam}"));
//在Controller监视窗口中显示当前参数值和当前vu迭代次数,在vugen调试窗口中不会显示出来
lr_vuser_status_message("Para is:%s,%dTimes iteration",lr_eval_string("{NewParam}"),++iteration);

[ 本帖最后由 suchboy 于 2006-2-27 14:04 编辑 ]
作者: farnear    时间: 2006-3-18 15:15
原帖由 lotus 于 2005-12-1 16:59 发表
very good,楼主性能测试经验丰富呀
谢谢分享


好的方案出来了吗?
我还没找到
期待ING
作者: farnear    时间: 2006-4-12 16:23
第三、四步冲突了吧
既然设置了集合点
那么“每×秒加载×个”和同时加载还有什么区别?
另外这种类型的测试目标测试是不是更好呢?
作者: xiaojing23    时间: 2006-4-12 18:11
标题: 学习中
学习中
作者: mantis123    时间: 2006-4-24 18:10
第三、四步冲突了吧
既然设置了集合点
那么“每×秒加载×个”和同时加载还有什么区别?
另外这种类型的测试目标测试是不是更好呢?

-----------------------------------------------------------------
这个是有区别的,同时加载是在集合点前加载,
“每×秒加载×个”在集合点前不一定加载了X个
这个跟集合点的超时时间设置是有关的,在control->scenario->rendezvous中设置
如果在超时时间内加载完所有的负载,这样就和同时加载没有区别
如果没有在超时时间内加载完,就没有那么大的负载量
作者: Jon    时间: 2006-4-26 13:47
这样的例子我选用测试目标来测试,也是可以的.
谢谢,分享!
作者: mm_louis    时间: 2006-5-15 18:10
测试的系统为B/s结构,手工运行时客户端响应比较慢
因为大量的数据在客户端运行,服务器压力不大,用loadrunner运行,比如保存一个单据的action才几百毫秒,但是手工运行保存感觉需要5秒,差距比较大
如何获得客户端准确的运行时间
这个如何获得呢,楼主,假如客户要求响应时间就是可以看到结果的时间是一定的时间,我如何获得客户端的时间
作者: codecnzgj    时间: 2006-6-19 12:50
希望楼主能搞个C/S项目的案例来分析指教一下啊sdlkfj1
作者: lelebachelor    时间: 2006-7-12 19:03
just like that
作者: lelebachelor    时间: 2006-7-26 16:36
楼主为何不回答各位所提出的问题,
这个贴子好像并不是楼主自己原创的吧。我在网站上其它很多地方都搜到了和楼主完全一样的贴。。
作者: wzb521    时间: 2006-8-1 08:57
TO:mafangliht
可以用函数,取得事务时间,大于5则将此事务结果置为FALSE,
作者: 杀手太冷    时间: 2006-8-8 15:13
我初步接触了一下LR但是不知道从何下手呀
那位高手可以指教一下
谢谢
作者: 伟伟の爱    时间: 2006-9-2 23:49
看不懂的东西,,郁闷中~~
作者: RuisTar    时间: 2006-9-20 14:26
楼主可不可以多弄点LoadRunner的实例分析啊,刚接触这个软件,好多都不懂。
可不可以分享下,邮箱是BearRui@gmail.com
先谢谢啦!
作者: sunshineboy    时间: 2006-10-24 14:06
看不懂的东西,,郁闷中~~
作者: wuhuawu09    时间: 2006-11-23 11:05
没怎么用过LR,有些不太懂,先了解了些.谢谢.....
作者: yaoayao111    时间: 2006-11-30 10:44
看不懂的东西,,郁闷中~~
作者: haha010    时间: 2006-12-11 17:35
标题: 请教怎样并发1000个不同的手机用户访问站点的问题!!!
各位大虾,
     现在有个需求,要解决1000个手机用户并发登录站点的问题,我试过参数池,可是那只能解决1000个同一个号码的用户同时访问,可在现实中是不允许出现的,请问各位,怎样解决1000个不同的手机用户并发的问题,谢谢了!!!
作者: 罂粟黑豹    时间: 2007-1-5 11:49
先顶一下,学习中
作者: llytaiyang    时间: 2007-1-16 10:52
初步接触~~学习中~~
作者: higkoo    时间: 2007-1-27 15:15
标题: LR
大体明白意途,刚开始学习LR
作者: chbhaha    时间: 2007-2-7 09:50
刚学LR有那位大侠发我点:事例分析方面的资料 ,我的邮箱是:chbhaha@126.com
在此先谢了!
作者: mfktafd    时间: 2007-4-2 10:44
原帖由 wzb521 于 2006-8-1 08:57 发表
TO:mafangliht
可以用函数,取得事务时间,大于5则将此事务结果置为FALSE,


参考:
我写了如下参数:请指教(事务名字为post)
double trans_time;
lr_start_transaction("post");

web_custom_request(.................................
                              LAST);                           //请求(登陆等)

trans_time=lr_get_transaction_duration("post");   //获得事务时间

if(trans_time<=5)
  lr_end_transaction("post",LR_PASS);  //如果事务时间小于5S,事务状态为PASS
else
  lr_end_transaction("post",LR_FAIL);    //如果事务时间大于5S,事务状态为FAIL
作者: huco7    时间: 2007-4-5 09:54
又学到新东西。谢谢楼主
作者: bluemoon1999    时间: 2007-4-7 17:58
不对劲,我以前也这样试过。。
LZ有没想到 这样 服务器肯定会挂掉。。
作者: nickbest    时间: 2007-4-18 12:02
谢谢分享。
作者: Coffey111111    时间: 2007-4-19 22:34
先学习下,谢谢分享~~
作者: vickiren    时间: 2007-4-25 15:11
标题: 回复 #1 sincky 的帖子
学习了
作者: 大鸭梨    时间: 2007-4-29 14:34
不错学习了
作者: 金城月    时间: 2007-5-18 17:05
好深奥哦,学习中
作者: cssweb    时间: 2007-6-8 11:33
好东西,收藏了
作者: corrine-li    时间: 2007-6-20 10:11
mark ,学习
作者: xuezini1955    时间: 2007-8-16 22:32
标题: 刚好在找B/S的实例
最近打算测一个网站的性能。看到你这个实例,很有启发。刚刚学LR。
作者: laisfiden    时间: 2007-8-31 16:59
好像在哪里见过。
作者: niceleafage    时间: 2007-9-10 16:27
标题: 请问 #30 mfktafd 的帖子 中的问题,有知道的帮忙解答一下
web_custom_request(.................................
                              LAST);                           //请求(登陆等)  


把这个函数怎么使用的,能详细说一下好吗?

还想问一个问题:在调试脚本时,用lr_message(“调试信息”),运行时,调试信息没看到?


附:1、我用的是LR8.1汉化版;
      2、我已经在run-time setting里要打开enable logging的
作者: b47617    时间: 2007-9-28 18:16
1.摘自关河的文章
web_custom_request应用示例
LoadRunner提供的web_custom_request函数可以用于实现参数的动态生成。在LoadRunner中,web_reg_save_param和custom_request都常于处理参数的动态生成。

web_reg_save_param函数是大家都已经熟悉的了,它的主要作用是从一个response中获得后续的request需要使用的数据,然后将其作为一个参数保存下来,供后续步骤使用。该方法在LoadRunner中被称为Correlation(关联)。

而web_custom_request函数则可以用于完全自定义向服务端发送的request。

接下来我们用一个实际的例子说明一下web_custom_request的具体应用:

以Mercury自带的MercuryWebTours例子为例,假设我们希望在登录进入后将用户的前两条记录删除,我们来看看用web_custom_request如何实现这个目标。

首先,我们尝试用HTML方式对该操作进行录制。录制后的脚本中与删除相关的部分大致如下:


web_url("welcome.pl",
    "URL=http://localhost/MercuryWebTours/welcome.pl?page=itinerary",
        "Resource=0",
        "RecContentType=text/html",
    "Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=home",
    "Snapshot=t3.inf",
    "Mode=HTML",
    EXTRARES,
    "URL=images/in_itinerary.gif", "Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=itinerary", ENDITEM,
    "URL=images/home.gif", "Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=itinerary", ENDITEM,
        LAST);
lr_think_time(2);

web_submit_form("itinerary.pl",
    "Snapshot=t4.inf",
    ITEMDATA,
    "Name=1", "Value=on", ENDITEM,
    "Name=2", "Value=on", ENDITEM,        "Name=removeFlights.x", "Value=116", ENDITEM,
    "Name=removeFlights.y", "Value=8", ENDITEM,
    LAST);
我们通过树型模式查看一下在submit form的时候实际向服务器发出的请求的内容:


从请求内容中可以看到,我们通过POST方法发出了请求,请求发送的目的URL是/MercuryWebTours/itinerary.pl,发送的内容是:
"1=on&flightID=384-798-JM&2=on&flightID=3026-1592-JM&3=on&flightID=1194-2326-JM&.cgifields=1&.c"
"gifields=2&.cgifields=3&removeFlights.x=116&removeFlights.y=8"

从发送的内容中可以很明显的分析得出,1=on表示第一个checkbox是被选中的,flightID=384-798-JM表示的是第一条记录所对应的flightID。因此,如果我们需要自己组成这个发送的request的话,必须首先通过关联的方式获得前两条记录的flightID,然后再组成request的内容。

web_custom_request方法的原型是:
int web_custom_request (const char *RequestName, <List of Attributes>,[EXTRARES, <List of Resource Attributes>,] LAST );

其中List of Attributes的主要项目是Method,URL和BODY等。对这个例子来说,我们可以很容易构造出我们需要的request的BODY内容。
……
strcpy(creq, "Body=1=on&flightID=");
strcat(creq, lr_eval_string("{fID1}"));
strcat(creq, "&2=on&flightID=");
strcat(creq, lr_eval_string("{fID2}"));
strcat(creq, "&.cgifields=1&.cgifields=2");
strcat(creq, "&removeFlights.x=116&removeFlights.y=8");
……

其中{fID1}、{fID2}等都是通过关联获得的flightID的数据。

因此,我们可以根据图中的数据编写custom_request语句:

web_custom_request("itinerary.pl",
"Method=POST",
    "URL=http://localhost/MercuryWebTours/itinerary.pl",
    "RecContentType=text/xml",
    creq,
    "Snapshot=t4.inf",
    LAST);
较为完整的代码如下: Action()
{
    char creq[500];

    web_reg_save_param("fID1", "LB=INPUT TYPE=\"hidden\" NAME=\"flightID\" VALUE=\"", "RB=\"", "ORD=1",
        "SEARCH=BODY", LAST);
    web_reg_save_param("fID2", "LB=INPUT TYPE=\"hidden\" NAME=\"flightID\" VALUE=\"", "RB=\"", "ORD=2",
        "SEARCH=BODY", LAST);
    web_url("welcome.pl",
        "URL=http://localhost/MercuryWebTours/welcome.pl?page=itinerary",
        "Resource=0",
        "RecContentType=text/html",
        "Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=home",
        "Snapshot=t3.inf",
        "Mode=HTML",
        EXTRARES,
        "URL=images/in_itinerary.gif", "Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=itinerary", ENDITEM,
        "URL=images/home.gif", "Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=itinerary", ENDITEM,
        LAST);
    lr_think_time(2);

    strcpy(creq, "Body=1=on&flightID=");
    strcat(creq, lr_eval_string("{fID1}"));
    strcat(creq, "&2=on&flightID=");
    strcat(creq, lr_eval_string("{fID2}"));
    strcat(creq, "&.cgifields=1&.cgifields=2");
    strcat(creq, "&removeFlights.x=116&removeFlights.y=8");

    lr_output_message(creq);

    web_custom_request("itinerary.pl",
"Method=POST",
        "URL=http://localhost/MercuryWebTours/itinerary.pl",
        "RecContentType=text/xml",
        creq,
        "Snapshot=t4.inf",
        LAST);

    return 0;
}
2.是在output.txt文件中输出.
作者: serena_meledy    时间: 2007-10-17 15:21
看不懂,先收下
作者: serena_meledy    时间: 2007-10-17 15:22
搂住能不能详细解释一下:HTTP请求连接超时”“HTTP请求接收超时”“步骤下载超时”到底是指哪段时间呢? 因为不理解,所以不知道都设置为5秒会有什么问题。
作者: xiongshaohuang1    时间: 2008-1-2 10:41
好贴!!虽然现在看不是很明白,但是慢慢学习
作者: goodluck7788    时间: 2008-2-18 15:44
标题: 学习了
感谢楼主,学习了
作者: liujg    时间: 2008-3-10 09:40
现在还没达到斑竹的程度!~
作者: madduck    时间: 2008-8-24 22:21
留个言,做个标志。很快就要用到了。。。thx!
作者: qicyt1812    时间: 2008-11-10 14:15

作者: cls2006    时间: 2008-11-13 19:47
看不懂,不过正在学习中。。。。
作者: sunny0258    时间: 2009-7-28 17:42
收获了一些,还有一些看不懂,先收藏
作者: whpd    时间: 2009-8-6 16:08
更2o楼一样的答案
作者: hlq0514    时间: 2009-8-10 11:17
看看,说不定以后用的着
作者: lisanshui1984    时间: 2009-9-14 20:25
学习,学习,3q
作者: lbx111111    时间: 2010-11-1 21:11
顶一下,不错不错....
作者: 弓长亻青    时间: 2010-11-11 15:48
“在5秒内”是不是Transactions per Second小于5秒?
作者: 炫彩琉璃    时间: 2010-11-22 11:35
学习中~
作者: x2test    时间: 2010-12-15 21:50
看看再说
作者: xiaoshi_2011    时间: 2012-4-19 14:45
深入学习中
作者: mew234    时间: 2012-4-20 16:32
看不是很懂,先留下足迹先。
作者: testMA    时间: 2012-11-23 17:52
此贴已阅!!!!
作者: shotting    时间: 2013-3-11 17:29
顶上去
作者: shotting    时间: 2013-3-11 17:29
顶上去
作者: lin39320028    时间: 2013-11-1 10:07
此贴解决方案是错误的

大家可以看下牛人写的这个 http://bbs.51testing.com/thread-992353-1-1.html

因为工具的事务时间不是真实的事务时间,因为浏览器是并发的




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2