在《性能测试工具脚本录《制及调试方法之 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 提供了并发请求函数。这进一步加具了执行人员的工作量和难度。
以上这些的缺陷大提高了对使用人员的技能要求,一不小心,可能就导致脚本是错误的。


↙↙↙阅读原文可查看相关链接,并与作者交流