learn-tech/专栏/说透性能测试/01JMeter的核心概念.md
2024-10-16 10:26:46 +08:00

208 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

因收到Google相关通知网站将会择期关闭。相关通知内容
01 JMeter 的核心概念
从今天开始,我们将进入模块一的学习,在学习的过程中,希望你能够明白为什么 JMeter 要这么用并掌握 JMeter 的一些进阶用法。这一讲作为我们学习的第一讲,我将带你了解 JMeter 的核心概念,完善你对测试工具的认识。
为什么是 JMeter
性能测试有很多工具JMeter、Loadrunner、Locust、nGrinder 都不乏粉丝。有人认为做性能测试重要的不是工具,是思想。但从学习实践的角度讲,工具在一定程度上决定了工作效率及协作模式。要成为一名测试专家,对工具一定是要精通的。
JMeter 原生的方式只支持单点工作,团队成员并不能很方便地互相检查脚本和查看报告。如果我们想改变这样的协作方式,就要对 JMeter 进行改造。如果不了解工具,改造也就无从谈起。
说了这么多,那我为什么会选择介绍 JMeter 呢?总的来说,它有以下 3 点优势。
开源免费、安装简易、多系统兼容。相对于 LoadrunnerJMeter 没有版权的困扰,脚本可以在 Windows、Linux、Mac 任意系统间切换,非常简单方便。
丰富的基础插件。相对于 LocustJMeter 提供了较多的插件可以减少重复造轮子的工作。Locust 的基础功能需要写代码实现,更适合定制性较强的测试场景,如游戏类测试,在敏捷化的测试团队中需要考虑到这部分的时间成本问题。
良好的拓展性。虽然 JMeter 已经有了丰富的基础插件,它本身还是提供了入口进行二次开发,以满足团队定制化的需求。同样,你也可以将 JMeter 平台化,通过平台化的操作来管理 JMeter增强测试团队的协作性。
我们虽然是从 JMeter 工具开始的,但网上其实已经提供了很多实例来教你 JMeter 的基础使用,所以这一讲的重点是帮你厘清 JMeter 设计上的一些核心理念。我将从 3 个方面来介绍分别是线程、循环、Ramp-Up组件和元件以及分布式压测。
我们先来看线程、循环、Ramp-Up。
线程、循环、Ramp-Up
这是你在 JMeter 的线程组元件中的线程属性,线程组建立是你使用 JMeter 进行性能测试最基础的步骤,压力发起策略几乎都依赖于这个元件。
线程与循环
我们先来看两张图,看看它们之间有什么区别。
图 1设置图 A
图 2设置图 B
从两张图的对比中,我们可以看到图 1 和图 2 的区别在于线程数和循环次数,一个是 1 和 10一个则是 10 和 1。从结果来看图 1 和图 2 都是发送了 10 个请求,那它们的核心区别是什么呢? 我们不妨来看两段代码演示。
先来看图 1 的代码演示:
for(int j=0;j<10;j++) {
System.out.println(Thread.currentThread().getName());//打印线程名字
}
这段代码我使用线程循环的方式打印运行线程的名字运行后的内容如下
Thread-0
......
Thread-0
Thread-0 //可以看到是基于同一个线程
再来看图 2 的代码演示
for(int i=0;i<10;i++){
new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName());
}
}).start();
} //示意代码
这段代码我是使用多线程的方式打印正在运行的线程运行后效果如下
Thread-0
......
Thread-8
Thread-9 //不同的线程
以上代码内容主要是打印线程的名字不难看出循环的方式是基于同一个线程反复进行 10 次操作而多线程则启动了 10 个不一样的线程虽然都是向服务器发送了 10 次请求但这两种方式完成的时间和对系统的压力也完全不一样
打个比方我们需要掰 100 斤玉米一组是 10 个人一起掰一组只有 1 个人掰每个人的速度如果是一致的不用想就知道哪个组更快这样的场景经常发生在使用 JMeter 利用接口造数据时同样是造 1 万条数据如果你觉得速度很慢那你就可以考虑一下多线程了但掰玉米用 10 个人的成本当然要比用 1 个人来得多我们的压力场景也是这样的通常压力场景都是多线程的线程的多少也直接决定了对被测系统压力的大小
Ramp-Up
Ramp-Up 其实是一个可选项如果没有特殊要求保持默认配置脚本即可如果填 1代表在 1 秒内所有设置线程数全部启动不过这个是理论上的实际启动时间也依赖于硬件的接受程度如果硬件跟不上启动时间自然也会增加
在有的性能测试场景中如果你不想在性能测试一开始让服务器的压力过大希望按照一定的速度增加线程到既定数值你就可以使用这个选项比如我想用 10 个线程进行测试启动速度是每秒 2 个线程就可以在这里填 5如下所示
3设置图 C
我们来通过运行展示一下
4生成线程数
我使用了监听器中的用表格查看结果插件通过这组数据可以看到每秒产生了 2 个新的线程合计在 5 秒内完成
组件和元件
了解了线程循环和 Ramp-Up接着来聊聊组件和元件
组件和元件的关系
要解释组件首先就要说元件我们看图 4 中的 HTTP 请求其实这就是一个实际的元件同样作为元件的还可以是 JDBC 请求Java 请求等这一类元件我们统一称为取样器也就是组件我用一个示意图来表示组件和元件的关系
5组件和元件关系图
如图所示HTTP 请求JDBC 请求等元件都从属于取样器
组件的作用
JMeter 有多种组件我们重点看下这七类 配置元件取样器定时器前置处理器后置处理器断言监听器我们来看下它们各自的作用
配置元件用于初始化变量以便采样器使用类似于框架的配置文件参数化需要的配置都在配置元件中
取样器承担 JMeter 发送请求的核心功能支持多种请求类型 HTTPFTPJDBC 也可以使用 Java 类型的请求进行自定义编写
定时器一般用来指定请求发送的延时策略在没有定时器的情况下JMeter 发送请求是不会暂停的
前置处理器在进行取样器请求之前执行一些操作比如生成入参数据
后置处理器在取样器请求完成后执行一些操作通常用于处理响应数据从中提取需要的值
断言主要用于判断取样器请求或对应的响应是否返回了期望的结果
监听器监听器可以在 JMeter 执行测试的过程中搜集相关的数据然后将这些数据在 JMeter 界面上以树报告等形式呈现出来不过图形化的呈现非常消耗客户端性能在正式性能测试中并不推荐使用
组件的顺序
了解正确的组件执行顺序可以帮助你明白在什么情况下应该添加什么组件而不会添加错误的组件造成不必要的麻烦我将它们做了一个排序如下图所示
6组件顺序
搞懂了组件顺序你在测试前准备脚本生成参数化数据时就可以在前置处理器中寻找相关元件在要提取接口返回的数据就可以在后置处理器中寻找相关插件而不是在其他地方寻找数据浪费时间
我经常看到有的测试人员在需要在后置处理器中使用 BeanShell PostProcesor 的时候错误地用了前置处理器中的 Beanshell PreProcessor导致系统报错无法实现预期的功能甚至是测试无法进行下去
元件作用域
以上说的都是组件相关的东西这里就来看看元件作用域我们先来看一张图
7结果树 123
在图中可以看到我在不同位置放了 3 个一样的元件查看结果树为了方便区分我分别标记了 123运行后发现查看结果树 1 8里面显示了 HTTP1 HTTP2而插件结果树 2 里只有 HTTP1查看结果树 3 里面只有 HTTP2
8查看结果树 1 的显示图
这是为什么呢这就要说到元件作用域了
通过截图可以发现 JMeter 元件除了从上到下的顺序外有还具备一定的层次结构比如图 5 中的响应断言和查看结果树它相对于取样器存在父子组件的关系说白了就是 HTTP 元件对取样器有效的区域比如查看结果树 2 HTTP1 请求的子节点那它就只对 HTTP1 生效如果父节点是测试计划那就会对测试计划下的 HTTP1 HTTP2 都生效
分布式压测
压测就是 JMeter 通过产生大量线程对服务器进行访问产生负载监听服务器返回结果并进行校验在大部分情况下用单台 JMeter 进行性能测试或者自动化测试是可行的但在多线程运行过程中可能存在性能瓶颈很多人在排查定位问题时经常会漏掉这一点
从我的工作经验出发单机的 JMeter 最好将线程数控制在 1000 以内如果超过了 1000 线程则建议使用 JMeter 分布式压测这在一定程度上可以解决 JMeter 客户端自身形成的瓶颈问题
在分布式 JMeter 架构下JMeter 使用的是 Master Slave
Master
Master 负责远程控制 Slave负载机分布式通常有多个 JMeter 节点其中一个节点承担 Master 的作用Master 通过发送信号控制节点机的启动和停止并进行收集节点机的数据等操作
Slave
Slave 一般也叫负载机主要是发起线程来访问 target 服务器一般在 Slave 节点机上先启动代理 jar 控制机远程连接负载机运行脚本后对 Master 回传数据流程示意图如下
9Slave 流程示意图
JMeter Master Slave 配置也比较简单 JMeter bin 目录下的 jmeter.properties 文件配置IP Port Slave 机的 IP 以及默认的 1099 端口如下所示
remote_hosts=ip:1099,ip:1099
Slave 启动 jar 包之后默认会启动 1099 端口Master 配置完成启动后便可以建立和 Slave 连接从而进行控制和收集等操作
一般来说JMeter 分布式压测都是作为缓减客户端瓶颈的重要方式这里我要强调缓减因为在性能测试领域中不存在一种技术手段能够保证永远没有问题随着公司的体量发展对性能的要求也是水涨船高JMeter 自带的分布式压测作为一种缓解客户端性能问题的方式并不是万能法则
总结
本讲我主要讲解了 JMeter 的核心设计理念希望能够让你能对 JMeter 的核心概念有一定的理解JMeter 作为目前最流行的性能测试工具它本身提供的插件可以满足绝大多测试场景的使用并且它也提供了二次开发的接口和 API使用起来非常灵活同时它分布式的使用方式也能够让你在较大程度上缓减客户端瓶颈