一.简介
Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。开源,免费且具有了LoadRunner95%以上的功能,性价比极高。
jmeter特点
支持对多种服务类型进行测试;
支持通过录制/回放方式获取测试脚本;
具备高可移植性,是100%的纯java程序;
采用多线程框架,允许通过多个线程并发取样及通过独立的线程组对不同的功能同时取样;
精心设计的GUI支持高速用户操作和精确计时;
支持缓存/离线的方式分析/回放测试结果;
具备高扩展性 ;
jmeter与LoadRunner异同:
Jmeter | LoadRunner |
纯java开发,支持多种java脚本语言 | 主要由C语言开发,支持java、VB、C# |
免费 | 收费 |
录制功能逊色 | 录制功能强大 |
需要使用扩展插件或自己编程才能实现这些工作 | 支持市面上几乎所有类型的性能测试: C、java、VB、JavaScript、C#开发的程序; 数据库(Oracle、MySQL、SQLServer)应用; C/S、B/S、移动端等。 结果分析器强大 。 |
二.jmeter的安装下载
(1)安装JDK
官网下载安装jdk——配置环境变量——验证JDK
(2)安装jmeter
JMETER的安装非常简单,从官网下载并解压即可使用。
任何支持java的操作系统都支持jmeter。
三.jmeter的目录结构
(1)bin:核心可执行文件,包含配置
jmeter.bat - 启动文件, 运行JMeter(默认在GUI模式)
jmeter-n.cmd - 使用一个JMX文件运行非GUI测试
jmeter-n-r.cmd - 使用一个JMX文件远程运行一个非GUI测试
jmeter-t.cmd - 在GUI模式使用一个JMX文件
jmeter-server.bat - 分布式压测使用的启动文件;以服务器模式启动JMeter
jmeter.properties:核心配置文件
report-template:报告模板
shut.down:关闭jmeter
(2)docs:文档
(3)extras:插件拓展的包
(4)lib:依赖的包,常见的核心包、工具类
ext:核心包
junit:单元测试包
(5)printable_docs
一些离线文档
语言版本中英文切换:GUI页面的options-choose language
四.jmeter工作原理
Jmeter可以作为web服务器与浏览器之间的代理网关,以便捕获浏览器的请求和服务器的响应,如此就可以很容易地生成性能测试脚本,进而通过线程组来模拟真实用户对web服务器的访问压力。
使用步骤:测试计划—脚本录制设置—录制脚本—调试脚本—场景设置—结果分析
jmeter基本原理是建立一个线程池,多线程运行取样器产生大量负载,在运行过程中通过断言来验证结果的正确性,通过监听器来记录测试结果。如果取样器中有参数化的需求,可以通过配置元件或者前置处理器来完成。如果有关联需求,可以通过后置处理器来完成。如果我们想要设置运行场景,比如模拟多少用户,运行多长时间,就设置线程组。如果我们想要模拟并发场景,可以利用定时器来设置;如果我们想要控制业务的执行逻辑,比如登录只运行一次,我们可以用控制器来完成。
Test Plan ——用来描述一个性能测试,包含与本次性能测试所有相关的功能
Thread Group:场景A,搜索 ——通俗的讲一个线程组,,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。线程组中包含的线程数量在测试执行过程中是不会发生改变的。
Thread Group:场景B,加购
Thread Group
Sampler
Listener(占内存,做大并发时一般不用)
Thread Group
jmeter集群模式:JMeter的集群模式可以让我们将多台机器联合起来一起产生负载,从而弥补单台机器负载生成能力不足的问题。假设我们的测试计划会产生100个threads,我们使用6台机器进行分布式测试的时候,一共会产生100 * 6 = 600的负载。
一台机器可以发出的并发数是有限的。
Jmeter分布式压测原理(参考:https://zhuanlan.zhihu.com/p/84651268)
1、总控机器的节点master,其他产生压力的机器叫“肉鸡”server
2、master会把压测脚本发送到server上面
3、执行的时候,server上只需要把jmeter-server打开就可以了,不用启动jmeter
4、结束后,server会把压测数据回传给master,然后master汇总输出报告
- 取样器
取样器的访问路径:【测试计划】——【线程组】——【Sampler】
一个test plan下可以有多个线程组,不同的线程组测试不同的场景,从而组成复杂的测试场景。
一个线程组下可以有多个Sampler(取样器),Sample是执行单元。
- 断言
断言用来验证结果是否正确,预设一个结果(值、表达式、时间长短等条件)与实际结果匹配,匹配到则成功,反之失败。
断言的访问路径是:【测试计划】——【断言】
- 监听器
Jmeter的测试结果需要监听器来收集,监听器:①添加结果监听,并且可以保存测试结果到文件,这些结果数据可以供再次分析使用;②展示结果,Jmeter可以以表格及图形的形式展现结果,方便测试人员分析测试结果。
监听器的访问路径:【测试计划】——断言
- 前置处理器
请求发送前做一些环境或者参数的准备工作,可以在前置处理器中来完成这些工作。比如,我们对数据库进行操作前需要先建立一个数据库连接,那么前置处理器就可以完成这个功能。
前置处理器的访问路径:【测试计划】——【前置处理器】
- 配置元件
性能测试中为了模拟大量用户操作我们往往需要做参数化,Jmeter的参数化可以通过配置元件来完成,比如CSV Data Set Config,它可以帮助我们从文件中读取测试数据。配置元件也可以用来记录服务器的返回数据,比如Http Cache Manage,自动记录服务器返回的Cache信息。
配置元件访问路径:【测试计划】——【配置元件】
- 后置处理器
后置处理器一般放在取样器之后,用来处理服务器的返回结果。比如登录web后服务器会返回一个SessionID,Jmeter可以通过正则表达式提取数据。
后置处理器访问路径:【测试计划】——【后置处理器】
前置处理器、配置元件、后置处理器都是为取样器提供数据支持的,取样器关注的是业务逻辑。
- 控制器
控制器的访问路径:【测试计划】——【逻辑控制器】
- 定时器
为了足够真实地模拟用户负载,我们有时需要模拟请求在同一时刻发送,Jmeter可以通过定时器来完成这个需求。定时器种类有很多。
访问路径:【测试计划】——【线程组】——【定时器】
- 线程组
在线程组中可以设置运行的线程组(模拟多用户,一线程一用户),还可以设置运行时长、定时运行等。
访问路径:【测试计划】——【Threads(Users)】
- Test Fragment
这是一个辅助的元件,在此节点下面几乎可以放置任何Jmeter测试元件,但它一般不会被运行。①在脚本开发过程中可以用它来备份文件,②下面的元件可以被模块控制器调用,可以利用它来模块化请求供模块控制器调用。
- 工作台
不直接参与运行,①运行Jmeter录制Http协议脚本时就用到它,我们可以在它下面建立一个HTTP代理服务器元件,设置代理信息然后进行录制;②设置服务器监控(HTTP Mirror Server);③显示当前Jmeter属性信息;④备份脚本。
执行顺序规则:
- 配置元件
- 前置处理器
- 定时器
- 采样器
- 后置处理器
- 断言
- 监听器
五.页面介绍
参考:
5.1主页面
菜单栏
(1)文件
- 关闭:关闭当前打开的JMX文件 。
- 打开:打开一个JMX文件。
- Templates 模板:对常用的功能使用指导。主要有录制、JDBC测试、webserver测试等等,分为基本步骤和详细截图。 如果点用户链接,则会链接到apache jmeter 网站查看详细的步骤和截图指导。
- 合并:会将多个JMX合并为一个 。
- 保存测试计划:仅保存测试计划 工作台中添加的内容不会被保存。
- 保存测试计划为:将测试计划另存。
- 另存为:可以对工作台和测试计划或者测试例另存为JMX 注意另存为是点哪个位置,存的就是哪个内容。
- save as Test fragment:存为一个测试片段,只有线程组、测试计划、工作台不能 保存为一个测试片段。
- Revert:还原,将现在的jmx还原为已经保存过的JMX
(2)编辑
- Save Node As Image(保存节点为图片): 将菜单的配置GUI保存为图片。
- Save Screen As Image(保存屏幕为图片): 将整个jmeter界面保存为图片。
- Toggle(切换):类似于java中设置断点的意思。
(3)查找
- Search: 搜索所有配置中匹配的项,匹配成功显示为红色。
- Reset Search: 重置搜索,清除搜索结果。
(4)运行
- 启动: 启动运行测试计划
- Start no pauses(不停顿开始): 无停顿启动运行测试计划 1,可以忽略定时器 2,再启动时运行更快
- 远程启动/停止: 指定一个远程agent运行/停止测试计划。
- 远程全部启动/停止: 让所有远程agent运行/停止测试。
- 停止: 停止执行测试计划。
- 关闭: 关闭测试计划。
- Remote Shutdown: 关闭一个指定远程agent。
- Remote Shutdown All: 关闭所有远程agent。
- 远程退出: 指定一个远程agent退出执行。
- 远程退出全部: 所有远程agent退出执行。
- 清除: 清除选择菜单的执行结果。
- 清除全部: 清除所有菜单的执行结果。
(5)选项
- 函数助手对话框: 在编写脚本的时候,使用函数助手可以协助生成指定的代码。
- 外观: jmeter界面样式。
- Log Viewer: 日志查看器,选中后可以在右下方查看运行日志。
- SSL管理器: 导入外置的SSL管理器,用于更好的管理证书, JMeter代理服务器不支持记录 SSL(https)。
- 选择语言: 选择界面的语言,目前支持中文、英文、法语、德语等等。中文版很多翻译不全,可以直接使用英文版的。
- Collapse All: 展开所有菜单。
- Expand All: 折叠所有菜单
(6)帮助
- What’s this node?: 当鼠标放在某个菜单的时候显示其含义。
- Enable debug: 开启调试。
- Disable debug: 取消调试。
- Create a heap dump: 创建堆转储。这是创建当JVM崩溃的堆转储。这个文件可以用堆分析工具(如JHAT),以确定根本原因进行分析。
计划的内容
“函数测试模式”复选框,如果被选择,它会使Jmeter记录来自服务器返回的每个取样的数据。如果你在测试监听器中选择一个文件,这个数据将被写入文件。如果你尝试一个较小的测试来保证Jmeter配置正确并且你的服务器正在返回期望的结果,这是很有用的。这样做的后果就是这个文件会快速的增大,并且Jmeter的效率会影响。如果不记录数据到文件,这个选项就没有不同了。
5.2线程组页面
same user on each iteration:每次迭代使用相同的线程
延迟创建线程直到需要:如果勾选了此选项,那么线程只会在合适的需要用到的时候创建
另:
setup thread group :一种特殊类型的ThreadGroup的,可用于执行预测试操作。这些线程的行为完全像一个正常的线程组元件。不同的是,这些类型的线程执行测试前进行定期线程组的执行。setUp Thread Group类似于lr的init.可用于执行预测试操作。
teardown thread group.:一种特殊类型的ThreadGroup的,可用于执行测试后动作。这些线程的行为完全像一个正常的线程组元件。不同的是,这些类型的线程执行测试结束后执行定期的线程组。tearDown Thread Group类似于lr的end.可用于执行测试后动作。
六.jmeter快捷键
[Options]
字体变大:zoom in 或者 Alt + O + I
运行前自动保存:勾选Save automatically before run
查看日志:log view
日志等级:log level,选择日志的级别,有一般的info,也有较严重的fatal
[Run]:
运行远程机器:Remote Start。集群模式,用一台机器控制其他的jmeter机器(把master上的脚步下发到两台slave上,让两台机器同时执行,提高并发。两台slave也即是远程机器,remote)。
[Tools]:
create a heap dump:查看jmeter的内存使用情况,jmeter使用的内存在JVM的堆上面
create a thread dump:查看线程详情
function helper dialog :查找function
generate HTML report:生成HTML报告
[操作]:
ctrl+0 :新建一个线程组
ctrl+1 :新建一个HTTP请求(Http Request)
ctrl+8 :新建一个调试取样器(Debug Sampler)
ctrl+9 :新建一个查看结果树(View Result Tree)