它是纯Java代码开发的压力测试工具。现在大多数企业用它做系统接口的功能和性能测试。
一、体系结构
1、取样器(sampler)
用来模拟用户操作,向服务器发出各种请求。(http、java、webservice、FTP等)
2、断言
用一个预设值与实际结果匹配,返回布尔值来判断结果。
3、监听
Jmeter测试的结果需要添加监听器来收集.也可以直接查看结果树和聚合报告。
4、前置处理器
请求发送前做一些环境和参数的准备工作
5、配置元件
为取样器提供预备数据。 用来参数化的作用。 例如CSV Data Set Config,它可以帮助我们从文件中读取测试数据。
6、后置处理器
一般放在取样器之后,用来处理服务器返回的结果。例如关联,把请求1返回来的结果变成参数,传给请求二。
7、逻辑控制器(线程组下)
循环,吞吐量等等的控制。
8、定时器
用来设置操作之间的等待时间,例如请求1登陆之后,等待3秒之后,请求二在进行搜索.
9、线程组
实现模拟用户数量和运行场景。
setup thread group :可执行预测试操作。
teardown thread group :可执行测试后动作。
10、Test Fragment
不能直接执行,必须通过逻辑控制器中的Include_Controller 或者模块控制器来调用,封装作用,可以重复调用,减少工作量。
11、工作台
在测试中我们可能需要暂时更改一些组件,可以把一些需要更改的组件保存在工作台中,测试完成后再恢复,但是切记:不能退出jmeter.一旦退出jmeter,工作台中的内容就会消失。
二、JMeter 元件的执行顺序与作用域
元件执行顺序
JMeter脚本显示的是树型结构,元件的执行顺序类似二叉树的中序遍历,先执行根节点再执行子节点,具体:
Step1:配置元件(如果存在);
Step2:前置处理器(如果存在);
Step3:定时器(如果存在);
Step4:取样器(如果存在);
Step5:后置处理器(如果存在且取样器返回结果非空);
Step6:断言(如果存在且取样器返回结果非空);
Step7:监听器(如果存在且取样器返回结果非空);
注:1)如果元件的作用对象不存在,则其不会被执行,如断言作用域内没有取样器,则断言不被执
2)同一作用域范围内存在多个同一类型的元件,则这些元件按其在TestPlan中的上下顺序依次被执行;
3)如果选择某个Step为永远循环,那么线程只会永远执行该Step节点下的元件,其前后面所有的Step都不会被执行。
元件作用域
在JMeter中,元件作用域是靠TestPlan树型结构中元件的父子关系来决定的,具体如下:
1. 配置元件(Config Element)
该元件作用于元件父节点下的所有元件。
2. 前置处理器(PerProcessors)
该元件作用于元件父节点下的每一个Sampler元件,且在Sampler元件被执行前执行。
3. 定时器(Timers)
该元件作用于元件父节点下的每一个Sampler元件。
4. 取样器(Sampler)
该元件不对其他元件发生交互作用,而是其他元件对其发生交互作用。
5. 后置处理器(PostProcessors)
该元件作用于元件父节点下的每一个Sampler元件,且在Sampler元件被执行后执行。
6. 断言(Assertions)
该元件对元件父节点下的每一个Sampler元件执行后的结果进行校验。
7. 监听器(Listeners)
该元件收集并记录其父节点下的每一个Sampler元件的测试结果。
综上可知,JMeter元件作用域的基本原则为:
1)取样器(Sampler)由于只能被交互,因此不存在作用域问题。
2)逻辑控制器(LogicConrtollers)提供一个块的结构,仅对其子节点中的取样器(Sampler)和逻辑控制器(LogicConrtollers)起作用。
3)父节点下的每一个Sampler元件是指父节点下的所有后代节点,包括子节点、子子节点等。
讲了这些,你可能迷糊了,到底是肿么个情况呀!?通过两个栗子(例子)来理解一下他们的作用域。
A(注:下图只是为了说明作用域,无法正常运行)
取样器(HTTP请求1 、FTP请求2 、TCP取样器3) 逻辑控制器(循环控制器) 监听器(图形结果1、聚合报告2)
* HTTP请求1 、FTP请求2 、TCP取样器3 元件没有作用域的概念。
* 循环控制器 元件作用域名是其子节点FTP请求2 、TCP取样器3 。
* 图形结果1 元件的作用域是是FTP请求2 、TCP取样器3。
* 聚合报告2 元作的作用域是HTTP请求1 、FTP请求2 、TCP取样器3
B (注:下图只是为了说明作用域,无法正常运行)
这个例子稍微复杂一些,包含的元件较多。先来分分类。
取样器(HTTP请求 、FTP请求 、TCP取样器、 JDBC Request )逻辑控制器(循环控制器、随即控制器)定时器(固定定时器、Uniform Random Timer )断言(响应断言、XML断言)监听器(图形结果、聚合报告)
根据作用域原则,这些元件的作用域分别为:
* HTTP请求 、FTP请求 、TCP取样器、 JDBC Request 元件没有作用域名概念
* 循环控制器 的作用域为 FTP请求 、TCP取样器和 随即控制器
* 固定定时器作用于 HTTP请求 , Uniform Random Timer 作用于所有取样器
* 响应断言作用于JDBC Request , XML断言作用于FTP请求 、TCP取样和JDBC Request 。
* 图形结果作用于FTP请求 、TCP取样和JDBC Request ,聚合报告作用于作用于所有取样器。
其实,通过上面的分析,并没有你想象的那么复杂,我们从各个元件的层次结构就可以判断每个元件的作用域。
三、JMeter测试计划要素
1、测试计划只能有一个
2、至少有一个线程组
3、至少有一个取样器
4、至少有一个监听器
四、JMeter HTTP协议录制
Jmeter录制方式分三种,分别是:使用Badboy录制、Jmeter自带的代理服务器录制和手工录制,今天先介绍前两种录制方法。
Badboy是用C++开发的动态应用测试工具, 其拥有强大的屏幕录制和回放功能, 同时提供图形结果分析功能。Badboy录制的脚本可以导出成.jmx后缀的格式, jmx正是Jmeter脚本保存的格式, 其实质是
一个XML格式的文件。
Badboy的录制方式有两种: 一种是Request方式, 一种是Navigation方式, 通过工具栏的 'N' 按钮切换; Request方式是模拟浏览器发送表单信息到服务器, 每一个资源都将作为请求发送;
Navigation方式是记录用户鼠标的操作动作, 回放时模拟界面点击, 类似于UI自动化测试工具selenium。
因Jmeter对脚本的需要, 我们使用Request方式进行录制生成jmx格式脚本。
安装成功打开会出现如下界面:
使用Badboy录制非常简单,首先新建Test Suite,在框中输入要录制的网址,并点击右侧的绿色按钮,即可:
点击绿色按钮后就会有如下所示页面,并录制登录操作,做相应操作就会被录制:
录制完成后,会出现如下所示界面,点击红色按钮即停止:
将文件导出到jmeter,如下操作:
保存到自己所建的文件夹中:
然后在jmeter软件中打开,操作如下:
添加进来后,就会出现如下结果,这就是所录制好的脚本。
脚本录制成功,但不代表该脚本就可运行,还需要对脚本进行调试,比如关联、请求头设置等操作。
Jmeter自带的代理服务器录制
它的原理:jmeter设置为代理服务器,类似fiddler一样的抓包完成脚本的录制
可分为如下步骤:
1、 Jmeter新建一个线程组—录制控制器
2、 设置jmeter代理 工作台—非测试元件—代理服务器
3、 端口 8080 , 目标控制器选择录制控制器 ,勾选了允许正则表达式 并在排除模式中添加 .*.(bmp|css|js|gif|ico|jp?g|png|swf|woff)
4、 启动代理服务器
5、 在IE浏览器中设置代理 127.0.0.1 8080
6、 用谷歌浏览器操作网站,会有自动录制的效果
先看第一步:
Jmeter新建一个线程组—录制控制器
第二步:
设置jmeter代理 工作台—非测试元件—代理服务器
第三步:
端口 8080 , 目标控制器选择录制控制器 ,勾选了允许正则表达式 并在排除模式中添加 .*.(bmp|css|js|gif|ico|jp?g|png|swf|woff)
第四步:
启动代理服务器,此处只是个提示信息,点击确定即可
第五步:
在IE浏览器中设置代理 127.0.0.1 8080,此处要填127.0.0.1,因为是要以本机做为代理服务器,不然会出错,设置好后,需要重启服务,才能生效。
第六步:
用谷歌浏览器操作网站,会有自动录制的效果
脚本录制成功,但不代表该脚本就可运行,还需要对脚本进行调试,比如关联、请求头设置等操作。
五、JMeter 脚本调试
这里大多数针对HTTP协议的,简单说下:url会涉及到重定向和转发。
一句话,转发是服务器行为(一次request,由服务器处理,传输的信息不回丢失),重定向是客户端行为(做了两次request,传输的信息会被丢失)。
里面有个跟随重定向、自动重定向选项,区别:
1、自定义重现、就是这个链接本身带有重定向,勾选,请求的时候自动跳转到重定向页面,不会产生记录,不可做关联
2、跟随重定向,当出现状态为302/301等3XX,会跳转到重定向页面,产生记录,可以关联
JMeter调试工具之一---HTTP Mirror Server
通常,编程工具IDE都提供了相应的调试模块,供开发者使用,以便更快速的定位问题所在。那么在JMeter编写测试脚本的过程中,JMeter都提供了哪些调试工具供我们使用呢?
JMeter常用的调试工具有如下五种:
1、View Tree:查看结果树。含请求信息、响应信息等,请求头信息中的cookie信息一般默认不会显示,可通过修改JMeter配置参数进行显示。日常大家用的挺多的,在此不再赘述。
2、HTTP Mirror Server:HTTP镜像服务器。用于查看请求信息。
3、Debug Pre/PostProcessor:用于查看系统中存在变量等信息。
4、Debug Sampler:样本调试工具,含输入输出信息。
5、BeanShell + jmeter.log:组合调试,更加灵活。
本文主要讲述第二种,其余 3、4、5 种方法后续博文会更新推出,谢谢各位! ^_^
通常,大多数人在调试JMeter测试脚本时,会经常性的向测试服务器发送接口测试请求的数据。在初始调试脚本时,通常优先调试脚本的请求信息(入参、请求头信息、Cookie信息等)是否正确无误。那么,针对此种情况,我们如何不向测试服务发送数据呢?通常的做法是,开启fiddler,将我们的样本请求代理到fiddler进行拦截,查看相应的样本请求信息是否正确。
其实,JMeter 已经为我们提供这样的镜像服务,它就是 HTTP Mirror Server,添加路径:控制台/添加/非测试元件/HTTP Mirror Server。面板如下所示
-
端口:HTTP Mirror Server镜像服务器监控的端口,默认为 8081,为必填项。
-
Max number of Threads:最大的线程数量。若是超出此限制,则进入等待队列。
-
Max queue size:在线程池执行样本时的最大请求任务队列数。当线程池正在执行,新接收的请求将被存放在任务队列中。此项仅在最大线程数量大于0时才有效。
【HTTP Mirror Server】作用:类似于本地临时搭建一个HTTP服务器,将其接收到的请求信息原样返回,可以在样本请求的响应结果面板中查看。如此就可以验证发送的样本请求信息是否正确,以供调试测试脚本所用。
为请求样本设置HTTP Cookie管理器,添加Cookie信息,如下所示:
为请求样本设置请求参数和请求头信息如下所示:
配置请求样本代理到HTTP Mirror Server,如下所示:
执行脚本,执行结果如下所示:
JMeter调试工具之二---Debug PostProcessor
上面讲述了HTTP镜像服务器在调试请求入参时的实例应用。
此文我们讲述另一种测试脚本调试工具的使用。前置处理器或后置处理器中的 Debug Processor,也是常用的一个调试工具,其可以获取样本线程的相关信息进行展示,可通过查看结果树中的响应数据查看对应样本线程请求、响应及变量等信息。
在查看的时候注意 Debug PostProcessor的查看作用域即可,在不用的位置,可查看的信息是不同,敬请参阅下文。
本文主要以 Debug PostProcessor为实例进行讲解,前置处理其中的对应组件用法在变量查看上有些区别。其对应添加路径为:【添加 / 后置处理器 / Debug PostProcessor】,对应面板如下所示:
-
JMeter properties:jmeter.properties定义的系统级的属性变量。因其变化不大,所以脚本调试时通常不显示,默认False(不显示)。
-
System properties:系统配置的环境变量等。若系统环境变量在当前脚本中有用到,可以设置为True(显示),默认为False(不显示)。
-
-
Sampler properties:样本属性及变量信息。默认为True(显示)。
依据实际的测试脚本调试需要,开启相应的Debug项设置,最终测试脚本的结构如下所示:
执行脚本,查看各个Debug PostProcessor结果。
1、线程 033 的外内Debug PostProcessor信息如下所示:
2、线程 035 的外内Debug PostProcessor信息如下所示:
由此可见:
JMeter调试工具之三---Debug Sampler
前面两篇文章分别讲述了 HTTP Mirror Server 和 Debug PostProcessor 的脚本调试实例。此文主要讲述第三种调试工具:DebugSampler,其主要是查看JMeter用户定义变量、JMeter属性变量,以及系统环境变量信息,在查看结果树对应调试器响应结果面板中查看信息。
Debug Sampler添加路径:【添加 / Sampler / Debug Sampler】,面板设置如下:
打开JMeter测试脚本,在样本线程之间添加调试器,最终样本结构如下所示:
执行脚本,查看执行结果。
1、JMeter Variables变量信息:
2、JMeter Properties变量信息:
3、System Properties变量信息:
Debug Sampler相对Debug Processor 调试器虽然都是对变量信息进行采样展示,但前者缺乏了前一个样本线程信息;相对于 HTTP Mirror Server 缺乏其他请求信息的展示。同时,HTTP Mirror Server相对于Debug Sampler/Processor优势在于对服务端无依赖,缺点也显而易见的是当样本线程中有生成变量时,就不能选择这种调试方式了。
在实际调试脚本时,依据业务测试基本需要灵活使用即可,见仁见智!
至此,此文顺利完结,希望此文能够给初学 JMeter 的您一份参考。
最后,非常感谢亲的驻足,希望此文能对亲有所帮助。热烈欢迎亲一起探讨,共同进步。非常感谢! ^_^
六、JMeter关联
关联是Jmeter工具中非常重要的一个技术。因为在测试过程过有些数据是经常发生变化的,要获取并使用这些数据,就要使用关联。 比如: 用户登录后,session信息都不同,有些操作要使用session,就需要将这个动态的信息保存下来。
还有经常遇到的场景,第二个请求提交的参数要从第一个请求的返回数据中获取。
今天要测试是获取某一个城市的天气信息:
Step1:
添加一个用户变量city。
为TestPlan添加一个线程组。添加第一个HTTP Sampler, 命名为GetCityCode。
Step2:
添加一个后置处理器,利用正则提取器将获取到的城市代码取出。
下面是各参数值的含义:
参数
|
释义
|
引用名称
|
在HTTP等请求中,引用此数据,需要用到的名称
|
正则表达式
|
用于将需要的数据提取出来
|
模板
|
表示使用提取到的第几个值:
$-1$:表示取所有值
$0$:表示随机取值
$1$:表示取第1个
$2$:表示取第二个
以此类推:$n$:表示取第n个
|
匹配数字(0代表随机)
|
0 代表随机取值,1 代表全部取值
|
缺省值
|
如果正则表达式没有搜找到值,则使用此缺省值
|
Step3:
为该请求添加一个BeanShell断言,验证获取的信息是否正确。
关于BeanShell会另有篇幅介绍。
在这其中的FailureMessage就是指,如果断言失败,就是提示该信息。
Step4: 添加断言监听器和结果树,发送请求后,查看断言和结果树。
会发现断言失败,使用获取的城市代码和期望的不一致,刚才在FailureMessage中指定的信息就会出现。
因为断言失败了,所以结果树显示为红色。
这里是故意将期望的城市代码写错的。现在在BeanShell断言中修改过来。
现在断言成功啦。
Step5:
添加第二个HTTP Sampler,命名为GetWeatherInfo。请求信息如下。
在路径中要使用第一个请求返回来的城市代码来提起具体的值。/data/cityinfo/${citycode}.html,要与Step2中正则提取器中的引用名称一致。
Step6:
再添加一个BeanShell断言,来验证结果。
查看结果树,显示请求返回的响应数据正确。
打赏
微信扫一扫,打赏作者吧~