利用JMeter进行Web测试
JMeter介绍
脚本录制
运行JMeter进行测试
JMeter主要组件介绍
参数化设置
动态数据关联
使用命令行运行JMeter脚本
利用XSLT分析JMeter结果文件
JMeter介绍
JMeter, 一个100%的纯Java桌面应用,它是Apache组织的开放源代码项目,它是功能和性能测试的工具。JMeter能够用于测试静态或者动态资源的性能 (文件、Servlets、Perl脚本、Java对象、数据库和查询、ftp服务器或者其余资源)。原先Jmemer是为Web/HTTP测试而设计 的,可是它已经扩展以支持各类各样的测试模块。它和用于HTTP和SQL数据库(使用JDBC)的模块一块儿运送。它能够用来测试静止资料库或者活动资料库 中的服务器的运行状况,能够用来模拟对服务器或者网络系统加以重负荷以测试它的抵抗力,或者用来分析不一样负荷类型下的全部运行状况。它也提供了一个可替换 的界面用来定制数据显示,测试同步及测试的建立和执行。
Jmeter的下载地址:http://jakarta.apache.org/jmeter/usermanual/index.html
JMeter 的特性:
a) 可以对HTTP和FTP服务器进行压力和性能测试, 也能够对任何数据库进行一样的测试(经过JDBC)。
b) 彻底的可移植性和100% 纯Java。
c) 彻底 Swing 和轻量组件支持(预编译的JAR使用 javax.swing.*)包。
d) 彻底多线程 框架容许经过多个线程并发取样和 经过单独的线程组对不一样的功能同时取样。
e) 精心的GUI设计容许快速操做和更精确的计时。
f) 缓存和离线分析/回放测试结果。
g) 高可扩展性:
h) 可连接的取样器容许无限制的测试能力。
i) 各类负载统计表和可连接的计时器可供选择。
j) 数据分析和可视化插件提供了很好的可扩展性以及 以及个性化。
k) 具备提供动态输入到测试的功能(包括Javascrīpt)。
l) 支持脚本变成的取样器(在1.9.2及以上版本支持BeanShell)。
脚本录制html
利用BadBoy进行脚本录制
利用BadBoy录制JMeter脚本(1)
经过Badboy的官方网站(http://www.badboy.com.au)下载Badboy的最新版本;
安装Badboy。安装过程同通常的Windows 应用程序没有什么区别,安装完成后你能够在桌面和Windows开始菜单中看到相应的快捷方式——若是找不到,能够找一下Badboy安装目录下的Badboy.exe 文件,直接双击启动Badboy;
启动Badboy,你能够看到下面的界面。
利用BadBoy录制JMeter脚本(2)
在地址栏(图中红色方框标注的部分)中输入你须要录制的Web应用的URL——这里咱们以http://www.baidu.com 为例 。
点击 开始录制 按钮(图中蓝色圆圈标注的部分)开始录制。
开 始录制后,你能够直接在Badboy内嵌的浏览器(主界面的右侧)中对被测应用进行操做,全部的操做都会被记录在主界面左侧的编辑窗口中(图中黄色方框标 注的部分)——在这个试验中,咱们在baidu的搜索引擎中输入 JMeter 进行搜索。不过录制下来的脚本并非一行行的代码,而是一个个Web对象——这有点像LoadRunner的VuGen中的Tree View视图;
录制完成后,点击工具栏中的“中止录制”按钮(图中紫色方框标注的部分),完成脚本的录制
利用BadBoy录制JMeter脚本(3)
选择“File -> Export to JMeter”菜单,填写文件名“baidu.jmx”,将录制好脚本导出为JMeter脚本格式。也能够选择“File -> Save”菜单保存为Badboy脚本;
启动JMeter并打开刚刚生成的测试脚本,就能够用JMeter进行测试了java
利用JMeter的代理服务器功能进行脚本录制
利用JMeter的代理服务器功能
进行脚本录制(1)
在测试计划中添加线程组,在线程组中添加逻辑控制器-录制控制器。
在工做台中添加非测试元件-HTTP代理服务器。
端口:即代理服务器的监听端口,咱们设为8080。
目标控制器选择:测试计划>线程组;
分组选择:每一个组放入一个新的控制器。
在HTTP代理服务器中添加定时器-高斯随机定时器(用于告知Jmeter来在其生成的HTTP请求中自动的增长一个定时器)。定时器将会使相 应的的取样器被延迟。 延时的规则是,在上一个访问请求被响应并延时了指定的时间后,下一个被定时器影响的取样访问请求才会被发送出去。正则表达式
若是在代理服务器元件里使用了高斯随机定时器,就应该在其中的固定延迟偏移(Constant Delay Offset)设置项里添上${T}(用于自动引用纪录的延迟时间)。
代理服务器配置好之后,点击启动,代理服务器就会开始记录所接受的HTTP 访问请求。
打开浏览器,打开Internet选项,将局域网(LAN)设置中的代理服务器设为:localhost,端口为在代理服务器中设的端口:8080。
在浏览器地址栏中输入地址并进行相关的操做进行录制,录制完成后, 中止HTTP 代理服务器; 在录制控制器元件上单击右键将记录的元件保存为一个文件用于之后重用,另外,不要忘了恢复浏览器的代理服务器设置。
运行Jmeter进行测试(1)数据库
脚本录制完毕后,就能够运行JMeter来进行咱们的测试了。
到JMeter的网站http://jakarta.apache.org/site/downloads/downloads_jmeter.cgi
下载JMeter的最新版本,将zip文件解压缩到D:/JMeter,运行D:/JMeter/bin下的jmeter.bat便可。
打开JMeter会有一个默认的测试计划,点击文件-打开,选中录制的脚本文件如:WebXSample_addUser.jmx,打开脚本进行测试。
在线程组上添加监听器-聚合报告(用于分析测试结果)后,点击运行-启动,开始测试,测试完毕后在聚合报告中就能够看到测试结果。一个简单的测试计划就完成了。
聚合报告显示测试结果
Label:每一个 JMeter 的 element (例如 HTTP Request )都有一个 Name 属性,这里显示的就是 Name 属性的值apache
Average:平均响应时间 — 默认状况下是单个 Request 的平均响应时间,当使用了事务控制器时,也能够以事务为单位显示平均响应时间
Median:中位数,也就是 50 %用户的响应时间
90% Line: 90 %用户的响应时间
Min:最小响应时间
Max:最大响应时间
Error%:错误率,本次测试中出现错误的请求的数量 / 请求的总数
Throughput:吞吐量 —— 默认状况下表示每秒完成的请求数( Request per Second )
KB/Sec:每秒从服务器端接收到的数据量
测试计划(Test Plan)是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器。
线程组(Thread Group)表明必定数量的并发用户,它能够用来模拟并发用户发送请求。
取样器(sampler)定义实际的请求内容,被线程组包含,咱们主要用HTTP请求。
监听器(Listener)
逻辑控制器(Logic Controller)
断言(Assertions)
配置元件(Config Element)
前置处理器(Pre Processors)和后置处理器(Post Processors)
定时器(Timer)
JMeter主要组件介绍-测试计划浏览器
测试计划(Test Plan)是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器。
名称:你能够为你的测试计划取一个有意义的名字。
注释:对测试计划的注释。
用户定义的变量:用户能够本身定义变量,在用到此变量的时候直接用<script id="MathJax-Element-1" type="math/tex">{变量名}引用便可。例:变量名=url,值=http://www.baidu.com,在须要http://www.baidu.com时直接用</script>{url}便可。
Add directory or jar to classpath:向类路径即%JMETER-HOME%\lib中添加目录及jar包。
JMeter主要组件介绍-线程组
名称:为线程组起名字。
线程属性-线程数:设置发送请求的用户数目 ,即并发数。
线程属性-Ramp-Up Period(in second):线程间的时间间隔,单位是秒。即全部线程在多少时间内启动。
线程属性-循环次数:请求的重复次数,若是选择后面的forever(默认),那么 请求将一直继续,若是不选择forever,而在输入框中输入数字,那么请求将重复指定的次数,若是输入1,那么请求将执行一次,若是是0,会出现问题。
调度器配置-启动时间:测试计划何时启动,启动延迟会覆盖它。
调度器配置-结束时间:测试计划何时结束,持续时间会覆盖它。
调度器配置-持续时间:测试计划持续多长时间,会覆盖结束时间。
调度器配置-启动延迟:测试计划延迟多长时间启动,会覆盖启动时间。
JMeter主要组件介绍-取样器(HTTP请求)
名称:HTTP请求的名字。
Web服务器-服务器名称或IP、端口号,脚本录制时自动添加,也可使用“用户自定义变量”。
HTTP请求:用默认值便可。
同请求一块儿发送参数:请求中的参数、值能够在此设置,须要用到参数化及动态数据关联,咱们在后面专门介绍。
同请求一块儿发送文件:我能够制定同请求一块儿发送哪一个文件。
其余任务包括:从HTML文件中获取全部内含的资源、用做监视器、Embedded URLs must match
监听器(Listener)负责收集测试结果,同时也被告知告终果显示的方式。咱们经常使用的包括:聚合报告、查看结果树、用表格查看结果,都支持将结果数据写入文件。其余的添加上去看看就行。聚合报告前面咱们介绍过,后面是查看结果树和用表格查看结果的截图。
JMeter主要组件介绍-监听器(用表格查看结果)
JMeter主要组件介绍-逻辑控制器
逻辑控制器(Logic Controller)能够自定义JMeter发送请求的行为逻辑,它与Sampler结合使用能够模拟复杂的请求序列。
循环控制器能够设置请求的循环次数或永远循环(若是选中永远的话)。
事务控制器能够将多个请求放在同一个事务中。若是选中Gegerate parent sample,则聚合报告中只显示事务控制器的数据,而不会显示其中的各个请求的数据,反之则所有显示。
JMeter主要组件介绍-断言
断言(Assertions)能够用来判断请求响应的结果是否如用户所指望的。它能够用来隔离问题域,即在确保功能正确的前提下执行压力测试。这个限制对于有效的测试是很是有用的。
JMeter主要组件介绍-配置元件缓存
配置元件(Config Element)维护Sampler须要的配置信息,并根据实际的须要会修改请求的内容。咱们主要在参数化中用到CSV Data Set Config服务器
JMeter主要组件介绍-前置处理器和后置处理器
前置处理器(Pre Processors)和后置处理器(Post Processors)负责在生成请求以前和以后完成工做。前置处理器经常用来修改请求的设置,后置处理器则经常用来处理响应的数据。咱们主要在动态关联中用到后置处理器的正则表达式提取器。
JMeter主要组件介绍-定时器markdown
定时器(Timer)负责定义请求之间的延迟间隔。
参数化设置网络
在咱们的测试计划中咱们使用的都是HTTP请求,在HTTP请求中经常会提交一些参数,咱们为了避免想在每一次请求中都使用相同的参数值,就要想办法让每一次请求的参数的值都是不同的,咱们就须要进行参数化设置,这里咱们介绍两种参数化设置的方法。
一种是利用函数助手中的_Random函数进行参数化设置;
一种是利用配置元件中的CSV Data Set Config进行参数化设置。
参数化设置-函数助手(1)
JMeter中有一个函数助手的功能,里面内置了多个函数,咱们能够利用其中的_Random函数来进行请求中的参数化设置。
在JMeter中选择“选项-函数助手对话框”打开函数助手对话框。
选择一个功能_Random。
设定最小值为1。
设定最大值为100。
函数名称设为func1。
点击生成将生成一个引用字符串Random(1,100,func1,在需要的请求参数中拷贝该字符串即可。其中函数名称用来在引用中做区别,即我们可以设定不同的名称在不同的地方引用同一个函数的功能例如:我们生成了两个串Random(1,100,func1,在须要的请求参数中拷贝该字符串便可。其中函数名称用来在引用中做区别,即咱们能够设定不一样的名称在不一样的地方引用同一个函数的功能例如:咱们生成了两个串{_Random(1,100,func1)}、 Random(1,100,func2),在添加图书的请求中,我们在bookName的参数值中引用Random(1,100,func2),在添加图书的请求中,咱们在bookName的参数值中引用{_Random(1,100,func1)},在bookConcern的参数值中应用${_Random(1,100,func2)},见截图, 这样测试运行时不一样的线程将产生不一样的bookName和bookConcern。
参数化设置-CSV Data Set Config(1)
在线程组上点击右键选择添加-配置元件-CSV Data Set Config,打开CSV Data Set Config。
Filename文件名:即参数化要引用的文件名。这里是d:\number.txt
File encoding文件编码:能够不填。
Variable Names(comma-delimited)变量名(用逗号分割):多个变量能够引用同一个文件,用逗号分割。这里是num1,num2
Delimiter(use ‘\t’ for tab):参数文件中多个变量值的分隔符,\t表示用tab键分割,默认是逗号。
Recycle on EOF?:结束后是否循环?默认是True.
Number.txt文件内容见截图。
参数化设置-CSV Data Set Config(2)
在添加图书的请求中,咱们在bookName的参数值中引用num1,在bookConcern的参数值中应用num1,在bookConcern的参数值中应用{num2},见截图,这样测试运行时不一样的线程将产生不一样的bookName和bookConcern。
动态数据关联
在HTTP请求的参数中常常会遇到一些参数的值是从服务器相应的动态数据,这些数据须要进行关联才能使得每一次请求都能成功得被服务器接受,在JMeter中采用正则表达式提取器来获取这些动态的数据。
正则表达式容许用户从服务器响应中获取数据,做为一个后置处理器,正则表达式提取器会在每个请求执行后再执行,正则表达式提取请求的参数值,产生模板字符串,并将结果保存到给出的变量中。
动态数据关联(1)-正则表达式提取器
在HTTP请求的参数中常常会遇到一些参数的值是从服务器相应的动态数据,这些数据须要进行关联才能 使得每一次请求都能成功得被服务器接受,在JMeter中采用正则表达式提取器来获取这些动态的数据。好比咱们想要得到从服务器相应的TOKEN,就能够 使用下面的正则表达式提取器。
使用时就可使用${token_g1}来表示获取到的TOKEN值。以下图:
使用命令行运行JMeter脚本
JMeter -n -t my_test.jmx -l log.jtl
-n告知JMeter采用非图形化运行JMeter脚本
-t指定要运行的脚本文件
-l指定保存执行结果的文件名
执行命令前要检查当前目录是不是%JMeter_Home%\bin 目录;
若是 JMeter 脚本不在当前目录,须要指定完整的路径;若是要把执行的结果保存在其余地方也要指定完整的路径。
利用XSLT分析JMeter结果文件(1)
将结果文件的扩展名改成xml,例:将log.jtl改成log.xml。 在log.xml的文件头