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