性能测试

性能测试是一种检查软件、应用或系统在特定负载下表现的方法。简单来说,就是看看它们能不能承受一定的工作量,并且还能正常运作。

相关术语

  • 并发用户:在性能测试工具中,一般称为虚拟用户(Virtual User,简称VU),指的是现实系统中操作业务的用户。

  • TPS:Transaction Per Second,每秒事务数,是衡量系统性能的一个非常重要的指标。

  • RPS:Request Per Second,每秒请求数。RPS模式适合用于容量规划和作为限流管控的参考依据。

  • RT:Response Time,响应时间,指的是业务从客户端发起到客户端接收的时间。

  • QPS (Queries Per Second):每秒执行的查询次数。例如,如果一个网站的首页每秒可以响应 100 次用户请求,则该页面的 QPS 为 100。

在性能测试中,通常有两种施压模式:并发模式和RPS模式。传统方式是使用并发用户数来衡量系统的性能(站在客户端视角)。此方法一般适用于一些网页站点的压测(例如H5页面);而RPS(Requests per second)模式主要是为了方便直接衡量系统的吞吐能力TPS(Transaction Per Second,每秒事务数)而设计的(站在服务端视角),按照被压测端需要达到TPS等量设置相应的RPS,应用场景主要是一些动态的接口API,例如登录、提交订单等等。

易混点

  • TPS vs. QPS:

    • TPS 关注的是整个业务流程的完成情况,例如完成一笔订单交易。

    • QPS 更加细化,专注于单个数据库查询或 API 调用的速度。一个TPS可能包含多个QPS。

  • QPS vs. RPS:

    • QPS 通常特指数据库查询的频率,API 接口的调用速率。

    • RPS 是指 HTTP 请求的频率,可以包括GET、POST等不同类型的操作。

  • TPS vs. RPS:

    • TPS 关注的是业务层面的事务处理速度。

    • RPS 则是针对 HTTP 协议的请求处理速度,通常比 TPS 更加频繁。

VU和TPS换算
公式描述:TPS=VU/RT,(RT单位:秒)。

举例说明:假如1个虚拟用户在1秒内完成1笔事务,那么TPS明显就是1。如果某笔业务响应时间是1 ms,那么1个虚拟用户在1s内能完成1000笔事务,TPS就是1000了;如果某笔业务响应时间是1s,那么1个虚拟用户在1s内只能完成1笔事务,要想达到1000 TPS,就需要1000个虚拟用户。因此可以说1个虚拟用户可以产生1000 TPS,1000个虚拟用户也可以产生1000 TPS,无非是看响应时间快慢。

如何获取VU和TPS

  • VU获取方式:

已有系统:可选取高峰时刻,在一定时间内使用系统的人数,这些人数可认为是在线用户数,并发用户数可以取10%,例如在半个小时内,使用系统的用户数为10万,那么取10%(即1万)作为并发用户数基本就够了。

  • TPS获取方式:

已有系统:可选取高峰时刻,在一定时间内(如3分钟10分钟),获取系统总业务量,计算单位时间(秒)内完成的笔数,乘以25倍作为峰值的TPS,例如峰值3分钟内处理订单18万笔,平均TPS是1000,峰值TPS可以是2000~5000。

Apache JMeter是Apache组织开发的基于Java的压力测试工具。Apache JMeter具备如下特性:

  • 支持分布式施压。

  • 支持图形化界面,且支持流程编排,同时支持断言、逻辑控制器等高级指令,可满足复杂业务压测需求。

  • 扩展性强,开发、测试人员可通过编写自己的插件,满足各种压测需求。

  • 技术生态好,有强大的开源社区支持,开发者活跃度高。
    支持查看资源监控、性能报告,但可查看的监控和报告指标较少。

  • 基于并发模型,受限于JVM,单机无法支持超高并发。且只支持并发施压模型,不支持吞吐量施压模型。

  • 开源支持的分布式能力无法大规模应用到生产环境,部署成本高。

  • 不支持测试用例管理、压测脚本管理等功能。

Jmeter介绍

JMeter 是 Apache 组织开发的一个开源的性能测试工具,主要用于对Web应用进行功能测试和性能测试。它最初是为了进行软件性能测试而设计的,但随着时间的发展,它的功能已经扩展到可以支持多种协议的测试,包括 HTTP、HTTPS、FTP、JDBC、JMS、SMTP 等。

