51Testing软件测试论坛

标题: eloadrunner真的能并发么! [打印本页]

作者: duola1119    时间: 2008-9-22 15:14
标题: eloadrunner真的能并发么!
大家先看看这个脚本。
执行此脚本,一个用户就可以通过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;
}
作者: lijian422202    时间: 2008-9-22 16:49
LZ,我想问问10个用户进入首页看到的内容是否一样,如果不一样的话,那么这个脚本就可以成立;
如果每个用户进去都是看到所有的内容,都是一样的话,那么req_id_count并发提取的内容都是一样,这样并发就会可能出错误;
建议以vuserid做为参数,FOR循环用count/10取整,最后分配成第一个用户,对1、11、21下标的count做操作,第2个用户对2、12、22来操作,以此类推。
作者: duola1119    时间: 2008-9-22 17:09
如何以vuserid做为参数?
作者: duola1119    时间: 2008-9-22 17:15
我把登录的vuser初始化了10个,等我回家试试,能为这10个分配不同的reqId.
作者: lijian422202    时间: 2008-9-22 17:26
USER=atoi(lr_eval_string("{vuserID}"));   //这里的vuserID用 vuserid类型的参数

for(i=0;i<=count/10;i++){
          用循环的i 与USER联接起来,做为count下标。。。。。。具体的方法忘了。这样就可以实现第一个用户第一次跌代为01,第2次为11,第2个用户就是02,12,这样了
}
作者: duola1119    时间: 2008-9-23 09:51
很感谢您的回答,我还有问题。
如果是在Virtual User Generator中执行迭代的话,用户的登录操作是在init中,那执行迭代的只有action中的脚本,而不迭代登录操作,这样的话使用atoi函数取到的用户也只能是一个,就是去了意思了。
另外,我最终的意思不是使用Generator中的迭代,而是使用controller执行并发,假设并发10个,那就是有10个不同的用户登录,第一个用户取req_id_0,第二个用户取req_id_1....
第十个用户取req_id_9,不让两个用户同时对一个reqId进行操作。
如果有好的策略请不吝赐教。
作者: lijian422202    时间: 2008-9-23 11:01
用户登陆在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,所以的跌代次数依赖你的数据。

不知道我的回答能帮你解决问题吗?
作者: duola1119    时间: 2008-9-23 14:17
不明白你的第一段话。
我用controller并发10个用户,但是用的确都是一个用户。userid和passwd是用文件参数化的,里面一共有10个账户和密码。
再有user/10如果user小于10,它的结果始终都是0.还是会出现多个用户抢一个ID执行的问题。
作者: lijian422202    时间: 2008-9-23 14:25
不是user/10,,,是你关联用到的count/10,也就说,你关联到100条可以执行操作的数据,这个时候正好并发10人,也就是说,你的数据够你10个用户执行10次,如果是105也这样,把多的5条不要了
作者: duola1119    时间: 2008-9-23 15:42
USER=atoi(lr_eval_string("{vuserID}"));    //vuserID用 vuserid类型的参数.
vuserID是怎么取到的?
用vuserid类型的参数是什么意思?
我的QQ171041490
作者: lijian422202    时间: 2008-9-23 15:49
.....vuserid参数::参数类型有很多,什么File、跌代ID,随机,日期,其中就有一个是vuserid,
公司不能上QQ。。。不好意思。。
作者: duola1119    时间: 2008-9-23 16:24
你的是正版的吗?我的LR帮助里怎么找不到这些类型的。
而且写上去之后LR不识别啊!
作者: duola1119    时间: 2008-9-23 16:27
你有成功的脚本吗?给我发一份啊.
作者: superfang    时间: 2008-9-23 17:00
笨啊...
  自己做个实验不就明白了怎么取参数吗?
  lr_out_message("%s",lr_eval_string("{para1}"));
     lr_out_message("%s",lr_eval_string("{para2}"));
自己让它循环几次,看看输出是什么结果,再用controller 来跑下结果.再看看不就什么都明白了.... 
   
作者: lijian422202    时间: 2008-9-23 17:04
我真无语了。。。不知道怎么说了, ,选择参数有个下拉框啊,默认是FILE,你点点啊,验证就象楼上说的这样,,先在vgen里面看看,,然后到controller ,看看每个的showlog看是否正确啊
作者: duola1119    时间: 2008-9-23 19:20
我把登录的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个并发用户的,但是从后台看登录的还是用的一个用户名。
作者: duola1119    时间: 2008-9-24 08:18
脚本终于改完了,但是不知为什么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);
作者: lijian422202    时间: 2008-9-24 09:38
完成就好,如果只有一个用户的话,说明你在init里面的参数化设置的原因,你仔细去看下。




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