Jmeter
1.介绍
1.1 是什么?
Apache JMeter™应用程序是开源软件,一个 100% 纯 Java 应用程序,旨在加载测试功能行为和测量性能 。它最初是为测试 Web 应用程序而设计的,但后来扩展到其他测试功能。
我能用它做什么?
Apache JMeter 可用于测试静态和动态资源、Web 动态应用程序的性能。 它可用于模拟服务器、服务器组、网络或对象上的重负载,以测试其强度或分析不同负载类型下的整体性能。
Apache JMeter 功能包括:
- 能够加载和性能测试许多不同的应用程序/服务器/协议类型:
- Web - HTTP、HTTPS(Java、NodeJS、PHP、ASP.NET,...)
- SOAP / REST Web 服务
- FTP
- 通过 JDBC 的数据库
- LDAP
- 通过 JMS 的面向消息的中间件 (MOM)
- 邮件 - SMTP(S)、POP3(S) 和 IMAP(S)
- 本机命令或 shell 脚本
- TCP
- Java 对象
- 功能齐全的测试 IDE,允许快速记录测试计划(从浏览器或本机应用程序)、构建和调试。
- **CLI 模式(命令行模式(以前称为非 GUI)/无头模式)**可从任何 Java 兼容操作系统(Linux、Windows、Mac OSX 等)进行负载测试
- 完整且**可随时呈现的动态 HTML 报告**
- 通过从最流行的响应格式、 HTML、JSON****、 **XML或任何文本格式**中提取数据的能力轻松关联
- 完全的可移植性和100% Java 纯度。
- 完整的多线程框架允许多个线程同时采样和不同线程组同时采样不同功能。
- 缓存和离线分析/重放测试结果。
- 高度可扩展的核心:
- 可插拔采样器允许无限的测试能力。
- 可编写脚本的采样器(与Groovy和 BeanShell等 JSR223 兼容的语言)
- 可以使用可插入计时器选择几个负载统计信息。
- 数据分析和可视化插件允许很好的可扩展性和个性化。
- 函数可用于为测试提供动态输入或提供数据操作。
- 通过Maven、Gradle 和 Jenkins 的3 rd方开源库轻松实现持续集成。
1.2 目录介绍
主要目录介绍如下:
1.3 工作界面介绍
主要界面如下:
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),以确定根本原因进行分析。
1.4 组件介绍
执行顺序
测试计划的元素执行是有序的,通过以下方式执行:
1–配置元件(Config Element)
2–前置处理器(Pre Processors)
3–定时器(Timer)
4–取样器(sampler)
5–后置处理器(Post Processors,只在有结果可用情况下执行)
6–断言(Assertions,只在有结果可用情况下执行)
7–监听器(Listener,只在有结果可用情况下执行)
作用域
一个组件的作用域,和组件所在的位置,是在线程组下、控制器下、取样器下有关。
这个例子中,Timer #1会应用到取样器Two, Three, 和Four,即使Timer #1的位置在最下方。
Assertion #1仅仅会应用到取样器Three。Timer #2会影响所有取样器。
元件的作用域是靠测试计划的的树型结构中元件的父子关系来确定的,作用域的原则是:
1.采样器(sampler):元件不和其它元件相互作用,因此不存在作用域的问题。
2.逻辑控制器(Logic Controller):元件只对其子节点中的取样器 和 逻辑控制器作用。
3.除采样器 和 逻辑控制器 元件外,其他6类元件,如果是某个sampler的子节点,则该元件只对其父子节点起作用。
4.除采样器和逻辑控制器元件外的其他6类元件,如果其父节点不是sampler ,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)。
注意:
配置元件(Config Elemnet)-->用户自定义变量组件(User Defined Variables):这个组件不管放在哪个位置,它定义的变量都会被整个线程所共享。
1.4.1 测试计划(Test Plan)
使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器。
1.4.2 线程组(Thread Group)
代表一定数量的并发用户,它可以用来模拟并发用户发送请求。实际的请求内容在Sampler中定义,它被线程组包含。可以在“测试计划->添加->线程组”来建立它,然后在线程组面板里有几个输入栏:线程数、Ramp-Up Period(in seconds)、循环次数,其中Ramp-Up Period(in seconds)表示在这时间内创建完所有的线程。如有8个线程,Ramp-Up = 200秒,那么线程的启动时间间隔为200/8=25秒,这样的好处是:一开始不会对服务器有太大的负载。线程组是为模拟并发负载而设计。
1.4.3 取样器(sampler)
模拟各种请求。所有实际的测试任务都由取样器承担,存在很多种请求。如:HTTP 、ftp请求等等。
1.4.4 监听器(Listener)
负责收集测试结果,同时也被告知了结果显示的方式。功能是对取样器的请求结果显示、统计一些数据(吞吐量、KB/S……)等。
1.4.5 逻辑控制器(Logic Controller)
允许自定义JMeter发送请求的行为逻辑,它与Sampler结合使用可以模拟复杂的请求序列。
1.4.6 断言(Assertions)
用于来判断请求响应的结果是否如用户所期望,是否正确。它可以用来隔离问题域,即在确保功能正确的前提下执行压力测试。这个限制对于有效的测试是非常有用的。
1.4.7 配置元件(Config Element)
配置元件维护Sampler需要的配置信息,并根据实际的需要会修改请求的内容。
1.4.8 前置处理器(Pre Processors) 后置处理器(Post Processors)
前置处理器和后置处理器负责在生成请求之前和之后完成工作。前置处理器常常用来修改请求的设置,后置处理器则常常用来处理响应的数据。
1.4.9 定时器(Timer)
负责定义请求(线程)之间的延迟间隔,模拟对服务器的连续请求。
2.使用
2.1 启动方式
可以进入bin里,找到相关方式进行启动,在windows里,第三种方式由于会产生一个命令框,一般只要安装了相应的JDK,直接点击==ApacheJMeter.jar==启动即可(若启动不了,则看一下是否环境变量都配置正确)
2.2 一个POST请求
代码示例:
@RestController
@RequestMapping("/person")
@Slf4j
public class PersonController {
@GetMapping("/id")
public Person person(Integer id) {
return Person.builder().pid(id).pName("测试").build();
}
//添加员工信息
@PostMapping("/json")
public Result<List<Person>> addByJson(@RequestBody Person person){
List<Person> personList = Arrays.asList(Person.builder().pid(person.getPid()).pName(person.getPName()).build(),
Person.builder().pid(person.getPid()).pName(person.getPName()).build());
return new Result(personList);
}
//添加员工信息
@PostMapping("/param")
public Result<List<Person>> addByParam(Integer pid,String pName){
List<Person> personList = Arrays.asList(Person.builder().pid(pid).pName(pName).build(),
Person.builder().pid(pid+1).pName(pName).build());
return new Result(personList);
}
}
步骤:
- 创建一个线程组
- 取样器里选择HTTP请求进行创建,用于发送HTTP请求
- 增加消息头组件,用于指定数据传输格式
- 增加观察树用于观察返回结果
2.3 Param请求参数
1.http请求发送,参数和消息体数据,只能二选一,文件上传不受影响
2.参数注意空格
2.4 HTTP请求默认值
若有多个HTTP请求,他们之间其实有相同的参数,那么我们可以把这些参数都放到一个http请求默认值里,那么后面的HTTP请求就不用再重复设置,如图:
2.5 结果树
1.可以选择不同的方式进行展示,比如text、json,每种具体查看方式,可以以后用到再看
2.完整的请求参数信息,我们可以通过“请求”这个去查看
2.6 HTTP信息请求头
需要cookie、token、编码格式指定等信息的时候,可以使用该组件来传递
注意:
1.若请求头放到线程组下面,那么对所有的取样器都会生效,若请求头放在某个取样器下面,那么只对这个取样器生效
2.7 断言
**断言:**验证服务器返回的数据是否满足我们的要求 即LR中的检查点,是对响应结果做一个判断,我们在请求一个网址时会有返回数据,那怎么判断请求是正确的呢,就需要对某一字段或内容进行匹配,如果跟预想的一样就认为请求是正确的,否则是失败的
使用断言的目的:在request的返回层面增加一层判断机制(因为request成功了,并不代表结果一定正确)
如上图,当断言成功,那么会打印这个http请求名称,当不成功,会打印原因出来
还有其他的断言判断器,比如xpath等,这个等后续用到再说
2.8 用户自定义变量
添加》配置原件》用户定义变量
变量引用: ${变量名}
2.9 请求参数化
2.9.1 参数化txt、csv
test.txt文件内容如下:
添加》配置元件》CSV数据文件设置
引用
2.9.2 参数化函数
工具》函数助手对话框
只看到这里
2.10 脚本录制
web脚本录制:
1.jmeter里增加代理服务器,启动(启动的时候,会让安装证书,点击安装),如图:
2.浏览器设置代理服务器 端口:8888,ip:127.0.0.0
3.在网页上登录,操作后,就可以在代理服务器有个线程组,里面就可以列举我们在网页上操作的url
4.然后手动去掉一些无用的url
手机脚本录制:
1.同web
2.手机和jmeter必须连同一个wifi,然后在手机设置里设置代理,IP是jmeter所在主机的IP
3.操作手机app即可
注意:若是脚本录制,最好以bat脚本方式启动,若是直接以jar启动,那么录制可能失败
2.11 数据库操作
后续用到再写
2.12 压力测试
后续用到再写
3.参考地址
1.官网地址