| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发测试 -> Jmeter并发压测 -> 正文阅读 |
|
[开发测试]Jmeter并发压测 |
一.JMeter 的场景配置 1.简单 HTTP 请求配置 线程组默认为 1 个线程并只执行一次 1 次,这很方便测试执行脚本,保持此默认值即可。 HTTP 请求最关键的配置即 URL, JMeter 允许将 URL 协议类型(Protocol)、服务器名、请求路径(Path)等拆开单独配置。也可以直接将整个 URL(如 JMeter 主页 http://jmeter.apache.org/ )填写到 Path,其他字段保留为空即可。这样,一个最简单的 HTTP 压测脚本就配置好了。 为了方便测试、调试脚本,可在 Test Plan 下添加一个 View Results Tree 监听器(Listener)。这个监听器仅用于编辑脚本时测试、调试脚本,查看请求执行详情,不需要做任何配置。 二.测试执行脚本 1.第一次执行脚本前,需要先保存脚本,如保存为 test.jmx 。以后每次执行脚本前,JMeter 默认会自动保存脚本。 2.连续多次执行脚本时,JMeter 默认不会清理历史记录。为了避免历史执行结果干扰,可先点击 Clear All 按钮手动清空历史记录, 再点击 Start 按钮执行脚本,这样看到的执行结果更清爽,方便排查问题。 按照默认线程组配置,脚本执行一次即结束。点击 View Results Tree,可看到请求执行详细信息,包括请求头,请求体,响应头和完整的响应体等信息。 三.场景编排 1.真实压测场景不会只有一个请求,而是多个请求按一定顺序和规则的编排组合,即场景编排。场景编排是 JMeter 等压测引擎最重要的功能之一,也是与 Apache ab 等简单压测工具的重要区别之一。 2.这里我们假设一个最简单的场景,先访问 JMeter 主页,停留 1 秒钟后跳转到下载页。 3.一个脚本访问一个网站的不同页面(Path)时,可添加一个 HTTP Request Defaults 节点,配置默认协议类型和服务器名。这样可避免重复配置,需要修改协议类型(如 https 与 http 切换)或压测域名时,只用修改 HTTP Request Defaults 即可。 4.HTTP Request Defaults 配置服务器名为 jmeter.apache.org(协议类型默认为 http), 鼠标可拖动 HTTP Request Defaults 节点移动到 HTTP 请求节点之前。 5.每个请求节点可设置一个具有业务含义的名字,方便理解和管理。访问 JMeter 主页的 HTTP 请求可改名为 home ,同时 Path 修改为 / 。再添加一个 HTTP 请求节点,命名为 download page ,设置 Path 为 /download_jmeter.cgi 即可。 6.模拟在 home 页面停顿 1 秒钟。home 节点上右键,添加一个 Constant Timer 子节点,设置延迟时间为 1000 毫秒即可。 四.JMeter 的压测执行 1.编辑、调试脚本时,我们通常设置为 1 个线程并且只执行 1 次。 2.执行压力测试时,通常需要以较高的压力持续执行一段时间。 3.脚本固定配置压力如计划以 50 并发执行 2 分钟,可修改脚本 Thread Group 配置如下。 4.通常,我们在 JMeter 图形界面(GUI)编辑脚本,但执行压力测试时 GUI 占用额外资源可能影响施压性能, 而且施压机可能没有图形界面环境(如 ssh 远程登录施压机)。因此脚本编辑完成后,通常以命令行模式执行 JMeter 压力测试。 5.进入 JMeter 脚本目录,执行 JMeter 压力测试的命令为:jmeter -n -t <脚本> 6.如执行上述 test.jmx 脚本,命令如下:jmeter -n -t test.jmx 7.输出结果如下:
8.压测过程中默认每 30 秒输出一次统计数据,2 分钟后(实际为 00:02:02,比预设的 2 分钟多出少许误差)压测结束。 9.看最后一行统计数据,平均 RPS(每秒请求数)为 26.7,平均 RT (响应时间)为 843 毫秒。 五.尝试核对一下统计数据 1.脚本包含两个请求,每个请求附加 1 秒钟等待时间,发送一个请求平均耗时为 RT 843 毫秒 + 等待 1000 毫秒。 2.单线程理论 RPS 为 1000.0 / (843 + 1000), 总共 50 个线程,全场景理论 RPS 为 1000.0 / (843 + 1000) * 50 = 27.13,与统计值 26.7 有一定误差。这是因为除了请求 RT 和等待时间,脚本执行请求之间还可能存在少量时间消耗。 六.命令行动态设置压力 1.实际工作中,常常需要以不同的压力大小反复执行压力测试,在脚本中写死压力大小(并发数)和执行时间显然很不方便。 2.如何动态指定压力大小呢,这里有一个技巧。 3.修改 JMeter 脚本使用 JMeter 属性配置压力大小,配置如下: 4.测试命令行直接执行脚本:jmeter -n -t test.jmx 5.可看到统计输出如下: summary = 2 in 00:00:03 = 0.6/s Avg: 485 Min: 408 Max: 563 Err: 0 (0.00%) 5.1.一个并发并且只执行一次,发出2个请求(脚本循环一次发出两个请求),约3秒后脚本停止。 5.2.注意:执行时间是 1 分钟,同时配置了循环次数和执行时间时,有一个条件先满足脚本即停止。 6.为了按指定时长执行,需要将执行次数设置为 Forever 。 6.1.在 JMeter 内部实现中,执行次数为 -1 即表示 Forever 。 6.2.指定以 50 并发执行 2 分钟,JMeter 命令行如下: 6.3.执行结果与前述脚本固定配置 50 并发的结果类似。 七.使用 CSV 参数文件 1.上述 JMeter 脚本仅简单请求固定 URL ,真实业务 API 通常带有请求参数。 2.JMeter 中可使用 CSV Data Set Config 读取 CSV 数据文件,简单实现请求参数化。 3.CSV 文件默认首行为变量名(列名),其余行为 CSV 数据。 3.1.准备一个 user.csv 文件,包含 id , name 两列,内容如下: 3.2.注意:手工编辑 CSV 文件容易出错,推荐使用 Excel、Numbers 等软件导出,或编程使用 apache commons-csv 生成。 3.3.编辑 JMeter 脚本,右键单击 Thread Group 添加一个 CSV Data Set Config 节点。
5.其中,有两个地方需要注意(其他配置保持默认即可): 5.1.Filename 配置为文件名 user.csv 即可,不要包含文件路径。不同施压机上 CSV 文件路径可能不一样,只使用文件名(并在当前路径下执行脚本)以便兼容不同的施压机环境。 5.2. Sharing mode 设置为 Current thread group,指定 CSV 文件只被当前线程组使用。 假设 home 请求需要设置参数,配置请求参数直接使用 i d , {id} , id,{name} 引用对应的变量即可。
八.使用 JMeter 插件和附加 Jar 包 1.JMeter 社区提供了丰富的插件,用户还可以自由添加使用 Java 库 Jar 包。 2.在 PTS 上执行脚本时,只需要将额外添加的插件和 Jar 包一起上传到 PTS 上, PTS 执行 JMeter 脚本时即可自动加载这些 Jar 包 。 3.如果遇到问题,请先确认本地已测试通过,并确认额外使用的 Jar 包已全部上传到 PTS 。 九.海量压测施压能力 1.之前的脚本中,我们在请求后添加了 1 秒钟的等待时间以演示业务场景编排。 2.如果压测场景前后请求没有关联,从服务器的角度看只是不停的收到各种请求,与客户端是否等待无关, 因此 JMeter 脚本可去掉这些等待时间,以最大压力向服务器发起极限压测。 3.JMeter 使用并发(线程)数控制压力大小,通常(并发较小时)线程数越多压力越大。但单台施压机的能力毕竟有限,单机线程数增加到某个阈值时请求压力即达到极限。显然,为了继续增加压力,必须使用多台施压机进行分布式压测。 4.分布式压测需要注意以下几点: 4.1. 每台施压机需要安装、启动 JMeter,拷贝分发脚本、CSV 数据、附加 jar 包等文件。 4.2. 协调分配施压并发数。通常施压机配置相同,均分施压并发数即可。 4.3. 统一控制启动、停止压测,统一收集聚合监控数据。 4.4. 希望 CSV 数据唯一或打散数据时,多台施压机需要拆分 CSV 数据文件 。 |
|
开发测试 最新文章 |
pytest系列——allure之生成测试报告(Wind |
某大厂软件测试岗一面笔试题+二面问答题面试 |
iperf 学习笔记 |
关于Python中使用selenium八大定位方法 |
【软件测试】为什么提升不了?8年测试总结再 |
软件测试复习 |
PHP笔记-Smarty模板引擎的使用 |
C++Test使用入门 |
【Java】单元测试 |
Net core 3.x 获取客户端地址 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/18 4:50:21- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |