事务又称为 Transaction ,在 LoadRunner 中的定义如下 :An end-to-end(browser-to-browser) measurement of one or more user actions within action f" name="description" />
MILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">事务又称为Transaction,在LoadRunner中的定义如下:An end-to-end(browser-to-browser) measurement of one or more user actions within action file。中文理解如下:事务(Transaction)是这样一个点,我们为了衡量某个action的性能,需要在action的开始和结束位置插入这样一个范围,这就定义了一个transaction。
事务的作用:LoadRunner 运行到该事务的开始点时,LoadRunner 就会开始计时,直到运行到该事务的结束点,计时结束。这个事务的运行时间在LoadRunner的运行结果中会有反映。通俗的讲LoadRunner中的事务就是一个计时标识,LoadRunner在运行过程中一旦发现事务的开始标识,就开始计时,一旦发现事务的结束表示,则计时结束,这个过程中得到的时间即为一个事务时间。通常事务时间所反映的是一个操作过程的响应时间。
下面我们说说为什么在LoadRunner中使用事务。为什么使用事务的原因是多种多样的,总结下来如下五点所示:
1、事务是 LoadRunner 度量系统性能指标的唯一手段;(没有事务则没有办法衡量系统的响应时间,也许有人说LoadRunner可以通过编程来计时得到,不错如果你编程能力够强是能够实现的,但肯定不如LoadRunner中的事务用的简单而且方便)
2、事务能够用于度量高风险业务流程的性能指标;
3、事务能够度量在一组操作中每一步的性能指标;
4、通过事务计时实现了不同压力负载下的性能指标对比;
5、通过事务计时可以帮助定位性能瓶颈;
从性能测试的角度出发,我们需要知道不同的操作所花费的时间,这样我们就可以衡量不同的操作对被测系统所造成的影响,那么我们如何知道不同的操作所花费的时间,这就用到了事务,我们在操作之前插入一个事务开始标识,在操作完成后插入一个事务结束表示,这样我们就知道了这个操作所花费的时间。
接着我们说说如何使用事务,以及事务应该应用在什么地方。
使用事务有如下几种方法:
1、方法一:脚本生成后,手动插入事务;方法:在LoadRunner脚本中点击鼠标:右键,选择“Insert”→“Start Transaction”弹出一个对话框,输入一个事务名字(注:事务名字可以为中文、可以为英文,也可以中英文混合,但推荐的做法是起一个容易理解的名称,例如想知道登录所花费的时间,则插入事务可以命名为login或登录);“Start Transaction”插入完成后,还需要插入一个“End Transaction”,用以标识事务结束;注:Start Transaction和End Transaction需要成对出现,如果仅插入Start Transaction则脚本编译会提示错误;此外,还可以通过LoadRunner vugen中的“Insert”菜单插入Start Transaction和End Transaction;
2、方法二:在脚本录制过程中插入Start Transaction和End Transaction;在脚本录制过程中,通过录制工具条上的Start Transaction和End Transaction图标插入事务,如下图所示:
3、方法三:通过Run-time Settings 中的Automatic Transactions自动生成事务,如下图所示:
注:该种方法插入的事务仅能在LoadRunner Controller中的图表和报告中看到在脚本的log中看不到。
以上为事务的插入方法,无论是那种方法,插入事务后,我们都可以在脚本中看到如下两个函数:lr_start_transaction("事务")和 lr_end_transaction("事务", LR_AUTO),前一个为事务开始函数,后一个为事务结束函数,括号中引号中的内容为事务名称。
事务举例:如下为一个LoadRunner所生成的脚本。
web_url("Folder.jsp_4",
"URL=http://172.17.16.5/xpc71/jsp/com/folder/Folder.jsp",
"Resource=0",
"RecContentType=text/html",
"Referer=http://172.17.16.5/xpc71/LoginAction.do",
"Snapshot=t10.inf",
"Mode=HTML",
LAST);
web_url("TemplateAdminAction.do",
"URL=http://172.17.16.5/xpc71/TemplateAdminAction.do?forwardID=1",
"Resource=0",
"RecContentType=text/html",
"Referer=http://172.17.16.5/xpc71/LoginAction.do",
"Snapshot=t11.inf",
"Mode=HTML",
LAST);
web_submit_form("ScheduleCreationAction.do",
"Snapshot=t12.inf",
ITEMDATA,
"Name=PTName", "Value=test", ENDITEM,
"Name=headerTempID", "Value=ttte", ENDITEM,
"Name=selectHeader", "Value=1", ENDITEM,
"Name=schTempID", "Value=preProductionDetailTemplate", ENDITEM,
LAST);
我们插入事务之后如下所示:
lr_start_transaction("事务");
lr_start_transaction("事务1");
lr_start_transaction("事务2");
web_url("Folder.jsp_4",
"URL=http://172.17.16.5/xpc71/jsp/com/folder/Folder.jsp",
"Resource=0",
"RecContentType=text/html",
"Referer=http://172.17.16.5/xpc71/LoginAction.do",
"Snapshot=t10.inf",
"Mode=HTML",
LAST);
lr_end_transaction("事务", LR_AUTO);
web_url("TemplateAdminAction.do",
"URL=http://172.17.16.5/xpc71/TemplateAdminAction.do?forwardID=1",
"Resource=0",
"RecContentType=text/html",
"Referer=http://172.17.16.5/xpc71/LoginAction.do",
"Snapshot=t11.inf",
"Mode=HTML",
LAST);
lr_end_transaction("事务1", LR_AUTO);
web_submit_form("ScheduleCreationAction.do",
"Snapshot=t12.inf",
ITEMDATA,
"Name=PTName", "Value=test", ENDITEM,
"Name=headerTempID", "Value=ttte", ENDITEM,
"Name=selectHeader", "Value=1", ENDITEM,
"Name=schTempID", "Value=preProductionDetailTemplate", ENDITEM,
LAST);
lr_end_transaction("事务2", LR_AUTO);
解释:
Ø “事务”统计的时间为
web_url("Folder.jsp_4",
"URL=http://172.17.16.5/xpc71/jsp/com/folder/Folder.jsp",
"Resource=0",
"RecContentType=text/html",
"Referer=http://172.17.16.5/xpc71/LoginAction.do",
"Snapshot=t10.inf",
"Mode=HTML",
LAST);
所执行的时间;
Ø “事务1”统计的时间为:
web_url("Folder.jsp_4",
"URL=http://172.17.16.5/xpc71/jsp/com/folder/Folder.jsp",
"Resource=0",
"RecContentType=text/html",
"Referer=http://172.17.16.5/xpc71/LoginAction.do",
"Snapshot=t10.inf",
"Mode=HTML",
LAST);
web_url("TemplateAdminAction.do",
"URL=http://172.17.16.5/xpc71/TemplateAdminAction.do?forwardID=1",
"Resource=0",
"RecContentType=text/html",
"Referer=http://172.17.16.5/xpc71/LoginAction.do",
"Snapshot=t11.inf",
"Mode=HTML",
LAST);
所执行的时间;
Ø “事务2”统计的时间为:
web_url("Folder.jsp_4",
"URL=http://172.17.16.5/xpc71/jsp/com/folder/Folder.jsp",
"Resource=0",
"RecContentType=text/html",
"Referer=http://172.17.16.5/xpc71/LoginAction.do",
"Snapshot=t10.inf",
"Mode=HTML",
LAST);
web_url("TemplateAdminAction.do",
"URL=http://172.17.16.5/xpc71/TemplateAdminAction.do?
forwardID=1",
"Resource=0",
"RecContentType=text/html",
"Referer=http://172.17.16.5/xpc71/LoginAction.do",
"Snapshot=t11.inf",
"Mode=HTML",
LAST);
web_submit_form("ScheduleCreationAction.do",
"Snapshot=t12.inf",
ITEMDATA,
"Name=PTName", "Value=test", ENDITEM,
"Name=headerTempID", "Value=ttte", ENDITEM,
"Name=selectHeader", "Value=1", ENDITEM,
"Name=schTempID", "Value=preProductionDetailTemplate", ENDITEM,
LAST);
所执行的时间;
从上文我们可以看出事务之间可以嵌套使用,相互之间没有影响,事务计时仅仅以事务名称为标识。
总结:
• 使用LoadRunner transactions可以度量:
– 业务流程中每一步所花费的时间
– 整个业务流程所花费的时间
– 业务流程中每一步的性能指标可以自动度量
• 可以在录制过程中和录制完成后增加LoadRunner transactions
• 利用 “automatic LoadRunner transactions” 可以很方便的度量每一步的性能指标。