快乐学习
前程无忧、中华英才非你莫属!

Jmeter入门到精通-1


它是纯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请求FTP请求TCP取样器3) 逻辑控制器(循环控制器) 监听器(图形结果1、聚合报告2

*  HTTP请求FTP请求TCP取样器元件没有作用域的概念。
*  循环控制器 元件作用域名是其子节点FTP请求TCP取样器
*  图形结果元件的作用域是是FTP请求TCP取样器3
*  聚合报告元作的作用域是HTTP请求FTP请求TCP取样器3
 
(注:下图只是为了说明作用域,无法正常运行)
这个例子稍微复杂一些,包含的元件较多。先来分分类。
取样器(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下载地址:http://www.badboy.com.au/,安装方式很简单,因为是exe程序,双击安装即可。
安装成功打开会出现如下界面:
使用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,因为是要以本机做为代理服务器,不然会出错,设置好后,需要重启服务,才能生效。


第六步:

用谷歌浏览器操作网站,会有自动录制的效果
脚本录制成功,但不代表该脚本就可运行,还需要对脚本进行调试,比如关联、请求头设置等操作。

文章来源:http://www.cnblogs.com/hong-fithing/

五、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,如下所示:


执行脚本,执行结果如下所示:


 
官网链接:http://jmeter.apache.org/usermanual/component_reference.html#HTTP_Mirror_Server
 
 

JMeter调试工具之二---Debug PostProcessor
上面讲述了HTTP镜像服务器在调试请求入参时的实例应用。
此文我们讲述另一种测试脚本调试工具的使用。前置处理器或后置处理器中的 Debug Processor,也是常用的一个调试工具,其可以获取样本线程的相关信息进行展示,可通过查看结果树中的响应数据查看对应样本线程请求、响应及变量等信息。
在查看的时候注意 Debug PostProcessor的查看作用域即可,在不用的位置,可查看的信息是不同,敬请参阅下文。
本文主要以 Debug PostProcessor为实例进行讲解,前置处理其中的对应组件用法在变量查看上有些区别。其对应添加路径为:【添加 / 后置处理器 / Debug PostProcessor】,对应面板如下所示:
  • JMeter properties:jmeter.properties定义的系统级的属性变量。因其变化不大,所以脚本调试时通常不显示,默认False(不显示)。
  • System properties:系统配置的环境变量等。若系统环境变量在当前脚本中有用到,可以设置为True(显示),默认为False(不显示)。
  • JMeter variables:JMeter中定义的变量。常用的四种变量定义可参考文章JMeter学习-032-JMeter常见四种变量简介,默认为True(显示)。
  • Sampler properties:样本属性及变量信息。默认为True(显示)。
依据实际的测试脚本调试需要,开启相应的Debug项设置,最终测试脚本的结构如下所示:
执行脚本,查看各个Debug PostProcessor结果。
1、线程 033 的外内Debug PostProcessor信息如下所示:


2、线程 035 的外内Debug PostProcessor信息如下所示:

由此可见:
  • 1、样本线程(请求)外Debug PostProcessor:
    • 1.1、所有样本线程对其都是上一个样本线程,可获取当前样本线程(例如035)的信息数据;
    • 1.2、无法获取当前样本(035)内的前、后置处理器定义生成的变量;
    • 1.3、当前样本线程(035)对应的Debug PostProcessor可获取当前样本线程(035)之前所有测试计划、用户定义的变量、参数化变量、样本线程产生的变量数据。
  • 2、样本线程(请求)内Debug PostProcessor:
    • 2.1、当前所属样本线程为其上一个样本线程,可获取当前线程之前所有测试计划、用户定义的变量、参数化变量、样本线程产生的变量数据,以及当前样本线程产生的变量数据。
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 的您一份参考。
最后,非常感谢亲的驻足,希望此文能对亲有所帮助。热烈欢迎亲一起探讨,共同进步。非常感谢! ^_^
来源:http://www.cnblogs.com/fengpingfan

六、JMeter关联
关联是Jmeter工具中非常重要的一个技术。因为在测试过程过有些数据是经常发生变化的,要获取并使用这些数据,就要使用关联。 比如: 用户登录后,session信息都不同,有些操作要使用session,就需要将这个动态的信息保存下来。 
还有经常遇到的场景,第二个请求提交的参数要从第一个请求的返回数据中获取。
今天要测试是获取某一个城市的天气信息: 
http://www.weather.com.cn/data/cityinfo/101010100.html
但这里面有一个城市代码(101010100)不是固定的,要根据测试数据获取不同城市的代码编号,再查询该城市的天气状况。 分析后得出的结论是先要请求一个可以获取城市代码的接口,将获取的代码传递给这个获取天气信息的地址,请求形式为http://www.weather.com.cn/data/cityinfo/citycode.html,citycode.html,{citycode}就是前一个请求传过来的值。
Step1: 
添加一个用户变量city。 
为TestPlan添加一个线程组。添加第一个HTTP Sampler, 命名为GetCityCode。 
添加HTTP信息头管理器,再填写请求信息。 

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断言,来验证结果。 
查看结果树,显示请求返回的响应数据正确。 
来源:https://blog.csdn.net/zhangchaoy/article/details/57418406
打赏
赞(0) 打赏
未经允许不得转载:同乐学堂 » Jmeter入门到精通-1

特别的技术,给特别的你!

联系QQ:1071235258QQ群:710045715

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

error: Sorry,暂时内容不可复制!