Jmeter的使用
Jmeter 是什么
Apache Jmeter 是Apache组织开发的基于Java的压力测试工工具
Jmeter 可用于对服务器,网络或对象模拟巨大的负载,来自
不同压力类别下测试他们的强度和分析整体性能。另外,Jmeter 能够对应用程序做功能/回归性测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性Jmeter允许使用正则表达式创建断言。
Jmeter的特点
-
能够对http 和ftp 服务器进行压力测试和性能测试,也可以对任何数据库进行同样的测试( 通过JDBC )
-
完全的可移植性和100% 的纯java
-
完全多线程框架允许通过多个线程并发取样和通过单独的线程组对不同的功能同时取样。
-
各种负载统计表和可链接的计时器可供选择。
-
数据分析和可视化插件提供了很好的可扩展性以及个性化
-
具有提供动态输入到测试的功能。
Jmeter 的下载与安装。
- 前置条件安装好jdk
- jmeter 下载地址(去官网安装即可)
- 一般启动,解压。bin目录里的jmeter.bat 即可启动
- 服务器模式启动: jmeter-server.bat 。允许在远程节点上以服务器模式允许jmeter ,并通过Jmeter gui 来控制。
Jmeter的目录结构
- bin 目录是可执行文件,jmeter.bat 启动,里面设置jvm 参数
- 根据经验,heap 最多设置为物理内存的一半,默认设置为512M,如果heap 超过物理内存的一半,可能允许Jmeter 会慢,甚至出现内存溢出。
- jmeter的log 在jmeter.log 中佛查看
- jmeter.properties 文件中有一个log_level.Jmeter
可以设置改变日志详细度,默认是info,可设置为debug. - docs 下是Jmeter 的java docs
- printable_docs 的usermanual 子目录下是jmeter用户手册。其中component_reference.html 是常用的核心元件帮助手册。
- extras 目录下的文件提供了对ant 的支持,可以利用ant 来实现自动化,例如批量执行脚本,产生html 报告等。运行jmeter 的时候会产生一个jtl文件,把它放到extras目录下,运行ant-Dtest=文件名 report 就可以生成测试统计报表。
- lib目录下的ext 子目录是jmeter 的核心jia包;junit子目录是放junit 脚本的,用户扩展所依赖的包直接放到lib 目录下即可,不要放到lib/ext 下。
Jmeter 常用功能
- 测试计划
用来描述一个性能测试,所有的内容都是基于这个计划的,5.3版本的启动后默认会创建一个测试计划
- 线程(用户)
一般常用线程组,可以理解为虚拟用户数
- setup thread group :可用于执行预测试操作。这些线程的行为完全像一个正常的线程组测试元件。类似Loadrunner 中的init
- teardown thread group :可用于执行测试后动作。
Jmeter 的脚本录制方式
第一种Badboy录制(推荐使用,仅支持Windows)
1.Badboy简介:
说简单点,badboy 就是一个浏览器模拟工具,具有录制及回放功能,还可以进行调试。我们可以用它来做自动化测试,因为它有捕获表单数据的功能,我们也可以用它来对web页面做诊断,诊断系统反应快慢,响应数据大小,当然了这些不是我们使用Badboy的重点,我们关注的是Badboy 的录制功能。
Badboy录制的脚本可以直接导出jmx格式,jmx 正是Jmeter 脚本保存的格式,jmx 实际上是一个XML格式的文件。
Bodboy 的录制方式有两种,一种是Request 方式,一种是Navigation 方式。
这两种方式的区别是:
request:模仿浏览器发送表单信息到服务器,每一个资源都将作为请求发送。
Navigation: 记录用户的鼠标动作,类似于著名的自动化测试工具QTP,回放时模拟一个点击。
基于Jmeter 脚本的要求,我们需要选用request的方式来录制,这些请求将会以jmx的格式保存下来,从而我们才可以导入Jmeter中进行复用。
2.录制
第一步:打开Badboy 工具,打开栏目上的红色圆圈按钮,在地址栏输入被测试项目的地址
第二步:录制完成后,点击工具旁边的黑色按钮,结束录制,选择文件—》Export to Jmeter
第三步:打开Jmeter 工具,选择文件-——》“打开” 选择刚才保存的文件(.jmx 类型) 将文件导入进来了。
第二种方式:代理
步骤:
第一步:创建一个线程组(右键点击“测试计划”—> 添加----> 线程组)
第二步:在非测试元件中添加HTTP代理服务器
代理服务器的端口,默认8888 ,可自行修改,但不要与其他端口冲突
目标控制器:录制脚本存放的位置,可选项为测试计划中的线程组(根据实际情况选择即可)
分组:对请求进行分组。“分组” 的概念是将一批请求汇总分组,可以把url 的请求理解为组
分组的可选项如下:
- 不对样本进行分组:选择该分组所有的请求将全部罗列
- 在组间添加分割: 加入一个虚拟的分割线命名的动作,运行“不对样本分组”无实际意义。
- 每一个分组放入一个新的控制器:执行时按控制器给输出结果。
- 只存储每个组的第一个样本:对于一次url 请求,实际很多次http
第三步:设置IE浏览器为代理服务器
具体操作如下:
IE----> internet 属性-----> "连接“-----> "局域网设置“(端口需要和jmeter填写的端口保持一致)
第四步:回到jmeter在刚才的页面上点击启动按钮
第五步:打开IE浏览器访问待测项目的地址,Jmeter会自动记录你IE 所访问的页面。
Badboy脚本开发
- Badboy 中设置检查点
例子:在百度搜索框输入:张俊杰 检查点是:搜索框内输入的内容是否包含“张俊杰:
第一步:录制脚本
第二步:选中搜索框中的query ,点击tools 工具,下面有一个Add Assertion for Selectionm, 然后会看到脚本区多了一行
第三步:点击全部回放按钮进行回放
- Badboy 中的参数化
步骤:
第一步:建立参数化列表
选中Variables 标签右键,在空白处右键,选择Add Variable ,会出现一个弹框,设置参数的名称和参数值,其他的保持默认,然后点击OK
第二步:在请求参数中替换${参数名称}
第三步:中文可能有乱码,改下请求中的编码即可
第四步:设置请求的次数
选中Step 右键,选择Properties
然后选择for each value of variable 它默认会读取前面设置的参数名称
最后一步:点击回放即可
- Badboy中数据库的参数化(mysql)
第一步:odbc 安装与配置
第二步:点击Tools ,选择Data Source
如果前面配置好odbc 这一步就会看到你的配置
第二步:data source 放到脚本最前端
3.Badboy 中跑并发
点击Tools选择Run Background Threads
Number of Thread :并发数
Clear cookies each iteration :每次运行之前清理cookies
Stagger time:每次运行的间隔时间
5.Badboy 中的Report
点击View Report 选择Summary Repopt 可以看到报告
6.Badboy 中打断点
选中相应的请求右键选择选择Toggle Break Point
Jmeter实战
一. 测试步骤
- 创建测试计划
- 创建线程组
- 创建http 请求
- 创建监听器
- 运行脚本
- 查看报告
Http 请求设置说明:
- 名称:本属性用于标识一个取样器,建议使用一个有意义的名字
- 注释:对测试没有任何作用随便填
- 服务器的名称或ip:http 请求发送的目标服务器名称或ip 地址
- 端口号:目标服务器的端口号,默认为80,后面的超时定义可以不用写,
- 协议:向目标服务器发送http请求时的协议,可以是http或是https,默认是http
- 方法:发送http 请求的方法,可以包括get ,post,head ,put
- Content encoding:内容的编码方式
- 路径:目标URL路径(不包括服务器地址或端口)
- 自动重定向:选中该选项当发送http请求得到的响应是301或302时,Jmeter会自动重定向到别的页面。
- use keep alive:当该选项被选中时jmeter 和目标服务器之间使用keep alive 方式进行http 通信。默认选中。
- 对post 使用multipart /form -data :当发送post请求时,使用multipart /form -data 方法,默认不选中
- 同请求一起发送参数:在请求中发送url参数,对于带参数的url ,jmeter 提供了一个简单的对参数化的方法。用户可以将url中所有的参数设置在本表中,表中的每一行是一个参数值对( 对应url中的名称=值)
- 同请求一起发送文件:在请求中发送文件,通常,HTTP文件上传行为可以通过这种方式模拟。
- 从HTML文件嵌入资源:当该选项被选中时,jmeter 在发出http 请求并获取HTML中包含的所有资源(图片,flash等)默认不选中,如果用户只希望获取页面中的特定资源,可以在下方的Embedded urls must match 文本框中填入需要下载的特定资源表达式,这样只有能匹配指定正则表达式的url 指向资源会被下载。
- 用作监听器:此取样器被当成监听器,在Monitor Results Listener 中可以直接看到基于该取样器的图形化统计信息。默认为不选中。
- Save response as MD5 hash ?:选中该项,在执行时记录服务端响应数据的MD5值,而不记录完整的响应数据。在需要进行数据量非常大的测试时,建议选中该选项以减少取样器记录响应数据的开销。
场景设置(在线程组中设置)
-
线程数:虚拟用户数
-
Ramp-up 时间:设置虚拟用户数在多长时间内全部启动,如果线程数为20,时间为10,就是每秒钟启动2个线程。
-
循环次数:每个线程发送请求的次数,如果线程数为20,循环次数为100,那么每个线程发送100次请求,总请求数为100*20=2000 如果勾选了“永远” 那么线程会一直运行下去。
-
调度器:可以灵活的设置运行时间等。
监听器-聚合报告的字段说明
单位:毫秒
- lable:定义http 的请求名称
- Samples:表示这次测试中一共发出了多少个请求
- Average:平均响应时间,默认情况下是单个Request 的平均响应时长,当使用了Transaction Controller 时,可以以Transaction 为单位显示平均时长。
- 90%line :90% 用户的响应时长
- Min: 访问页面的最小响应时长
- Mac: 访问页面的最大响应时长
- Error%:错误请求的数量/请求总数的值
- Throughput:默认情况下每秒完成的请求数,当使用了Transaction Controller 时,可以以Transaction 为单位显示平均时长。
案例一:
测试20个用户访问某网站 在QPS达到30 的平均响应时间
QPS: 每秒查询率,是一台服务器每秒能处理的查询次数。
第一步:添加线程组
第二步:添加HTTP请求
第三步:设置QPS的值
Jmeter 提供了一个非常有用的定时器:称为Constant Throughput Timer (常数吞吐量定时器)该定时器可以很方便地控制给给取样器发送请求的吞吐量
这个下面还有5个选项
只有此线程:控制每个线程的吞吐量,选择该选项总的吞吐量等于目标吞吐量* 线程数
所有活动线程:选择该选项设置的目标吞吐量将分配到每个活跃的线程上,每个活跃线程在上一次运行结束后等待合理的时间再次运行,活跃线程指同一时刻同时运行的线程都会。
所有活动线程(共享)):与所有活动线程基本相同,唯一不同的是每个的活跃线程都会在在=上一次运行结束后等待合理的时间再次运行
当前线程组中的所有活动线程:设置的目标吞吐量将分配到当前线程组的每一个活跃的线程上,当测试计划中只有一个线程组时,该选项与所有活动线程选项的效果相同。
当前线程组中的所有活动线程(共享):和当前线程组中的所有活动线程 基本相同,唯一不同的是:每个活跃线程都会在都会在所有活跃线程的上一次运行运行结束后
等待合理的时间再次运行
第四步:添加监听器:
添加聚合报告
添加查看结果树
第五步:运行脚本
第六步:查看报告
字段说明:
Jmeter 元件的作用域和执行顺序
1.Jmeter 元件的作用域
- 配置元件:会影响其作用范围内的所有元件
- 前置处理器:在其作用范围内每一个Sample元件之前执行
- 定时器:对其作用范围内的每一个Sample 有效
- 后置处理器:在其作用范围内的每一个Sample 后执行
- 断言:对其作用范围内的每一个Sample 元件执行后的结果做校验
- 监听器:收集其作用范围的每一个Sample元件的信息并呈现
- sample 元件和其他元件没有相互作用,所以不存在作用域的问题。
2.Jmeter 元件的执行顺序
- 配置元件
- 前置处理器
- 定时器
- sample
- 后置处理器
- 断言
- 监听器
如果在统一作用域范围内有多个同一类型的元件,则这些元件按照他们在测试计划中上下顺序依次执行。
Jmeter参数化
第一种方式:
线程组–>前置处理其–>用户参数
输入变量名称和变量值
在请求中使用将需要参数化的地方用参数名称代替
第二种方式:
配置元件–>CSV Data Set Config
把参数化的文件地址写入
参数文件的格式如下:
参数文件配置好后我们同样需求在请求中将需要参数化的地方用参数名进行替换。
第三种方式
工具—>函数助手对话框
选择random ,输入最大值,最小值,点击生成
最后把自动生成的函数字符串复制到需要参数化的地方即可
Jmeter 集合点
定时器—>Synchronzing
⚠️注意:集合点需要放在集合的操作之前
Jmeter 检查点(断言)
步骤:
- Badboy 录制脚本后导入Jmeter
- 参数化
- 对相应的请求添加断言(Http 请求——》右键——》添加——》断言——》响应断言
- 对相应的请求添加断言结果(Http 请求——》右键——》添加——》监听器——》断言结果)
- 一般成功只会只会显示一行,否则会显示多行
其他断言功能:
断言持续时间:就是你给你的请求填写一个预期的响应时间,在预期响应时间呢,断言成功,否则失败
大小断言:给返回值设置一个预期的大小
响应断言:
添加断言结果
Jmeter 的图形监控扩展
下载插件:点我下载
下载这两个:
首先将JmeterPluging.jar 包复制到Jmeter lib 目录下的ext 目录下 然后重新启动
Jmeter 将Server-Anent 目录下的文件复制到我们的测试服务器上,然后打开点击Server.bat 他的默认端口是4444
Jmeter ftp 服务器的测试
第一步:创建一个线程组
第二步:添加ftp 默认请求
第三步:添加ftp 请求
远程文件:服务器上的一个文件
下一步:添加监听器
Jmeter测试数据库
第一步:准备一个有数据的表的数据库
第二步:在测试面板点击浏览按钮把你的JDBC驱动添加进来,
jdbc 驱动下载地址:下载地址:点我下载
mysql-connector-java-5.1.7-bin.jar
下一步:设置JDBC的连接配置
下一步:添加JDBC请求
下一步添加断言,并添加断言结果(同上)
下一步:添加查看结果树,添加报告
最后一步:运行即可
Jmeter 分布式测试
背景:由于Jmeter 本身的瓶颈,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至为引起Java 内存溢出的错误,要解决这个问题,可以使用分布式测试,运行多台机器所谓的Anent 来分担Jmeter 自身的压力,并借此来获得更多得并发用户数。
操作步骤:
1.安装Jmeter并确定其中一台作为控制机,其他机器作为Agent,然后运行所有Agent上的Jmeter-Server.bat 文件 假设我们使用两台机器192.168.0.11 和192.168.0.12 作为Agent(Agent 上必须装上jdk 并设置好环境变量)
2.在 控制机 Jmeter home 的bin目录下 编辑jmeter.properties 文件修改remote_host 为192.168.0.11:1099,192.168.0.12:1099 其中1099 为端口号
3.启动控制机上的jmeter.bat ,选择菜单中的Remote run 中的agent 来运行即可
常见问题:
1.Jmeter 需要与jdk的版本一致