51Testing软件测试论坛
标题:
LoadRunner脚本调试后的优化---事物的优化
[打印本页]
作者:
xfde51
时间:
2011-4-1 22:55
标题:
LoadRunner脚本调试后的优化---事物的优化
经常做性能测试,大家有没有想过一个问题:将自己的脚本做的更完美一点?
举个简单的例子:
一个查询的功能,查询条件如下:
部门:开发部,测试部,资料部
关键指标:指标1,指标2,指标3
排名:10,20,50,100
那么,我们在录制一个查询脚本以后,我们会对以上3个地方做参数化,不同的取值,做查询操作
然后跑场景,得出这个查询的平均响应时间,最大,最小,90%,方差等数据。
OK,这个脚本算是可用了,也可以出跑完,分析,出报告,出结果,接着调优等等
问题来了:这个查询将作为一个transaction存在,在结果中也只有这么一个transaction。
我想要知道,不同查询条件组合下,的响应时间等数据,如何做?
比如:我的这个事物是:
lr_start_transaction("查询");
.
.
lr_end_transaction("查询",LR_AUTO);
在跑完场景后,生成的报告中,就只有一个“查询”这样子一个数据
Transaction Name SLA Status Minimum Average Maximum Std. Deviation 90 Percent Pass Fail Stop
查询 0.23 0.26 0.326 0.03 0.308 200 0 0
我想要的是:
部门:开发部,关键指标:指标1,排名:10
部门:测试部,关键指标:指标1,排名:10
部门:资料部,关键指标:指标1,排名:10
等等,不同部门的不同指标的不同排名,单个统计出来,只要一个脚本,不新增Action,也不新增transaction,web_submit_data就只有一个。
如何实现?
作者:
jj_ljw
时间:
2011-4-2 10:06
排名是什么,性能测试?
作者:
archonwang
时间:
2011-4-2 11:05
这个需要根据不同的参数设计不同的脚本才能分析的。。。
作者:
阿七
时间:
2011-4-2 14:30
多建几个事物 不就完了?
作者:
xinyu2119
时间:
2011-4-2 15:16
说实话不是很明白你说的意思,你的意识是不是说想把三个查询都放在
lr_start_transaction("查询");
.
lr_end_transaction("查询",LR_AUTO);
这个transaction中?而且是不是想让三个查询都得到相应数据?
如果是这样的话,那我就要问你了,transaction到底是什么意思?是对单个事件动作的截取,从而得到这个事件的各种数据,你要是把三个查询都放在一个transaction里面,那得到的只能是个总时间。
再说了,为啥非要放在一个transaction里面啊,做三个transaction不就好了么
或者做三个脚本,每个脚本一个查询transaction,然后用同一个Scenario 去跑也可以得到,不嫌麻烦就行
作者:
archonwang
时间:
2011-4-2 16:52
如果单纯看数据库的话,简单检查下对应的查询条件是否有索引了是个方法,毕竟差异并不太大的。
作者:
xfde51
时间:
2011-4-2 23:12
本帖最后由 xfde51 于 2011-4-3 22:16 编辑
问题解决了,研究了半天,终于解决了,翻阅和查找了很多资料,希望能对大家有所帮助。
[attach]72290[/attach]
我想要描述的就是这样子的情况
附上个简单的脚本和报告
希望大家能否理解到我想要描述和表达的意思
一个好的脚本不在于多加几个Action,多加几个事物点
而是精于心,简于形
虽然臭屁了点,不过这个一直是我的原则。见笑了,呵呵。
想法无聊点,喜欢的看看吧,不喜欢的飘过吧。
希望跟大家共同研究探讨,以前上课的时候,很喜欢听云层老师讲课,所以有些习惯也带过来了。。。
我把代码贴上来,可以省去下载附件的麻烦:
我就贴了主要的地方:
Action()
{
//以登录为例,我可以看到每个用户登录消耗了多少时间
//当然了,这个是临时做的脚本,换做是查询的脚本的话,我就可以看到每个查询参数,查询消耗了多少时间
//跑5分钟,出个报告就知道我所描述的想法了
char rname[20];
sprintf(rname,"Run_Report_%s_%s",lr_eval_string("{name}"),lr_eval_string("{pw}"));
lr_output_message(rname);
web_url("WebTours",
"URL=http://127.0.0.1:1080/WebTours/",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t6.inf",
"Mode=HTML",
LAST);
// lr_start_transaction("login");
lr_start_transaction(rname);
lr_think_time(12);
web_submit_data("login.pl",
"Action=http://127.0.0.1:1080/WebTours/login.pl",
"Method=POST",
"TargetFrame=body",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
"Snapshot=t7.inf",
"Mode=HTML",
ITEMDATA,
"Name=userSession", "Value=105419.738598623ftccfcHpiAtVzzzHDcfDfpVzzicf", ENDITEM,
"Name=username", "Value={name}", ENDITEM,
"Name=password", "Value=123456", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
"Name=login.x", "Value=45", ENDITEM,
"Name=login.y", "Value=4", ENDITEM,
LAST);
// lr_end_transaction("login",LR_AUTO);
lr_end_transaction(rname,2);
作者:
yzylion
时间:
2011-4-4 13:07
恩,不错,想法值得提倡,精于心,简于形
不过:有时候我们需要考虑下,是否有这个必要,不要就可能是打着精于心,简于型的幌子来。呵呵,复杂简单化,结果为导向,是我当前做测试的原则,只要你能完成任务就ok,而不是说一定要像开发一样,专到一个新的技术里面,而enjoy过程,忽视了整体
不过你的贴出来的脚步貌似是不完全贴出还是什么?存在一些问题
1、PW没有看到是什么内容的参数
2、没有关联usersession?后台没有开动态?
所以,作为测试一定要严谨,不能贴错误的代码上来,因为有很多新手可能就是想从你这里学习和得到指导,人家把你当权威,一下下来发现脚本怎么都跑不通?就会upset,就会对自己感到失望,这个我是这么认为的
所以感谢你的分享的同时,提出以上建议
不求苟同,欢迎拍砖,分享
作者:
yzylion
时间:
2011-4-4 13:14
至于我上面说的是不是有这个必要,也是从你说的精于心,简于型来考虑到
1、做这样的查询是为了测试系统的不同后台数据库容量的情况下,前台的查询的响应时间
2、在1的基础上,你的数据是怎么造的?是否跟线上的实际数据的切合度非常高?还是就是瞎编乱造?
3、如果说是跟线上实际数据一样或十分接近,那么注意缓存的影响,带宽的模拟,对用户搜索的行为的分析从而模拟出对实际的使用的参数进行搜索测试,这个想必你也想到了,做一个int变量,取随机值,进行if判断,然后在percent多少到多少之间,执行的是什么的transaction
所以,单单就以上的几点来看,我个人认为,分析,确定场景,策略是很重要的,只要前面定了,是有效的,后面做的就要以结果为导向,而后再持续优化,因为,谁说少的代码执行时间就一定比多几个submit,多几个action的时间短呢?就如同:你的代码里一次性提交所有的事务进行处理,而我用多几行的代码进行分批提交进行处理,你说哪个的处理时间会快点呢?
个人所见,不求苟同,期待沟通,交流,谢谢
作者:
xfde51
时间:
2011-4-5 00:58
非常感谢您的指导和提醒,让我发现有很多地方的不足和考虑上的缺失,
我会不断的吸取转化和改进,你们的反馈将会有助于我持续上进,谢谢,非常感谢。
贴出来的这段代码不完整,完整代码在附件里,之前担心贴不完,所以仅贴了主要改动的地方,
下次我会贴出完整的脚本,脚本中会加入许多的注释和说明,表述出这一步是做什么的,我在这里思考了什么,这一步我想关注什么,我想实现什么。
确实:代码的多少影响的时间几乎可以忽略不计。
提出这个问题,是想表达一种做法:
在达到同样效果和目的的情况下,
尽可能的精简代码量,更便于自己和其他人的调试和维护。
同意你的观点:性能执行前,对于被测系统的分析,业务场景构解,数据的构造,策略的制定非常重要。
非常感谢你的指导,感受颇多。
期待更多的沟通、交流和指导,谢谢
作者:
archonwang
时间:
2011-4-6 13:30
char rname[20];
sprintf(rname,"Run_Report_%s_%s",lr_eval_string("{name}"),lr_eval_string("{pw}"));
lr_output_message(rname);
这段代码有用。呵呵。
认真学习下sprintf函数。。
作者:
xiaoxia318205
时间:
2011-4-6 13:41
很好,很有帮助,谢谢~~楼主是个好学人,而且对新想法敢于探索,不错~~
作者:
joanchongzi
时间:
2011-4-8 09:25
支持一下!值得学习
作者:
yzylion
时间:
2011-4-8 14:44
是的,楼主得确是有心人,期待沟通交流,谢谢
作者:
shu123
时间:
2011-11-2 16:16
这个要依据不同的性能需求而视。。。
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2