使用Jmeter压测HTTP、TCP请求

  • Post author:
  • Post category:其他




1、Jmeter 是什么?

Jmeter 是一个开源的测试工具,由 Apache 软件基金会开发,它是一个纯 Java 应用程序,用于负载测试、功能测试和性能测试,它是由 Apache 软件基金会开发的一个开源软件。它可以模拟许多不同类型的负载,并且可以用于测试不同类型的应用程序,包括 Web 应用程序、数据库服务器、FTP 服务器、邮件服务器等。JMeter 可以帮助测试人员和开发人员在测试过程中识别应用程序的瓶颈和性能问题,以及分析应用程序的性能。



2、如何下载?


点击下载 Jmeter 5.5 版本

,也可以自行访问官网下载页选择合适的 Jmeter 版本:https://jmeter.apache.org/download_jmeter.cgi



3、Jmeter 语言切换为中文简体



3.1、下载完成后解压压缩包

在 bin 目录下双击 jmeter.sh 可执行文件,Windows 系统的同学双击 jmeter.bat 文件启动。



3.2、切换语言

在菜单栏 Options 中选择 Choose Language 然后选中 Chinese (Simplified) 即可完成切换。



4、测试 HTTP 请求



4.1、添加线程组

线程组相当于一组测试请求的集合,当启动时,可以将组下面定义的所有请求并行进行测试。



4.2、配置线程组

实际上就是配置测试的请求次数,像如下的设置代表 10 秒内将会准备 100 个线程发起请求,只循环 1 次,如果循环次数勾选了永远,将会已 100 个请求 /10 秒一直循环下去。



4.3、添加 HTTP 请求取样器



4.4、GET 请求配置



4.5、POST 请求配置

同样也是先添加 HTTP 请求取样器再设置请求接口和请求参数。



4.6、添加监听器

监听器的作用就是获取测试结果,可以添加不同类型的监听器从多个维度分析请求结果。



4.6.1 添加查看结果树监听器

作用是可以单独查看每次请求的测试结果



4.6.2 添加聚合报告监听器



4.7、开始测试

点击启动后会弹出一个是否需要保存这个测试计划,点击 Yes 的话需要指定保存的磁盘位置,下次测试可以直接读取保存的文件家在测试计划,如果不需要保存点击 No 即可。



4.8、查看测试结果

可以看到我启动时线程组定义的是 10 个线程数,执行 1 秒。所以两个请求取样器每个发起 10 个请求,一共是 20 个请求结果。

查看结果树的报告中可以单独点击某一个请求查看请求结果,是根据发起请求的时间来升序排列的,点击单个请求后在右侧可以查看取样器结果、请求内容、响应内容。

为什么 Post 请求全部失败了呢?因为只要响应状态码不是 2xx 代表操作被成功接收,Jmeter 则认为此次请求是失败的。我们可以看一下响应内容报的是什么原因。

可以看到响应体提示不支持的 Media Type (

媒体类型

用于声明随之而来的数据的格式。又称:MIME 类型、MIME Type、Content Type。 是一种用于在异构系统、网络之间传递信息时时声明其格式的方法。),所以有开发经验的同学会注意到,我们的请求体内容没有设置 content-type,默认是 application/x-www-form-urlencoded ,这是浏览器原生的 form 表单类型,或者说是表单默认的类型。我们的请求体是 JSON 字符串格式,需要设置一下 content-type 为 application/json。而设置 content-type 是一个属性,而且我们要指定的请求内容的类型,所以需要添加一个 HTTP 信息头管理器。

添加后就可以将 content-type 设置好,顺便说一句,如果接口设置了身份校验,需要请求头中携带 token 信息,也可以在这一并设置。

添加后,启动测试,发现接口响应成功。

查看聚合报告,聚合报告中对测试的请求进行了区分统计,可以查看到平均的响应时间 (单位均为毫秒)、TP99 的时间,请求异常比例,吞吐量等。

  • Label:请求的名称,就是我们在进行测试的 TCP sampler 的名称
  • Samples:总共发给服务器的请求数量
  • Average:单个请求的平均响应时间,单位是毫秒
  • Median:50% 的请求的响应时间
  • 90%Line:90% 的请求的响应时间
  • 95%Line:95% 的请求的响应时间
  • 99%Line:99% 的请求的响应时间
  • Min:最小的响应时间
  • Max:最大的响应时间
  • Error%:错误率 = 错误的请求的数量 / 请求的总数
  • Throughput:吞吐量即表示每秒完成的请求数
  • Received KB/sec:每秒从服务器端接收到的数据量
  • Sent KB/Sec:每秒从发送到服务器端的数据量



5、测试 TCP 请求



5.1、添加 TCP 请求取样器



5.2、TCP 取样器配置说明

TCPClient classname:



  • TCPClientImpl


    :以文本编辑器中所编辑的纯文本为内容进行发送,默认为这种


  • BinaryTCPClientImpl


    :以文本编辑器中所编辑的 16 进制字符(hex)内容为基础转换为二进制的 字节内容进行发送。


  • LengthPrefixedBinaryTCPClientImpl


    :在 BinaryTCPClientImpl 基础上默认以发送内容的长度为字节前缀进行填充, 数据包中前 2 个字节为数据长度。可在 bin/jmeter.properties 配置文件中 tcp.binarylength.prefix.length 设置。



Target Server


:TCP 采样器中填写服务器地址、端口。



Connect


:设置连接超时时间。



Response:


设置响应超时时间。



Re-use connection:


表示重复使用该连接发送请求。



Close connection:


表示每次发送完该条数据后,关闭连接。



End of line(EOL) byte value:


终止符。

比如项目中返回值转为 16 进制的时候如下: 7e800100050100019040011000000003010201447e 那么最后一个字节(8 位)应该是 7e 换算为 10 进制后为 126,那么在 eol 处设置为 126。

注意:终止符为一个字节,16 进制数大于 7F(127) 后,该 EOL 值为负数。

比如:如果服务器返回最后一个字节为 80,按单字节换成十进制为 -128,EOL 处的值要填写 -128。

如果响应内容不是 16 进制内容,是普通文本的话,就是最后一个字节对应的 ASCII 码。



5.3、开始测试并查看结果

可以看到响应状态码都是 500,代表响应发生错误,并且异常消息为:Response message:org.apache.jmeter.protocol.tcp.sampler.ReadException: Error reading from server, bytes read: 32,

但是查看响应数据发现实际上是响应成功了的,返回了正确的响应数据结果,其实原因是这个异常是 jmeter 自身抛出来的,我们都知道 TCP 请求不像 HTTP 定义了 1xx、2xx 这类的响应状态码,那是什么原因导致出现了异常呢?

答案是我们没有配置


End of line(EOL) byte value:


终止符,导致 jmeter 认为响应内容不完整从而抛出 ReadException。 我们的响应数据最后一位字节是 1 ,对应的 ASCII 码 是 49。所以我们去设置一下再启动测试。

最终测试结果:



版权声明:本文为weixin_45795312原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。