Jmeter使用
Jmeter简介
Jmeter是由Apache公司开发的一个纯Java的开源项目,即可以用于做接口测试也可以用于做性能测试。
Jmeter具备高移植性,可以实现跨平台运行。
Jmeter可以实现分布式负载。
Jmeter采用多线程,允许通过多个线程并发取样或通过独立的线程对不同的功能同时取样。
Jmeter具有较高扩展性。
Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能,例如:静态文件,Java Servlet,CGI Scripts,Java Object,数据库和FTP服务器等等。JMeter可用于模拟大量负载来测试一台服务器,网络或者对象的健壮性或者分析不同负载下的整体性能。
同时,JMeter可以帮助你对你的应用程序进行回归测试。通过你创建的测试脚本和assertions来验证你的程序返回了所期待的值。为了更高的适应性,JMeter允许你使用正则表达式来创建这些assertions.
JMeter与LoadRunner比较
JMeter 是一款开源(有着典型开源工具特点:界面不美观)测试工具,虽然与LoadRunner相比有很多不足,比如:它结果分析能力没有LoadRunner详细;很它的优点也有很多:
- 开源,他是一款开源的免费软件,使用它你不需要支付任何费用,
- 小巧,相比LR的庞大(最新LR11将近4GB),它非常小巧,不需要安装,但需要JDK环境,因为它是使用java开发的工具。
- 功能强大,jmeter设计之初只是一个简单的web性能测试工具,但经过不段的更新扩展,现在可以完成数据库、FTP、LDAP、WebService等方面的测试。因为它的开源性,当然你也可以根据自己的需求扩展它的功能。
两者最大的区别:jmeter不支持IP欺骗,而LR支持。
JMeter缺点
使用JMeter无法验证JS程序,也无法验证页面UI,所以要须要和Selenium配合来完成Web2.0应用的测试。
Jmeter安装
安装配置JDK
Jmeter5.3依赖JDK1.8+版本,JDK安装百度搜索JAVA下载JDK,地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html,也可以访问百度网盘下载后根据提示安装即可。
环境变量配置后,cmd输入java -version验证是否安装成功
获取安装包
访问apache官网:https://www.apache.org/dist/jmeter/binaries/,点击下载获取最新的Jmeter安装包
安装部署
解压下载后的zip压缩包,解压到指定路径,会生成对应目录
最新版本的Jmeter不需要配置环境变量,进入apache-jmeter-5.3\bin目录下,双击运行jmeter.bat启动脚本
双击后如果有以下弹框出现,并且应用程序自动打开首页面,则表示安装部署成功
中文转换
当次生效
在Jmeter的GUI页面,选择Options->Choose Language->Chinese(Simplified)
永久生效
在Jmeter的安装目录的bin目录下,打开jmeter.properties配置文件,在37行的地方我们修改language的值为zh_CN,并去掉前边的“#”号键,取消注释,或者直接添加一行为language=zh_CN,保存后,重启Jmeter后生效
中文版的界面展示如下
JVM参数设置
JMeter用户可根据运行的计算机配置,来适当调整JMeter.bat中的JVM调优设置,如下所示:
1 | set HEAP=-Xms512m -Xmx512m |
根据经验,堆值(HEAP)最多设置为物理内存的一半,默认设置为512m,如果堆值(HEAP)超过物理内存的一半,JMeter运行速度会变慢,设置会出现“内存溢出”的错误。
如果用户想要获取详细的日志,可以修改bin目录下的JMeter.properties文件中的一个属性log_level.jmeter。默认为INFO,查错时可以改为DEBUG。
JMeter的属性设置也可以在图形用户界面中展示,选择“添加”-〉“非测试元件”-〉“Property Display”
Jmeter主要元件
测试计划:是使用 JMeter 进行测试的起点,它是其它 JMeter测试元件的容器
线程组:代表一定数量的用户,它可以用来模拟用户并发发送请求。实际的请求内容在Sampler中定义,它被线程组包含。
配置元件:维护Sampler需要的配置信息,并根据实际的需要修改请求的内容。
前置处理器:负责在请求之前工作,常用来修改请求的设置
定时器:负责定义请求之间的延迟间隔。
**取样器(Sampler)**:是性能测试中向服务器发送请求,记录响应信息、响应时间的最小单元,如:HTTP Request Sampler、FTP Request Sample、TCP Request Sample、JDBC Request Sampler等,每一种不同类型的sampler 可以根据设置的参数向服务器发出不同类型的请求。
后置处理器:负责在请求之后工作,常用获取返回的值。
断言:用来判断请求响应的结果是否如用户所期望的。
监听器:负责收集测试结果,同时确定结果显示的方式。
逻辑控制器:可以自定义JMeter发送请求的行为逻辑,它与Sampler结合使用可以模拟复杂的请求序列。
元件作用域
配置元件:影响其作用范围内的所有元件。
前置处理器:在其作用范围内的每一个sampler元件之前执行。
定时器:在其作用范围内的每一个sampler有效
后置处理器:在其作用范围内的每一个sampler元件之后执行。
断言:在其作用范围内的对每一个sampler元件执行后的结果进行校验。
监听器:在其作用范围内对每一个sampler元件的信息收集并呈现。
总结:从各个元件的层次结构判断每个元件的作用域。
元件执行顺序
配置元件->前置处理器->定时器->取样器->后置处理程序->断言->监听器
注意事项
前置处理器、后置处理器和断言等组件只能对取样器起作用,因此,如果在它们的作用域内没有任何取样器,则不会被执行。
如果在同一作用域内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序依次执行。
接口测试流程
使用Jmeter进行接口测试的基本步骤如下:
测试计划
线程组
HTTP Cookie管理器
Http请求默认值
Sampler(HTTP请求)
断言
监听器(查看结果树、图形结果、聚合报告等)
接口测试流程步骤详解
测试计划
打开Jmeter,在菜单左侧出现 “测试计划”。在这里测试计划我们可以把它理解成新建的空白项目,在这个空白项目下面可以添加一系列的接口。
线程组
添加方法:右键点击Test Plan->添加->线程(用户)->线程组。
元件描述:一个线程组可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。
线程组界面
参数描述
线程数:即虚拟用户数。设置多少个线程数也就是设置多少虚拟用户数
Ramp-Up时间(秒):设置虚拟用户数全部启动的时长。如果线程数为20,准备时长为10秒,那么需要10秒钟启动20个线程。也就是平均每秒启动2个线程。
循环次数:每个线程发送请求的个数。如果线程数为20,循环次数为10,那么每个线程发送10次请求。总请求数为20*10=200。如果勾选了“永远”, 那么所有线程会一直发送请求,直到手动点击工具栏上的停止按钮,或者设置的线程时间结束。
HTTP Cookie管理器
添加方法:右键线程组->添加->配置元件->HTTP Cookie管理器。
元件描述:HTTP Cookie管理器可以像浏览器一样存储和发送cookie,如果你要发送一个带cookie的http请求,cookie manager会自动存储该请求的cookies,并且后面如果发送同源站点的http请求时,都可以用这个cookies。
HTTP Cookie管理器界面
HTTP请求默认值
添加方法:右键线程组->添加->配置元件->HTTP请求默认值。
元件描述:HTTP请求默认值是为了方便填写后续内容而设置。主要填写[服务器名称或IP]和[端口号],后续的HTTP请求中就不用每次都填写IP地址和端口号了。
HTTP请求默认值管理器界面
HTTP请求
添加方法:右键线程组->添加->取样器->HTTP请求。
元件描述:HTTP请求包括接口请求方法、请求路径和请求参数等。
HTTP请求管理器界面
HTTP请求详解
名称:本属性用于标识一个取样器,建议使用一个有意义的名称。
注释:对于测试没有任何作用,仅用户记录用户可读的注释信息。
服务器名称或IP :HTTP请求发送的目标服务器名称或IP地址。
端口号:目标服务器的端口号,默认值为80 。
协议:向目标服务器发送HTTP请求时的协议,可以是HTTP或者是HTTPS ,默认值为http 。
方法:发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、TRACE、OPTIONS、DELETE等。
路径:目标URL路径(不包括服务器地址和端口)
内容编码:内容的编码方式,默认值为iso8859
自动重定向:如果选中该选项,当发送HTTP请求后得到的响应是302/301时,JMeter 自动重定向到新的页面。
使用keep Alive :保持jmeter 和目标服务器之间的活跃状态,默认选中
对Post使用multipart/from-data:当发送POST 请求时,使用multipart/from-data方法发送,默认不选中。
同请求一起发送参数 : 在请求中发送URL参数,对于带参数的URL ,jmeter提供了一个简单的对参数化的方法。用户可以将URL中所有参数设置在本表中,表中的每一行是一个参数值对(对应RUL中的 名称1=值1)。
响应断言
添加方法:右键HTTP请求->断言->响应断言。
元件描述:检查接口是否访问成功。如果检查失败的话会提示找不到断言的内容,没提示的话就代表成功了。
响应断言管理器界面
Apply to
指断言作用范围,通常发出一个请求只触发一个请求,所以勾选“main sample only”就可以;若发一个请求可以触发多个服务器请求,就有main sample 和sub-sample之分了。
Main sample and sub-samples:作用于主请求和子请求
Main sample only:仅仅只作用于主请求
Sub-samples only:仅仅只作用于子请求
Jmeter Variable:作用于jmeter变量(输入框内输入jmeter变量名称)
测试字段
响应文本
(匹配返回的json数据)、响应代码(匹配返回码:如200, 404,500等)、响应信息(匹配响应信息如“OK”字样)、响应头(匹配响应头)、请求头(匹配请求头)、URL样本(匹配请求的url链接,如果有重定向则包含请求url 和 重定向url)、文档(文本)、忽略状态(一个请求有多个响应断言,第一个响应断言选中此项,当第一个响应断言失败时可以忽略此响应结果,继续进行下一个断言。如果下一个断言成功则还是判定事务是成功的)、请求数据(匹配请求数据)
模式匹配规则
包括:响应内容包含需要匹配的内容即代表响应成功,支持正则表达式。
匹配:响应内容要完全匹配需要匹配的内容即代表响应成功,大小写不敏感,支持正则表达式。
字符串
响应内容包含需要匹配的内容才代表响应成功,大小写敏感,不支持正则表达式
相等:响应内容要完全等于需要匹配的内容才代表响应成功,大小写敏感,不支持正则表达式
否:相当于取反,如果结果为true,勾上否就是false
或者:如果不想用AND连接(所有的模式都必须匹配,断言才算成功),用OR选项可以用于将多个断言模式进行OR连接(只要一个模式匹配,断言就是成功的)
测试模式
其实就是断言的数据。点击“添加”按钮,输入要断言的数据。
增加监听器
添加方法:线程组 ->右键添加 ->监听器 ->察看结果树。一般还会一并添加图形结果、聚合报告。
元件描述:树状形式显示接口的访问结果,包括请求结果、请求内容、服务器的响应内容。
察看结果树管理器界面
基础实战
需求
测试需求:测试20个用户访问web网站在负载达到30QPS时的平均响应时间
QPS:Query Per Second 每秒查询率。是一台查询服务器每秒能够处理的查询次数。在因特网上,作为域名系统服务器的性能经常用每秒查询率来衡量。
操作步骤
添加线程组(包含三个参数:线程数、准备时长、循环次数)
线程数:虚拟用户数,一个虚拟用户占用一个进行或线程
准备时长(s):虚拟用户需要多长时间全部启动,如果线程为20,准备时长为10,那么需要10秒钟启动20个,也就是每秒启动2个线程
循环次数:每个线程发送请求的次数。如果线程为20,循环5次,那么每个线程发送5次请求,总请求为20*5=100,如果勾选了”永远”,所有线程会一直发送请求,一直到选择停止运行脚本
添加HTTP请求
设置HTTP请求的 ip端口以及访问地址
设置QPS限制
Jmeter提供了一个非常有用的定时器,Constant Throughput Timer(常数吞吐量定时器),该定时器可以方便地控制给定的取样器发送请求的吞吐量。
目标吞吐量Target throughput:这里是每分钟发送的请求数,实际填的数值为:60*QPS也就是1800。
添加监视器
因为为HTTP请求,可以添加聚合报告、察看结果树,更为直观查看测试结果。
察看结果树
聚合报告
聚合报告解析
响应时间单位:毫秒
Label
每个Jmeter的element都有一个Name属性,这里显示的就是Name属性的值
#Sample
表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100
Average
平均响应时间-默认情况下是单个Request的平均响应时间当使用了Transaction Controller 时,也可以以Transaction为单位显示平均响应时间
Median
中位数,50%用户的响应时间
90%Line
90%用户响应时间
Min
最小响应时间
Max
最大响应时间
Error%
本次测试中出现错误的请求的数量/请求的总数
Throughput
吞吐量-默认情况下白石每秒的请求数
KB/sec
每秒从服务器端接收到的数据量