相信做软件测试工作的人在实际测试过程可能遇到不同的业务流程和场景模型,这样必须借助一些技巧或方法来解决实际测试过程中的问题。今天我们一起来学习在性能测试中要用到的一些技巧。
LoadRunner录制结束后会自动生成一段脚本。这段脚本虽然很简单,但很实用,适合初学者学习。但是在真正进行项目性能测试时,只靠LoadRunner自动生成的脚本还是不够,很难达到业务的要求。因此,在录制脚本结束后,要对脚本进行完善,使其能达到业务模拟的要求,这样尽可能地使虚拟用户模拟时更接近用户的实际使用。
1、检查点
在进行压力测试时,经常会有页面间数据传递的操作。如果在测试过程中传递数据的次数逐渐增多,页面就有可能会发生传递混乱,或者客户端与服务器端数据传输被中断、传输过程中产生了错误的数据等情况。为了判断数据传递的正确性,更重要的是为了节省人工检查的步骤和时间,LoadRunner提供了在脚本中插入检查点的方法,在每次运行时都检查服务器返回页面的信息是否正确,这样可以大大提高测试效率。
检查点的原理是通过检查点函数将返回值的结果反映在Controller的状态面板上和Analysis统计结果中。这个原理是基于LoadRunner中很多的API函数的返回值会改变脚本的运行结果。比如,检查点函数web_find,如果它检查到的结果为空,它的返回值就为LR_FAIL,这样整个结果置为FAIL;反之,检查到的结果为成功,则web_find返回值是LR_PASS,整个结果置为PASS。
2、为什么需要插入检查点
通常在测试过程中使用到两种检查点,文本检查点和图片检查点。那么为什么需要插入检查点呢?以飞机订票系统的登录功能为例,我们来观察在不插入检查点回放,事务结束状态的情况。
首先录制登录的脚本,脚本如下(部分核心代码):
web_reg_save_param("WCSParam2",
"LB/IC=userSession value=",
"RB/IC=>",
"Ord=1",
"Search=Body",
"RelFrameId=1",
LAST);
web_url("nav.pl",
"URL=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
"Resource=0",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true",
"Snapshot=t7.inf",
"Mode=HTTP",
LAST);
web_concurrent_end(NULL);
web_url("mer_login.gif",
"URL=http://127.0.0.1:1080/WebTours/images/mer_login.gif",
"Resource=1",
"RecContentType=image/gif",
"Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
"Snapshot=t8.inf",
LAST);
lr_start_transaction("Login");
lr_think_time(14);
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);
web_concurrent_start(NULL);
web_url("nav.pl_2",
"URL=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
"Resource=0",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/login.pl",
"Snapshot=t10.inf",
"Mode=HTTP",
LAST);
web_url("login.pl_2",
"URL=http://127.0.0.1:1080/WebTours/login.pl?intro=true",
"Resource=0",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/login.pl",
"Snapshot=t11.inf",
"Mode=HTTP",
LAST);
web_concurrent_end(NULL);
在这个脚本中并没有插入检查点,回放脚本,日志文件如图6-1所示。
图6-1 脚本回放日志
从回放日志中可以看出,登录事务是正确的,用户成功登录,这没有问题,现在将web_submit_data函数用户名和密码的参考修改一下,将其修改为如下代码:
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=abcdef00133", ENDITEM,
"Name=password", "Value=ddaa", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
"Name=login.x", "Value=46", ENDITEM,
"Name=login.y", "Value=6", ENDITEM,
LAST);
重新回放脚本,回放日志如图6-2所示。
图6-2 脚本回放日志
从回放日志中可以清晰的看到,登录还是成功的,但实际情况下使用用户名为abcdef00133,密码为ddaa是不可能登录成功的。从LoadRunner的Run-Time Viewer视图中也可以看出,Run-Time Viewer视图结果如图6-3所示。
图6-3 Run-Time Viewer视图
登录成功后正常的情况是,Welcome后面会显示出登录的用户名。
这个例子说明一个问题,当事务的结束状态为成功时,并不能说明业务真的做成功了,那么同理,当在分析器中看到事务的成功率为100%时,平均事务响应时间也是在期望范围内时,也不能说明系统没有问题,也有可能出现这种情况,业务没有做成功,但事务的结束状态都被置为成功了,这样分析到的结果就完全错了。
那么LoadRunner是如何确定事务结束状态为PASS的呢?其实LoadRunner本身无法实际去判断业务是否做成功,其判断事务是否成功的依据是结束事务函数(lr_end_transaction)是否被执行,如果结束事务函数执行成功,那么LoadRunner则会将事务的结束状态设置为PASS。
从这个例子可以看出,如果需要确定事务是否成功,其实首先应该判断是否登录成功,只有当登录成功时,才能确定登录事务是成功的,所以其实检查点的根本目的是验证测试过程中的步骤是否被正确的执行,也可以理解为业务是否被正确的执行,只有这样才能保证后期分析的数据是正确的。
今天关于“性能测试技巧——LoadRunner检查点”的内容就学习完了,大家喜欢的话记得每天来这里和小编一起学习涨薪技能哦。(笔芯)
附:川石信息全国校区最新开班时间,课程资料获取13691729932(微信同号)。