• 【测试沉思录】21. 如何用 JMeter 编写性能测试脚本?


    作者:宋赟 编辑:毕小烦

    Apache JMeter 应该是应用最广泛的性能测试工具。怎么用 JMeter 编写性能测试脚本?

    1. 编写 HTTP 性能测试脚本

    STEP 1. 添加 HTTP 请求

    img

    STEP 2. 了解配置信息

    HTTP 请求各项信息说明(以 JMeter 5.1 为例)。

    如下图所示:

    img

    • Web服务器: 指定协议、HTTP 请求的主机地址和端口号,不需要加上“http://”,JMeter 会自动加上,一般的 Web 服务端口号默认是 80,如果你访问的地址中带有其他端口号在此填入,协议根据目标地址实际情况填入 httphttps
    • 客户端实现: 实现里面有 HttpClient4Java 两个选项。HTTPClient4 可以看成是一个没有界面的浏览器,可以通过它高效的访问Http协议的资源;Java 选项是使用 JDK 提供的 net 包中的工具类来访问。
    • 方法: 下拉列表中有 8 个选项,我们常用的是 POST 和 GET。GET 是提交请求时将参数连接在浏览器地址栏,且长度有限制(1 MB 以内);POST 提交请求没有长度限制,用户一般也看不到提交的内容,相对来说安全些,其他相关选项请大家自行参考 HTTP 协议。
    • 路径: 除去主机地址部分的访问链接。
    • 内容编码: 字符编码格式,默认是 iso8859,一般写成 UTF-8 即可,当然也可以和开发人员确认。
    • 自动重定向: 自动重定向可以自动转向到最终目标页面,但 JMeter 是不记录重定向过程内容的,勾选了这一项后,【跟随重定向】则会失效,且无法做关联。
    • 跟随重定向: HTTP 请求的默认选项,当响应 code3xx 时,自动跳转到目标地址。与自动重定向不同,JMeter 会记录重定向过程中的所有请求响应,在查看结果树中可以看到服务器返回的内容,选了这个可以对响应内容做关联。
    • 使用 KeepAlive: HTTP 请求的默认选项,对应 HTTP 响应投中的 Connection:keep-Alive
    • 对 POST 使用multipart/form-data: 这个属性是和方法 POST 绑定的,一般文件上传时会用到它。
    • 与浏览器兼容的头: 浏览器兼容模式,若选了【对 POST 使用 multipart/form-data】,建议也勾选此项。
    • 同请求一起发送参数: 填要发送的参数和值的区域,参数项是以 key 和 value 形式填写,消息体数据是以JSON 格式填写,文件上传项需要填写文件名称、参数名称和 MIME 类型,如果你不知道 MIME 类型,可咨询开发人员或使用抓包工具查看。

    填好以上这些选项后,HTTP 单接口就准备的差不多了,这里给 GET、POST、文件上传三个示例图,供参考。

    1. GET 请求 + 参数

    img

    1. POST 请求 + 消息体数据

    img

    1. POST 请求 + 文件上传

    img

    STEP 3. 响应断言

    脚本制作原则里有说到每个请求必须要有响应断言,是因为若对接口返回不做判断的话,我们无法判断请求的有效性,从而无法评估出性能测试的真实性,故每个请求必须要有响应断言。接下里我们看看响应断言。

    断言是通过获取服务器响应数据,再根据断言规则去匹配这些响应数据;若匹配到了是正常现象,不会进行任何提示,若匹配不到,JMeter 则会断定这个请求失败,在后面调试脚本中我们会看到查看结果树中的请求名称是红色字体。断言组件有很多,我这里讲到的响应断言基本能满足 80% 以上的断言需求。

    首先,我们增加断言,在请求名称上右键->添加->断言->响应断言:

    img

    再说说响应断言中一些参数的意义:

    img

    • 名称和注释: 可以随意设置,最后有业务意义。

    • Apply to: 应用范围,有 4 个选项

      • Main sample and sub-samples: 匹配范围包括当前父取样器并覆盖子取样器
      • Main sample only: 匹配范围是当前父取样器
      • Sub-sample only: 仅匹配子取样器
      • JMeter Variable: 支持JMeter变量值进行匹配
    • 测试字段:对响应数据的不同部分进行匹配,有 7 个选项。

      • 响应文本: 返回的文本内容
      • 响应代码:返回的响应代码,例如http请求返回code为【200】代表成功
      • 响应信息: 返回的响应信息,例如服务端返回【sucess】或【0000000】等字样
      • 响应头: 返回响应中的头信息
      • 请求头: 请求的头信息
      • URL样本: 匹配URL链接
      • 文档(文本): 对文档内容进行匹配断言
      • 忽略状态: 一个请求有多个响应断言,当第一个响应断言失败时忽略此断言,继续进行下一个断言,若下一个断言成功了可以判定该请求是成功的。
      • 请求数据: 匹配请求的数据

    STEP 4. 调试脚本

    写好脚本后,接下来是调试脚本,JMeter 一般是结合察看结果树来调试脚本,可以从察看结果树元件中看到服务器的返回信息。察看结果树会显示取样器的每一次请求,若是有大量的请求,在压测时建议关闭,否则会比较消耗压测机资源。

    察看结果树这元件一般只用来调试脚本,这里也大概科普下察看结果树各项参数用途。

    img

    • 名称: 自定义内容,默认为察看结果树,可为空。
    • 注释: 默认为空,可以为空,自定义内容。
    • 所有数据写入一个文件: 可以将结果保存,这里是一个路劲地址。
    • Text 下拉列表: 显示请求内容的形式列表,这个下拉列表里有 Text、Xpath Tester、JSON 等。
    • 取样器结果: 显示取样器结果,这里的信息和浏览器上展示的内容差不多。
    • 请求: 展现请求表单内容,不同的取样器有不同显示格式。
    • 响应数据: 显示服务器响应数据,分为 Response Body 和 Response headers,提供了查询功能,也可以区分大小写查询和正则表达式查询。

    2. 编写 Dubbo 性能测试脚本

    STEP 1. 将我们自己实现的请求 Dubbo 的服务打成 jar 包放到 JMeter/lib/ext 目录下。

    STEP 2. 打开 JMeter,添加线程组,在线程组中添加 Java 请求。

    img

    STEP 3. 在 Java 请求中类名称中选择自己上传的类,在参数栏填入相关参数内容。

    img

    STEP 4. 对 Java 请求增加相应断言以及通过察看结果树调试脚本,和 HTTP 脚本一致,不再赘述。

    3. 编写性能测试脚本的参考规范

    代码有编码规范,写脚本也有规范,比较推荐的规范是:

    • 脚本中只能有一个测试计划。 JMeter 脚本在客户端界面中展示的树型结构,测试计划是根节点,根节点只能是一个。
    • 测试计划中至少有一个线程组。 JMeter 执行压测都是从线程组发起的,所以测试计划中至少要有一个线程组,另外 JMeter 支持多个线程组。
    • 至少要有一个取样器。 脚本中若无取样器则是一个空脚本,无法模拟用户请求,无任何执行意义。
    • 每个取样器必须有断言。 无断言则无法判断请求是否成功,更无法判断压测有效性。
    • 至少要有一个监听器。 非命令行执行脚本时,需要查看执行结果,则会需要有聚合报告等监听器;若使用命令行执行脚本时,则可生成结果文件。监听器是用来展示执行结果,而执行结果则是用来分析系统性能的。
    • 非调试时禁用察看结果树。 察看结果树一般是用来调试脚本的,但压测时使用的话,大量的请求返回数据会消耗压测机资源,可能导致压力机性能下降。
    • 减少使用不必要的插件。 JMeter 插件是很丰富,但使用不当会影响 JMeter 本身性能,从而导致压力机自身成为压测瓶颈,比如使用监控插件,大量的服务器资源采集会影响压测机的磁盘 IO 及消耗压测机其他资源。

    遵循这些规则可以让我们养成良好的习惯,避免不必要的错误。

    总结

    本文简单介绍了编写 HTTP 和 Dubbo 性能测试脚本的步骤,并且给出了性能测试脚本的参考规范,希望对大家有帮助。

    (完)

    如果文章对你有帮助,记得留言、点赞、加关注哦!

  • 相关阅读:
    阿里大牛总结的Netty手册,面试再也不怕被问Netty了,奥利给
    Nodejs+vue体育用品商城商品购物推荐系统_t81xg
    使用.NET简单实现一个Redis的高性能克隆版(四、五)
    什么是鉴权?这些postman鉴权方式你又知道多少?
    如何使用腾讯云GPU云服务器搭建训练 ViT 模型?
    python数据分析基础(1)
    嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第五天-ARM Linux编程之自动创建节点 (物联技术666)
    Scrapy与分布式开发(2.2):正则表达式
    Unity vscode 不能查看引用 没有智能提示
    Linux日志管理logrotate日志轮转
  • 原文地址:https://blog.csdn.net/wirelessqa/article/details/128200564