在《性能测试工具脚本录《制及调试方法之 Jmeter》中详细描述如何使用 Jmeter 进行脚本录制及调试。在调试过程需要对验证码、JSESSIONID、ticket 三个参数进行关联才能调通。由于 Jmeter 是开源免费软件,不支持自动扫描关联,只能全部自动关联,其中用到了:边界提取器、正则表达式提取器、HTTP Cookie 管理器三项技术才解决脚本调试问题。
在商业软件 LoadRunner(Micro Focus),kylinPET(奇林),CPTS(华为)、PTS(阿里)中,这次我们选择大家熟悉的 Loadrunner 做为脚本录制和调试的工具,看一看这款工具到底如何?LoadRunner 的版本我们选择最新的 2021 版本。
步骤 1:选择被测系统 URL:http://59.110.158.28/Example/
步骤 2:启动 Virtual User Generator,准备录制脚本(录制时建议启动 Fiddler 软件,只有这样脚本才能顺畅录制,该方法也是从其它网友学习的经验,如果不打开 Fidder 将会很慢或录制失败)
步骤 3:新建脚本
步骤 4:点击录制按钮,在弹出的对话框中输入需要录制的 URL 和使用的浏览器(这里选择 Chrome)
步骤 5:点击"开始录制” 按钮,进行录制,按提示输入密码和验证码
提交登录时,新建一个开始事务,加完毕后,结束事务。
最后录制生成的脚本如下所示:
Action()
{
web_add_auto_header("Upgrade-Insecure-Requests",
"1");
web_url("Example",
"URL=http://59.110.158.28/Example/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t47.inf",
"Mode=HTML",
EXTRARES,
"Url=images/button/btn_login.png", "Referer=http://59.110.158.28/Example/css/login.css", ENDITEM,
"Url=../favicon.ico", ENDITEM,
LAST);
web_add_auto_header("Origin",
"http://59.110.158.28");
lr_start_transaction("1_transaction");
web_submit_form("login",
"Snapshot=t48.inf",
ITEMDATA,
"Name=name", "Value=admin", ENDITEM,
"Name=password", "Value=admin", ENDITEM,
"Name=validate", "Value=2362", ENDITEM,
LAST);
web_revert_auto_header("Upgrade-Insecure-Requests");
web_add_auto_header("X-Requested-With",
"XMLHttpRequest");
web_submit_data("getNews",
"Action=http://59.110.158.28/Example/getNews",
"Method=POST",
"RecContentType=text/plain",
"Referer=http://59.110.158.28/Example/index.jsp?ticket=ST-1631004678659",
"Snapshot=t49.inf",
"Mode=HTML",
ITEMDATA,
"Name=times", "Value=5", ENDITEM,
LAST);
web_submit_data("getNews_2",
"Action=http://59.110.158.28/Example/getNews",
"Method=POST",
"RecContentType=text/plain",
"Referer=http://59.110.158.28/Example/index.jsp?ticket=ST-1631004678659",
"Snapshot=t50.inf",
"Mode=HTML",
ITEMDATA,
"Name=times", "Value=2", ENDITEM,
LAST);
web_submit_data("getNews_3",
"Action=http://59.110.158.28/Example/getNews",
"Method=POST",
"RecContentType=text/plain",
"Referer=http://59.110.158.28/Example/index.jsp?ticket=ST-1631004678659",
"Snapshot=t51.inf",
"Mode=HTML",
ITEMDATA,
"Name=times", "Value=4", ENDITEM,
LAST);
web_submit_data("getNews_4",
"Action=http://59.110.158.28/Example/getNews",
"Method=POST",
"RecContentType=text/plain",
"Referer=http://59.110.158.28/Example/index.jsp?ticket=ST-1631004678659",
"Snapshot=t52.inf",
"Mode=HTML",
ITEMDATA,
"Name=times", "Value=1", ENDITEM,
LAST);
web_submit_data("getNews_5",
"Action=http://59.110.158.28/Example/getNews",
"Method=POST",
"RecContentType=text/plain",
"Referer=http://59.110.158.28/Example/index.jsp?ticket=ST-1631004678659",
"Snapshot=t53.inf",
"Mode=HTML",
ITEMDATA,
"Name=times", "Value=3", ENDITEM,
LAST);
web_submit_data("getNews_6",
"Action=http://59.110.158.28/Example/getNews",
"Method=POST",
"RecContentType=text/plain",
"Referer=http://59.110.158.28/Example/index.jsp?ticket=ST-1631004678659",
"Snapshot=t54.inf",
"Mode=HTML",
ITEMDATA,
"Name=times", "Value=6", ENDITEM,
LAST);
lr_end_transaction("1_transaction",LR_AUTO);
return 0;
}
步骤 6:脚本调试,从脚本调试结果全部通过(录制脚本笔者未做任何改动和关联)。
到此为止,如果你认为脚本调试通过,那后面的工作,一切都是白做。对 loadRunner 软件与 Jmeter 类似,如果 http 请求返回 20X-599 之间的响应码,他们都认为 http 返回是正确,这就造成在测试过程产生巨大的错误。
要命的是 LR 在回放过程看不到 http 请求的返回的详细信息,很难判断脚本是否真实通过。如果 LR 在回放时设置为 HTTP 代理模式,同时打开 Fiddler 工具来检查,也是一个行之有效的办法,或者可录制过程不断的添加检查点都是行之有效的办法。
回放过后,可以在 Fiddler 里面看到每个请求的返回结果。
步骤 6:参数关联
LR 毕竟是商业工具,对于验证码、JSESSIONID、ticket 三个需要关联的参数,其中 JSESSIONID 和 ticket 作了自动处理,无需要用户手工关联。
用户只需要手工关联验证码即可,同时对应的登录验证码值修改为{validateCode}变量
步骤 7:再次回放,回放后,再次查看 Fiddler 拦截的 http 请求,getNews 接口已经有了返回数据。
步骤 8:场景执行,设置并发数为 5,持续运行 1 分钟
通过场景运行结果看:页面加载时间大于 10 秒,与真实情况不符。原因与 Jmeter 一样,都是因为虚拟用户的并发模型的与浏览器不一致导致错误的结果。
总结:
1、LoadRunner 作为商业工具虽然对 JSESSIONID、ticket 作了自动关联处理,但是回放扫描无法自动识别验证码,需要手动添加。
2、录制的脚本回放过程,回放响应码无法与 录制响应码进行对比,导致失败脚本也认为成功的,
3、通过在录制过程不断的添加检查点,可有效检脚本的正确性,但无法有效的告诉使用人哪里需要关联。这就要求对使用有着很高的技能要求。
4、LoadRunner 好的是在脚本录制地过程,可以非常方便的添加检查点,而 Jmeter 却不行。但 Jmeter 提供了每个请求的响应数据,也算做一点弥补。
5、场景执行结果中事务的页面加载时间与实际不符。这要求工具使用者需要手工调整 LR 脚本的并发模型,LR 提供了并发请求函数。这进一步加具了执行人员的工作量和难度。
以上这些的缺陷大提高了对使用人员的技能要求,一不小心,可能就导致脚本是错误的。