三款性能测试工具kylinPET、LoadRunner、Jmeter在脚本录制与调试上的差异性

软件的性能测试活动离不开性能测试工具的支持。国外常用的性能测试工具有:loadRunner(商用),Jmeter(开源),国内做的比较好的国产性能工具有kylinPET。性能测试工具的录制和调试是能力的高低,是判断性能测试工具优劣重要指标。下面笔者通过实例来分析一下这三款知名本和调试上的差异点。

1、性能测试测试工具版本

性能测试工具名称版本号
kylinPET7.1
LoadRunner2021
Jmeter5.1.1 

2、三款性能测试工具的脚本录制差异点汇总

对象类别

kylinPET

LoadRunner

Jmeter

说明

脚本类型        原生脚本函数二次封装后的脚本原生脚本
特定参数关联JSESSIONID自动处理        自动处理      需要手动添加Cookie管理器

特定参数关联

ticket

自动处理        自动处理需要手工关联
一般参数关联手工扫描并关联手工扫描不到,需手工修改脚本代码关联需要手工关联
响应码判断响应码和可以录制时的验证码对比,有差异即认为存在问题响应码20X-599之间均认为正确。不与录制时的响应对比响应码20X-599之间均认为正确。不与录制时的响应对比
录制与回放对比

提供

回放结果可以与录制结果按请求条目进行左右对比

不提供,

提供两次回放日志的比较功能,但比较结果不明显示,详见下图

不提供,但可以看到每个请求的当前返回结果

3、差异点对比 

3.1录制与回放对比

kylinPET的录制与回放的比较,可以明显示看到两次请求的响应差异

 loadRunner提供两次回放日志的比较:从对比结果看,提供的不是原生http请求结果的结果比较,很难判断两次回放的http请求响应的差异

4、三款性能测试工具脚本录制与回放全过程

4.1、被测度对象URL

 http://59.110.158.28/Example/登录接口

4.2、录制脚本

  4.1kylinPET

步骤 1:启动"脚本编辑器"进行脚本录制


点击确认,开始加录制,如下所示:按提示输入密码和验证码


点点登录按钮进入加载页面


步骤 2:加载页面加载完成后,点击结束录制按钮,生成如下的脚本文件

步骤 3:点击回放按钮,回放脚本,如下所示,显示有很多的错误,表示回放不成功。

步骤 4:关闭弹出的对话框,再点击 “比较与关联” 按钮,弹出需要关联的对话框,然后点击 “关联所有” 按钮

步骤 5:再次点击 “回放” 按钮,提示回放成功,不再有红色字体

 4.2LoadRunner录制

步骤 1:启动 Virtual User Generator,准备录制脚本(录制时建议启动 Fiddler 软件,只有这样脚本才能顺畅录制,该方法也是从其它网友学习的经验,如果不打开 Fidder 将会很慢或录制失败)
步骤 2:新建脚本

步骤 3:点击录制按钮,在弹出的对话框中输入需要录制的 URL 和使用的浏览器(这里选择 Chrome)

步骤 4:点击"开始录制” 按钮,进行录制,按提示输入密码和验证码

提交登录时,新建一个开始事务,加完毕后,结束事务。

最后录制生成的脚本如下所示:

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 接口已经有了返回数据。

 4.3 Jmeter脚本录制

步骤 1:如下图所示在 Jmeter 上创建一个线程组和一个察看结果树

线程数:表示运行时,启动的线程数,每个线程循环运行线程组内的http请求,每循环一次,相当于一个虚拟用户
循环次数:线程运行线程组内的HTTP请求的次数 
Ramp-up时间(秒):启动指定线程数需要的时间。0表示 JMeter 将立即建立所有线程。

步骤 2:Jmeter 上创建一个 HTTP 代理服务器

目标控制器:指定脚本存放的位置
分组:
1)不对样本分组”:所有请求全部罗列
2)在组间添加分隔:加入一个虚拟的以分割线命名的动作,运行同“不对样本分组”,无实际意义
3)每个组放入一个新的控制器:执行时按控制器给输出结果
4)只存储每个组的第一个样本”:对于一次url请求,实际很多次http请求的情况,这个选项很好用,因为我们常常是不关心后面的那些请求的。
5)HTML文件中获取所有内含的资源:勾选表示HTML文件中获取所有内涵的资源。

步骤 3:设置浏览器为代理模式


注意:设置完要注意保存

步骤 4:启动 Jmeter 的代理服务器

启动后有一个录制控制台

步骤 5:打开浏览器输入要录制的 URL

登录页面


登录后的页面加载

录制后生成的脚本

步骤 6:脚本调试

在线程组下面添加察看结果树和聚合报告查看回放的情况。
脚本调试是性能测试过程非常重要的步骤之一,笔者径常遇到,很多测试人员,测试一周多都是白测试,因为脚本自认为调试成功了,而往往事实并没有调试成功。下面我们来调试一下本次录制的脚本。
运行脚本,执行结果如下,看起来是所有的请求都运行成功,如果你也是这样认为,那也一样掉进了坑里。

对于大部分的性能测试工具,如:LR,Jmeter 等,如果 http 响应如果返回响应码是 20X-30X 则认为是正常,如果返回 40X-599 就认为是失败的。
下图所示,请求响应:用户登录失败,在跳转失败页面....

进一步检测响应头信息:响应码是 200,Jmeter 调试结果当作请求返回成功。

下面的 81 /Example/getNews,返回显示未登录,但结果察看树显示请求也是正常,也是同样的原因(错误码返回 200)

通过上面例子看,脚本调试脚本是多么的困难了。结果树请求都通过,并不代表脚本调试成功。
那么有没有什么办法来证明脚本真正的成功的呢?有的,可以通过添加检查点或直接查看请求返回结果。
一般来说需要检查每个页面的关键信息,你也可以直接查看关键 http 请求的返回信息来验证。
针对本文本案例样本处理三个地方才能让脚本真正的调试通过:验证码、JSESSIONID、ticket
1)验证码:可以通过添加边界提取器完成
2)sessionid 的处理:可以添加 HTTP Cookie 管理器,让 Jmeter 自动处理
3)ticket:正则表达式提取器。因为 JSESSIONID 的值到行尾,无法使用边界提取器处理。

步骤 7:再次调试,如下图所示,请求可以正常返回数据了


 

  • 6
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值