51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 2807|回复: 17
打印 上一主题 下一主题

[原创] eloadrunner真的能并发么!

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2008-9-22 15:14:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家先看看这个脚本。
执行此脚本,一个用户就可以通过for循环把要完成的任务全部完成。
如果要实现并发,就要用contorller。假设并发10个,那么这10个用户是如何分配的呢~!

#include "web_api.h"
shelldialog()
{       
        int count,i;
        char reqid1[256];
        char flowid[256];
        char reqid;
        char bufferflow;
        /*计算usertasks首页reqId的总数*/
        count=atoi(lr_eval_string("{req_id_count}"));
        lr_output_message("count=%d",count);
        /*循环执行shell交互,输入111*/
        for(i=1;i<=count;i++)
        {
                /*存储req_id的各个元素到reqid1中,根据conut值计算存储的次数*/
                sprintf(reqid1,"{req_id_%d}",i);       
                sprintf(flowid,"{flow_id_%d}",i);
                lr_message("%s   %s",lr_eval_string(reqid1),lr_eval_string(flowid));
                /*将reqid1的值赋给reqid,并在下面是用reqid进行参数化*/
                lr_save_string(lr_eval_string(reqid1),"reqid");
                lr_save_string(lr_eval_string(flowid),"bufferflow");
        web_url("shellWindow.do",
                "URL=http://192.168.0.135:8888/usertasks/shellWindow.do?reqId={reqid}&flowId={bufferflow}&actId=1&flowInsName=qqqflowInsName&actName=ShellCmdactName",
                "Resource=0",
                "RecContentType=text/html",
                "Referer=",
                "Snapshot=t4.inf",
                "Mode=HTML",
                LAST);
        web_url("style.css",
                "URL=http://192.168.0.135:8888/usertasks/css/style.css",
                "Resource=1",
                "RecContentType=text/css",
                "Referer=http://192.168.0.135:8888/usertasks/shellWindow.do?reqId={reqid}&flowId={bufferflow}&actId=1&flowInsName=qqqflowInsName&actName=ShellCmdactName",
                LAST);
        web_url("tab.css",
                "URL=http://192.168.0.135:8888/usertasks/css/tab.css",
                "Resource=1",
                "RecContentType=text/css",
                "Referer=http://192.168.0.135:8888/usertasks/shellWindow.do?reqId={reqid}&flowId={bufferflow}&actId=1&flowInsName=qqqflowInsName&actName=ShellCmdactName",
                LAST);
        web_url("iconErrors.gif",
                "URL=http://192.168.0.135:8888/usertasks/images/iconErrors.gif",
                "Resource=1",
                "RecContentType=image/gif",
                "Referer=http://192.168.0.135:8888/usertasks/shellWindow.do?reqId={reqid}&flowId={bufferflow}&actId=1&flowInsName=qqqflowInsName&actName=ShellCmdactName",
                LAST);
        web_url("btnLong.gif",
                "URL=http://192.168.0.135:8888/usertasks/images/btnLong.gif",
                "Resource=1",
                "RecContentType=image/gif",
                "Referer=http://192.168.0.135:8888/usertasks/shellWindow.do?reqId={reqid}&flowId={bufferflow}&actId=1&flowInsName=qqqflowInsName&actName=ShellCmdactName",
                LAST);
        web_custom_request("freshConsole.do",
                "URL=http://192.168.0.135:8888/usertasks/freshConsole.do?reqId={reqid}&flowId={bufferflow}&outLine=0&errLine=0&allLine=100&stdLastLine=0&errLastLine=0",
                "Method=POST",
                "Resource=0",
                "RecContentType=text/html",
                "Referer=http://192.168.0.135:8888/usertasks/shellWindow.do?reqId={reqid}&flowId={bufferflow}&actId=1&flowInsName=qqqflowInsName&actName=ShellCmdactName",
                "Snapshot=t5.inf",
                "Mode=HTML",
                "EncType=",
                LAST);
        web_custom_request("freshConsole.do_2",
                "URL=http://192.168.0.135:8888/usertasks/freshConsole.do?reqId={reqid}&flowId={bufferflow}&outLine=0&errLine=0&allLine=100&stdLastLine=-1&errLastLine=-1",
                "Method=POST",
                "Resource=0",
                "RecContentType=text/html",
                "Referer=http://192.168.0.135:8888/usertasks/shellWindow.do?reqId={reqid}&flowId={bufferflow}&actId=1&flowInsName=qqqflowInsName&actName=ShellCmdactName",
                "Snapshot=t6.inf",
                "Mode=HTML",
                "EncType=",
                LAST);
        web_custom_request("freshConsole.do_3",
                "URL=http://192.168.0.135:8888/usertasks/freshConsole.do?reqId={reqid}&flowId={bufferflow}&outLine=0&errLine=0&allLine=100&input=111&stdLastLine=-1&errLastLine=-1",
                "Method=POST",
                "Resource=0",
                "RecContentType=text/html",
                "Referer=http://192.168.0.135:8888/usertasks/shellWindow.do?reqId={reqid}&flowId={bufferflow}&actId=1&flowInsName=qqqflowInsName&actName=ShellCmdactName",
                "Snapshot=t7.inf",
                "Mode=HTML",
                "EncType=",
                LAST);
                }       
                //i++;
        return 0;
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2008-9-22 16:49:01 | 只看该作者
LZ,我想问问10个用户进入首页看到的内容是否一样,如果不一样的话,那么这个脚本就可以成立;
如果每个用户进去都是看到所有的内容,都是一样的话,那么req_id_count并发提取的内容都是一样,这样并发就会可能出错误;
建议以vuserid做为参数,FOR循环用count/10取整,最后分配成第一个用户,对1、11、21下标的count做操作,第2个用户对2、12、22来操作,以此类推。
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2008-9-22 17:09:50 | 只看该作者
如何以vuserid做为参数?
回复 支持 反对

使用道具 举报

该用户从未签到

4#
 楼主| 发表于 2008-9-22 17:15:08 | 只看该作者
我把登录的vuser初始化了10个,等我回家试试,能为这10个分配不同的reqId.
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2008-9-22 17:26:05 | 只看该作者
USER=atoi(lr_eval_string("{vuserID}"));   //这里的vuserID用 vuserid类型的参数

for(i=0;i<=count/10;i++){
          用循环的i 与USER联接起来,做为count下标。。。。。。具体的方法忘了。这样就可以实现第一个用户第一次跌代为01,第2次为11,第2个用户就是02,12,这样了
}
回复 支持 反对

使用道具 举报

该用户从未签到

6#
 楼主| 发表于 2008-9-23 09:51:58 | 只看该作者
很感谢您的回答,我还有问题。
如果是在Virtual User Generator中执行迭代的话,用户的登录操作是在init中,那执行迭代的只有action中的脚本,而不迭代登录操作,这样的话使用atoi函数取到的用户也只能是一个,就是去了意思了。
另外,我最终的意思不是使用Generator中的迭代,而是使用controller执行并发,假设并发10个,那就是有10个不同的用户登录,第一个用户取req_id_0,第二个用户取req_id_1....
第十个用户取req_id_9,不让两个用户同时对一个reqId进行操作。
如果有好的策略请不吝赐教。
回复 支持 反对

使用道具 举报

该用户从未签到

7#
发表于 2008-9-23 11:01:38 | 只看该作者
用户登陆在vgen里面并不会影响的:比如说你参数化了10个用户在INIT里面做登陆,而且INIT里面只执行一次,也就是说在controller可以实现10个用户并发登陆成功;
下面说到action里面,
你说的问题,是不是10个用户并发登陆后,会出现看到同样的req列表,如果都用   for(i=1;i<=count;i++)的话,那么每个用户都是从第一条数据开始处理,如果你们程序中做了如Lock处理的话,就会出现失败,因为他们做同一条数据进行操作了,所以这个时候应该想办法把你当前的count根据并发用户数切割开(类似于下载软件,开线程一样),比如你的count有100条,并发为5个,这样的话就为每个并发分20条,也就说你的跌代最多只能有20次,处理完就没有多的数据了;
所以action的脚本应该类似于:
USER=atoi(lr_eval_string("{vuserID}"));    //vuserID用 vuserid类型的参数,这里就不会和你的INIT里面的登陆有任何影响,只是为了根据ID来切割count作用,因为在controller并发的时候每个vuser都有ID的。这样就可以实现并发登陆的用户对count分块处理,1用户执行01,11条数据,以次类推(如果count的下标是从0开始那就00,10这样),用了vuserID参数不会影响你到
controller里面执行的,但有个问题你的跌代只能依赖脚本中的循环次数了,controller的跌代对你已经没有任何意义,因为它不知道你有多少count,所以的跌代次数依赖你的数据。

不知道我的回答能帮你解决问题吗?
回复 支持 反对

使用道具 举报

该用户从未签到

8#
 楼主| 发表于 2008-9-23 14:17:54 | 只看该作者
不明白你的第一段话。
我用controller并发10个用户,但是用的确都是一个用户。userid和passwd是用文件参数化的,里面一共有10个账户和密码。
再有user/10如果user小于10,它的结果始终都是0.还是会出现多个用户抢一个ID执行的问题。
回复 支持 反对

使用道具 举报

该用户从未签到

9#
发表于 2008-9-23 14:25:58 | 只看该作者
不是user/10,,,是你关联用到的count/10,也就说,你关联到100条可以执行操作的数据,这个时候正好并发10人,也就是说,你的数据够你10个用户执行10次,如果是105也这样,把多的5条不要了
回复 支持 反对

使用道具 举报

该用户从未签到

10#
 楼主| 发表于 2008-9-23 15:42:44 | 只看该作者
USER=atoi(lr_eval_string("{vuserID}"));    //vuserID用 vuserid类型的参数.
vuserID是怎么取到的?
用vuserid类型的参数是什么意思?
我的QQ171041490
回复 支持 反对

使用道具 举报

该用户从未签到

11#
发表于 2008-9-23 15:49:13 | 只看该作者
.....vuserid参数::参数类型有很多,什么File、跌代ID,随机,日期,其中就有一个是vuserid,
公司不能上QQ。。。不好意思。。
回复 支持 反对

使用道具 举报

该用户从未签到

12#
 楼主| 发表于 2008-9-23 16:24:17 | 只看该作者
你的是正版的吗?我的LR帮助里怎么找不到这些类型的。
而且写上去之后LR不识别啊!
回复 支持 反对

使用道具 举报

该用户从未签到

13#
 楼主| 发表于 2008-9-23 16:27:24 | 只看该作者
你有成功的脚本吗?给我发一份啊.
回复 支持 反对

使用道具 举报

该用户从未签到

14#
发表于 2008-9-23 17:00:30 | 只看该作者
笨啊...
  自己做个实验不就明白了怎么取参数吗?
  lr_out_message("%s",lr_eval_string("{para1}"));
     lr_out_message("%s",lr_eval_string("{para2}"));
自己让它循环几次,看看输出是什么结果,再用controller 来跑下结果.再看看不就什么都明白了.... 
   
回复 支持 反对

使用道具 举报

该用户从未签到

15#
发表于 2008-9-23 17:04:41 | 只看该作者
我真无语了。。。不知道怎么说了, ,选择参数有个下拉框啊,默认是FILE,你点点啊,验证就象楼上说的这样,,先在vgen里面看看,,然后到controller ,看看每个的showlog看是否正确啊
回复 支持 反对

使用道具 举报

该用户从未签到

16#
 楼主| 发表于 2008-9-23 19:20:55 | 只看该作者
我把登录的userid和passwd都参数化了,用创建表的形式存储了10个用户和对应的密码。
然后再shelldialog中int count,i,user;
        char reqid1[256];
        char flowid[256];
        char reqid;
               
        lr_rendezvous("rendezvous");

        user=atoi(lr_eval_string("{NewParam}"));
        lr_output_message("user:%d",user);
这样写的。newparam是用vserID的参数类型的。
然后我再controller中跑了10个并发用户的,但是从后台看登录的还是用的一个用户名。
回复 支持 反对

使用道具 举报

该用户从未签到

17#
 楼主| 发表于 2008-9-24 08:18:36 | 只看该作者
脚本终于改完了,但是不知为什么contorller执行并发时的用户始终是一个人。                     
int count,i,user;
        char reqid1[256];
        char flowid[256];
        char reqid;
        char *ip;
       
        /*
        ip=lr_get_vuser_ip();
        if(ip)
        lr_output_message("the ip address is :%s",ip);
        else
        lr_output_message("the ip spooling disabled");
        */
        user=atoi(lr_eval_string("{vuserid}"));
        lr_output_message("%d",user);

        /*计算usertasks首页reqId的总数*/
        count=atoi(lr_eval_string("{req_id_count}"));
        lr_output_message("count=%d",count);

        /*循环执行shell交互,输入111,10为虚拟用户的个数*/
        for(i=1;i<=count/10;i++)
        {
                /*存储req_id的各个元素到reqid1中,根据conut值计算存储的次数*/
                sprintf(reqid1,"{req_id_%d}",user+10*(i-1)-1);
                sprintf(flowid,"{flow_id_%d}",user+10*(i-1)-1);
                lr_message("%s   %s",lr_eval_string(reqid1),lr_eval_string(flowid));
               
                /*将reqid1的值赋给reqid,并在下面是用reqid进行参数化*/
                lr_save_string(lr_eval_string(reqid1),"reqid");
                lr_save_string(lr_eval_string(flowid),"bufferflow");

        lr_rendezvous("rendezvous");
        web_url("shellWindow.do",
                "URL=http://192.168.0.135:8888/usertasks/shellWindow.do?reqId={reqid}&flowId={bufferflow}&actId=1&flowInsName=qqqflowInsName&actName=ShellCmdactName",
                "Resource=0",
                "RecContentType=text/html",
                "Referer=",
                "Snapshot=t4.inf",
                "Mode=HTML",
                LAST);

        web_url("style.css",
                "URL=http://192.168.0.135:8888/usertasks/css/style.css",
                "Resource=1",
                "RecContentType=text/css",
                "Referer=http://192.168.0.135:8888/usertasks/shellWindow.do?reqId={reqid}&flowId={bufferflow}&actId=1&flowInsName=qqqflowInsName&actName=ShellCmdactName",
                LAST);

        web_url("tab.css",
                "URL=http://192.168.0.135:8888/usertasks/css/tab.css",
                "Resource=1",
                "RecContentType=text/css",
                "Referer=http://192.168.0.135:8888/usertasks/shellWindow.do?reqId={reqid}&flowId={bufferflow}&actId=1&flowInsName=qqqflowInsName&actName=ShellCmdactName",
                LAST);
       
        web_url("iconErrors.gif",
                "URL=http://192.168.0.135:8888/usertasks/images/iconErrors.gif",
                "Resource=1",
                "RecContentType=image/gif",
                "Referer=http://192.168.0.135:8888/usertasks/shellWindow.do?reqId={reqid}&flowId={bufferflow}&actId=1&flowInsName=qqqflowInsName&actName=ShellCmdactName",
                LAST);

        web_url("btnLong.gif",
                "URL=http://192.168.0.135:8888/usertasks/images/btnLong.gif",
                "Resource=1",
                "RecContentType=image/gif",
                "Referer=http://192.168.0.135:8888/usertasks/shellWindow.do?reqId={reqid}&flowId={bufferflow}&actId=1&flowInsName=qqqflowInsName&actName=ShellCmdactName",
                LAST);
   
        web_custom_request("freshConsole.do",
                "URL=http://192.168.0.135:8888/usertasks/freshConsole.do?reqId={reqid}&flowId={bufferflow}&outLine=0&errLine=0&allLine=100&stdLastLine=0&errLastLine=0",
                "Method=POST",
                "Resource=0",
                "RecContentType=text/html",
                "Referer=http://192.168.0.135:8888/usertasks/shellWindow.do?reqId={reqid}&flowId={bufferflow}&actId=1&flowInsName=qqqflowInsName&actName=ShellCmdactName",
                "Snapshot=t5.inf",
                "Mode=HTML",
                "EncType=",
                LAST);
回复 支持 反对

使用道具 举报

该用户从未签到

18#
发表于 2008-9-24 09:38:29 | 只看该作者
完成就好,如果只有一个用户的话,说明你在init里面的参数化设置的原因,你仔细去看下。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-5-6 17:26 , Processed in 0.094483 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表