云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

架构大牛说:Web性能测试解决方案:JMeter

jxf315 2025-09-06 03:08:35 教程文章 6 ℃

问题描述

在代码写好之后,通常需要对场景进行性能测试,例如购买商品场景、登录场景、支付场景等,此阶段会出现的典型问题如下:

(1)当前登录场景可能需要调用N个接口,每天高峰期的时候,应用程序可以承受多少人登录。

(2)秒杀系统最多可以让多少人同时单击“购买”按钮而不出现异常。

(3)连续100小时以上的疲劳测试是否会使系统内存出现无法下降、GC无法回收内存、疲劳测试之后CPU无法正常下降等问题。

(4)在并发压力下,应用程序哪里消耗资源过多,需要进行优化?

(5)在复杂场景下,整体接口包含调用逻辑,其中可能包括if-else判断、for/while循环、获取上一个接口的信息传输到下一个接口中等操作,如何简化这部分性能测试的需求?

(6)针对协议如何进行测试?例如HTTP轮询与WebSocket哪个更消耗性能?大概相差多少?(7)当单台压力机无法生成更大的压力时,如何增加压力机?

问题分析与解决方案

针对在节中提出的问题,全部可以通过JMeter解决。JMeter是100%完全由Java编写的对软件进行性能测试的桌面程序,其桌面GUI部分可方便用户用无代码的方式编写性能测试脚本。待测试脚本编写完成之后,通常使用后台启动JMeter的方式运行性能测试脚本(因为GUI消耗资源过多)。

与JMH不同的是,JMeter通常以多个代码单元组合成场景,模拟真正用户进行操作的调用顺序进行测试,其结果更加符合上线后的实际需求。也就是说,JMeter更擅长对项目整体进行测试与优化,而JMH更擅长对代码局部进行测试与优化。

JMeter的特点

JMeter可以对多种协议进行性能测试,包括并不限于HTTP、HTTPS、WS、WSS、TCP、UDP、SOAP和FTP。除此之外,还可以对NoSQL、MySQL、JMS等数据源或容器进行性能测试。

除编写性能测试脚本外,JMeter还支持使用脚本录制的方式进行性能测试,即通过网页代理进行页面上的操作,其操作流程会被直接录制下来,并自动转换成性能测试脚本。此后每次测试时,只需直接使用脚本进行性能测试即可。在JMeter脚本录制的辅助下,再困难的业务逻辑也可以轻松地进行测试。

JMeter具有制作良好的GUI,即便初次接触的人,也可以迅速理解它并进行操作。

JMeter具有各种可插拔的插件,因为JMeter的应用范围较为广泛,所以插件数量庞大。其插件完全由Java语言编写,方便因特殊业务逻辑进行自我扩展。

JMeter包含各种断言、采样器等功能,方便用户在性能测试过程中,获取接口返回值,并对返回值进行参数化处理。例如,在调用接口2时,使用从接口1处返回的数值。

除性能测试外,JMeter在CI/CD领域也可以配合其他工具实现接口自动化测试架构,如JMeter+Ant+Jenkins等。

深入理解JMeter

JMeter中的部分配置元件

取样器(Sampler):取样器是JMeter的基础单元,通常各种协议的请求皆由取样器发起。例如,HTTP请求、FTP请求、JMS发布与订阅、Java请求、LDAP请求、JDBC请求、TCP请求、SMTP请求和WebSocket请求(需下载额外插件)等。

配置元件(ConfigurationElement):配置元件主要对取样器中的各种请求进行辅助配置。例如,HTTP信息头管理器、HTTP缓存管理器、HTTPCookie管理器、JDBC连接配置、LDAP扩展请求、FTP默认请求、TCP取样器配置等。另外,在配置元件中还包含一些与测试计划相关的配置元件,主要包括计数器、用户定义的变量等。

逻辑控制器(Logic Controller):逻辑控制器主要控制JMeter脚本的执行顺序。例如,从接口1处请求得到的结果,经过逻辑控制器判断之后,会控制执行到接口2或接口3。逻辑控制器的存在使得整体测试的灵活度更高。逻辑控制器中主要包含if控制器、事务控制器、循环控制器、While控制器、临界部分控制器、ForEach控制器、仅执行一次控制器、吞吐量控制器和Switch控制器等。

前置处理器(Pre-Processor):在执行取样器之前,需执行前置处理器。前置处理器主要包括HTML链接解释器、HTML URL重写修饰符和取样器超时等。

后置处理器(Post-Processor):在执行取样器之后,需执行后置处理器。后置处理器主要包括CSS/JQuery提取器、JSON提取器、边界提取器、BeanShell断言和正则表达式提取器等。这些后置处理器在提取数据之后,可对上一个请求得到的结果进行参数化,并传输到下一个请求中。

断言(Assertion):断言可用来验证服务器返回的数据与预期是否相符,如果不相符,可以记录或停止测试计划。断言主要包括响应断言、JSON断言、大小断言、HTML断言、XML断言和BeanShell断言等。

定时器(Timer):在测试计划执行过程中,定时器主要用来减缓线程运行。例如,线程在请求接口1执行之后,需暂停若干ms之后再请求接口2。定时器主要包括固定定时器和随机定时器等。

监听器(Listener):监听器主要用来收集测试结果报告。监听器主要包括:察看结果树、断言结果和聚合报告等。另外,在下载插件之后,还可以监听被测试端机器的CPU和内存等信息。

JMeter的功能繁多,本章内容仅为抛砖引玉。JMeter除自身所带功能外,还可通过添加jar包的方式,增加更多的配置元件、请求方式等。若某些测试场景连扩展功能都无法满足,则可自行编写Java程序对接的JMeter接口,生成jar包,并在JMeter中当作扩展的配置原件进行使用。

JMeter参数化的实现方式

JMeter参数化的实现方式如下:

o JMeter函数:JMeter函数指GUI界面→工具→函数助手对话框中JMeter自带的函数内容,主要包括Random(随机数字)、RandomString(随机字符串)、RandomDate(随机时间)、splt(字符串拆分)、property(自定义数值)、UUID和char等。

o JMeter读取外部文件:读取外部配置文件的方式较多,包括JMeter函数 中 的 StringFromFile ( 从 文 件 中 读 取 字 符 串 ) 、 配 置 元 件 中 的CSVDataSetConfig(从CSV文件中读取配置信息)等。

o JMeter提取上一个接口返回值:通常通过后置处理器中的BeanShell断言、JSON提取器和正则表达式提取器等方式提取相应返回值。

JMeter在提取数据后,需要在HTTP请求脚本中通过${变量名称}的形式使用参数化变量,并且除请求body外,在任何地方都可以使用变量名称。例如,路径、服务器名称或IP地址、端口号、协议和编码等。


Tags:

最近发表
标签列表