主要特性如下:

  • 多协议支持: JMeter 可以用来测试各种协议的应用程序,这使得它成为一个非常灵活的工具,适用于多种场景。

  • 负载测试和压力测试: 它能够模拟大量用户并发访问,用于评估系统的性能和稳定性。这对于识别系统瓶颈和优化系统至关重要。

  • 可扩展性: 通过插件和脚本,JMeter 可以扩展其功能,以适应更复杂的应用环境和测试需求。

  • 结果分析: JMeter 提供了丰富的图表和报告功能,帮助用户直观地理解测试结果,包括响应时间、吞吐量、错误率等关键指标。

  • 脚本录制与回放: 使用 JMeter 的代理服务器功能,可以轻松地记录用户的浏览器操作,生成测试脚本,然后进行自动化测试。

  • 分布式测试: 支持在多台机器上进行分布式测试,从而模拟更大的负载,测试大规模并发情况下的系统表现。

  • 跨平台: JMeter 是基于 Java 编写的,因此可以在任何安装了Java运行环境的平台上运行。

  • 免费开源: 作为 Apache 项目的一部分,JMeter 是完全免费且开源的,这意味着用户不仅可以使用它,还可以修改和扩展其功能。

  • 社区支持: 拥有活跃的开发者和用户社区,提供持续的支持和更新,以及大量的教程和资源。

  • 易于学习和使用: 尽管功能强大,但 JMeter 的界面直观,对于初学者来说相对容易上手。

下载Jmeter

访问 Jmeter 官网:https://jmeter.apache.org/download_jmeter.cgi ,如下图所示,下载页中提供了各个系统的压缩包,这里是 Windows 系统,点击下载 .zip 后缀的压缩包。

Loading

下载完成后,右键解压,无需安装即可使用。

启动Jmeter

进入 /bin 文件夹下,如下图所示:

Loading

  • Windows 系统,双击 jmeter.bat 启动 Jmeter;

  • Linux、Mac 系统,进入到 /bin 文件夹下,执行如下命令启动:

sh jmeter.sh

主题修改

启动成功后,界面如下图所示,默认是暗黑主题,若想修改主题,点击 Options | Look and Feel, 有多种主题可供选择

Loading

如果喜欢明亮主题,勾选 Metal 即可,然后重启即可应用最新的设置。

语言设置
Jmeter 默认的语言是英文,如果想修改为中文,有两种方式。

临时设置
一种是临时性的设置,点击菜单 Options | Choose Lanuage | Chinese(Simplified), 即可设置为简体中文。这种方式有个弊端,当重新打开 Jmeter 后,设置就会失效,必须得重新设置。

永久设置
要想永久设置 Jmeter 的语言为中文,可进入到 /bin 目录下,找到 jmeter.properties 配置文件:
编辑它,将语言设置项的注释放开,并修改为 zh-CN 。

Jmeter 压测 K-V 存储服务接口

在测试计划上 右键 | 添加 | 线程 | 线程组

解释一下线程组的作用:

  • 模拟用户行为: 线程组用于模拟多个用户同时访问服务器或应用程序。每个线程代表一个虚拟用户。

  • 控制并发数: 线程组允许你指定同时运行的线程数量,即虚拟用户的数量。这有助于模拟不同级别的并发负载,从而评估系统的性能和稳定性。

  • 设置循环次数: 在线程组中,你可以设置采样器的执行次数。这意味着每个虚拟用户将按照设定的次数重复执行相同的请求序列,这对于长时间的压力测试尤其有用。

线程组添加完成后,为了能够发送 HTTP 请求,还需要在线程组上右键 | 添加 | 取样器 | HTTP 请求

为了能够查看请求接口响应结果,在 HTTP 请求上 右键 | 添加 | 监听器 | 查看结果树

以上都配置完成后,一个简单的 GET 请求就配置好了。

请求结果可以点击 响应数据 | Response Body 来查看

POST 请求

为了能够发送 application/json 请求,还需要为 HTTP 请求右键 | 添加 | 配置元件 | HTTP 信息头管理器

添加一个请求头,Key 值为 Content-Type , Value 值为 application/json

点击 HTTP 请求,为其添加请求入参,点击消息体数据,填写接口的 JSON 入参

运行测试之前,可以对查看结果树 右键 | 清除 , 把之前跑测试的结果全部删除

压测接口:笔记内容新增

Loading

压测接口:笔记内容查询

Loading

Jmeter 线程组间传递 Token

通过 Jmeter 测试接口时,有些接口需要先认证,才能够请求成功的,此时就需要在请求头中设置 Token 令牌。虽然测试的时候,如下图所示,可以编辑 HTTP 信息头管理器,来写死一个 Token 令牌来达到目的。

Loading

新增线程组:用户登录接口

在测试计划上右键,新增一个线程组,并创建用户登录接口的 HTTP 请求。

禁用线程组

我们可以在不想要运行的线程组上右键 | 禁用,以禁止执行该线程组。

JSON 提取器

为了能够提取出返参中的 Token 令牌,需要对 HTTP 请求右键 | 添加 | 后置处理器 | JSON 提取器。

调试后置处理器

为了能够调试 Token 令牌是否提取成功了,可以对 HTTP 请求右键 | 添加 | 后置处理器 | Debug PostProcessor 。

BeanShell 后置处理器

为了能够实现跨线程组传递 Token 令牌,需要在 HTTP 请求右键 | 添加 | 后置处理器 | BeanShell PostProcessor。


性能测试
http://bloomivy.github.io/2025/01/22/性能测试/
作者
Bloom
发布于
2025年1月22日
许可协议