在性能测试过程中如果希望获得用户一系列操作的响应时间就需要插入事务,所以事务也即是客户要实现的业务。事务响应时间则是指在测试过程中一系列的请求完成后,所花费的时间。
事务响应时间的原理是将业务操作结束时的时间点头减掉业务开始时的时间点,得到的差值就是事务响应时间,事务响应时间直观反馈了业务的响应时间,所以事务有两部分组成:一是开始事务函数;二是结束事务函数。
插入事务有两种方法:一种是在脚本录制过程中插入开始和结束事务点;另一种是在编辑脚本时插入开始和结束事务点。一般情况下选择在脚本录制过程中插入开始和结束事务点。这样做有两个优点:第一,保证不会遗漏需要插入的事务点;第二,避免在脚本录制完成后找不到确切的插入事务点的地方,对于有经验的性能测试工程师这可能不是问题,但是对于一个新手很有可能无法确切地找到插入事务点的位置。
方法一:在脚本录制过程中插入开始和结束事务点
当脚本录制到需要插入事务点时,在录制工具栏中点击“插入开始事务点”按钮,如图3-34所示。在弹出的“开始事务”对话框中输入开始事务名称,如图3-35所示。事务点名称的格式应该保持统一,使其具有代表性,遵守脚本编辑命名规则。
图3-35 输入开始事务名称
事务的开始点与事务的结束点具有一一对应的特点,即在脚本中插入了一个事务开始点后一定要在接下来的过程中插入事务结束点,插入结束事务点与插入开始事务点的操作一致,当该业务流程执行完毕后需要添加结束事务点,在录制工具栏中点击“插入结束事务点”按钮,如图3-36所示。在弹出的“结束事务”对话框中输入结束事务名称,一般在下拉框中选择,因为下拉框中包含了所有开始事务点的名称,如图3-37所示。
图3-36 录制中插入结束事务点
图3-37 输入结束事务名称
方法二:在脚本录制完成后插入开始和结束事务点
在生成的脚本中找到要插入开始事务点的地方,选择菜单Insert→Start Transaction(Ctrl+T),如图3-38所示。在弹出的“开始事务”对话框中输入开始事务的名称,如图3-39所示。
插入结束事务点的过程与插入开始事务点的步骤是一致的,在生成的脚本中找到要插入结束事务点的地方,选择菜单Insert→End Transaction(Ctrl+T),如图3-40所示。在弹出的“结束事务”对话框中输入结束事务的名称,如图3-41所示。
在“结束事务”对话框中,比在脚本录制过程中插入结束事务点时的“结束事务”对话框中多出一项Transaction Status,其事务状态有四种可选:LR_AUTO、LR_PASS、LR_FAIL和LR_STOP。
LR_AUTO:事务的状态被自动设置,如果事务执行成功,状态设置为PASS;如果事务执行失败,状态设置为FAIL;如果事务异常中断,状态设置成STOP。
LR_PASS:事务执行成功,代码返回的状态是PASS。
LR_FAIL:事务执行失败,代码返回的状态是FAIL。
LR_STOP:事务异常中断,代码返回的状态是STOP。
那么为什么需要事务状态呢?因为在测试过程中不单需要获取事务的响应时间,还需要确定业务是否成功,如果事务响应时间很短,但是事务都失败了,这样的系统性能也是无法满足客户需求的,所以需要通过事务的响应时间来标示业务是否成功。在结果分析器中也有一项是关于结束事务状态的,如图3-42所示。
图3-42 结果分析器中的结束事务状态
需要注意的是,在结果分析器中,结束事务状态并没有自动的状态,因为在脚本中设置自动化状态后,LoadRunner会自动判断事务运行后的结果是否正确。
但有一个问题需要注意,当在脚本中把结束事务设置为自动化时,LoadRunner真的能正确的判断事务运行的状态吗?LoadRunner自动化判断事务状态的原理是什么呢?下面来通过一个试验来验证一下这个问题,录制一个登录的脚本,以飞机订票系统的登录为例:
先录制一个正常的脚本,并且插入一个事务,事务的结束状态设置为AUTO,录制好的脚本如下:
web_reg_save_param("WCSParam2",
"LB/IC=userSession value=",
"RB/IC=>",
"Ord=1",
"Search=Body",
"RelFrameId=1",
LAST);
…
lr_start_transaction("login");
lr_think_time(10);
web_submit_data("login.pl",
"Action=http://127.0.0.1:1080/WebTours/login.pl",
"Method=POST",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
"Snapshot=t9.inf",
"Mode=HTTP",
ITEMDATA,
"Name=userSession", "Value={WCSParam2}", ENDITEM,
"Name=username", "Value=test1", ENDITEM,
"Name=password", "Value=1", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
"Name=login.x", "Value=46", ENDITEM,
"Name=login.y", "Value=6", ENDITEM,
LAST);
…
lr_end_transaction("login",LR_AUTO);
回放这个脚本时,事务的结束状态为PASS,这是正确的,因为这个脚本是可以正确的登录,但现在将脚本修改一下,将提交用户名与密码的请求,修改为登录不成功的帐号与密码,代码修改后如下:
web_submit_data("login.pl",
"Action=http://127.0.0.1:1080/WebTours/login.pl",
"Method=POST",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
"Snapshot=t9.inf",
"Mode=HTTP",
ITEMDATA,
"Name=userSession", "Value={WCSParam2}", ENDITEM,
"Name=username", "Value=gabbdfbegerfdsf", ENDITEM,
"Name=password", "Value=1", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
"Name=login.x", "Value=46", ENDITEM,
"Name=login.y", "Value=6", ENDITEM,
LAST);
回放脚本后,发现回放日志中还是显示事务的结束状态为PASS,但在LoadRunner的Run-Time Viewer窗体中看到并未登录成功(因为如果登录成功,该页面会显示当前登录的用户名),如图3-43所示,当然这个帐号就是不可能登录成功的。
图3-43 登录失败的回放日志
从这个例子中可以看出,事务结束状态为PASS并不代表业务一定做成功了,之所以会出现这种情况是因为LoadRunner在自动判断事务结束状态时是以结束函数是否运行为标准,即只要结束事务函数运行,那么就将事务的结束状态置为PASS,反之将事务的结束状态置为FAIL。
那么再回到这个例子,正常的情况应该是登录后,先检查登录的帐户名是否正确,如果检查到正确后才将事务的结束状态置为PASS,这样才能保证业务成功了。所以一般情况下都需要先设置检查点后,再根据检查点来判断事务是否成功,这样才比较合理,关于使用检查点来判断事务是否成功,在后面的章节中会详细介绍。
附:川石信息全国校区最新开班时间,课程资料获取13691729932(微信同号)。