Jmeter 性能-模拟百万高并发压测思路

2024软件测试面试刷题,这个小程序(永久刷题),靠它快速找到工作了!(刷题APP的天花板)-优快云博客文章浏览阅读2k次,点赞85次,收藏11次。你知不知道有这么一个软件测试面试的刷题小程序。里面包含了面试常问的软件测试基础题,web自动化测试、app自动化测试、接口测试、性能测试、自动化测试、安全测试及一些常问到的人力资源题目。最主要的是他还收集了像阿里、华为这样的大厂面试真题,还有互动交流板块……https://blog.youkuaiyun.com/AI_Green/article/details/134931243?spm=1001.2014.3001.5501测试场景:模拟百万级的订单量一个物流信息的查询接口。

条件:接口响应时间<150ms以内。10万并发量每秒。

设计性能测试方案:

1、生产环境

10W/S --并发量(架构师/技术负责人提供)
20台机器(4G*4核配置)

2、性能测试环境

①出于成本考虑,绝大多数公司,是做不到和生产环境一样配置的。

有些生产环境有几百台甚至几千台机器,测试环境做不到。

②基准测试 -- 少量的请求,少量服务器 -- 性能测试 -- 通过理论推导 生产环境性能

【4G*4核配置】1台 --> 性能指标 -- 推导 --只需要1台与服务器相同配置的机器能完成5000/s并发量即可(类似数学中的同理可得,以此类推)

注意事项:性能测试项目部署服务器硬件型号 -- 和生产环境一致

3、性能测试用例设计

生产环境面临并发量100000,服务器20台,平均到每台服务器5000/s,当并发需求=5000/s的时候,并发量要大于等于5000/s才扛得住。

性能指标:​​​​​​​

吞吐量(接受发送):>= 5000/S(QueryPS -- 查询数据场景(一秒内 处理查询请求数量)-- TransactionPS -- 多个操作/设计数据修改的请求)
单位时间(s)-- 处理请求的数量
并发量:5000/s(相对并发:某一个时间段)(绝对并发:同一个时间)
响应时间:接口请求从开始到结束完整时间 -- 150ms

性能用例 -- 执行步骤 + 执行结果验证

负载测试 -- 系统承载的极限并发

不断加大并发 -- 直到系统不满足性能需要【性能瓶颈】【拐点】

压力测试(稳定性测试)-- 极限并发情况下,系统能否稳定 指定时间(一般压力测试时间大于12小时)

两个测试的先后顺序:

先做压力测试再做负载测试,主要是因为要做压力测试你首先要知道极限并发是多少,负载测试就能知道极限并发。

线程目的:去执行接口调用

模拟总共500线程 --> 慢慢增加 -- 最终达到要求。

只压500线程而不是5000线程的原因是,接口平均访问返回时间为100ms。

1秒就有1个线程就可以造成10并发的压力,所以只需要500个用户,1秒就能达到5000并发的压力。

Jmeter用到的插件:

①Stepping Thread Group和loadrunner一样,梯度压测。每次递增可以在Next,add中自己填入参数。

②Jmeter压测实时仪表盘,在后端监听器中。

③性能测试仪表盘的好处是它有集群监测,可以进行Linux的集群监控。

行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群: 786229024,里面有各种测试开发资料和技术可以一起交流哦。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】在这里插入图片描述
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

### JMeter并发多个接口的配置方法 在使用 JMeter 对多个接口进行并发测试时,需要合理配置线程组、控制器、监听器等组件,以确保测试任务的高效执行和结果的准确分析。以下是详细的配置方法: #### 线程组配置 JMeter性能测试任务是基于线程组进行调度的。对于并发多个接口的场景,可以使用多个 `Thread Group` 来分别模拟不同接口的并发请求。每个线程组可以配置不同的虚拟用户数(线程数)、启动时间(Ramp-Up 时间)以及循环次数。 - **虚拟用户数(Number of Threads)**:根据业务需求设置每个接口的并发用户数。例如,可以为接口 A 设置 50 个线程,为接口 B 设置 30 个线程。 - **启动时间(Ramp-Up Time)**:定义所有线程启动所需的时间。如果设置为 0,则所有线程将同时启动;如果设置为 10 秒,则线程将均匀分布在 10 秒内启动。 - **循环次数(Loop Count)**:定义每个线程执行请求的次数。如果需要持续,可以勾选“永远”选项,使线程无限循环执行。 此外,可以使用 `setUp Thread Group` 来准备测试数据,例如在前创建必要的数据库记录或清理缓存,以避免这些操作对结果产生干扰[^2]。 #### 控制器配置 在每个线程组内部,可以使用 `HTTP Request` 控制器来定义具体的接口请求。为了并发执行多个接口,可以将不同的接口请求分配到不同的线程组中。每个 `HTTP Request` 控制器需要配置以下参数: - **协议(Protocol)**:通常为 HTTP 或 HTTPS。 - **服务器名称或 IP(Server Name or IP)**:目标服务器的地址。 - **端口号(Port Number)**:目标服务器的端口。 - **HTTP 请求方法(Method)**:如 GET、POST、PUT、DELETE 等。 - **路径(Path)**:接口的 URL 路径。 - **参数(Parameters)**:请求参数,可以是查询参数或表单参数。 为了模拟更真实的用户行为,可以在请求之间添加 `定时器(Timer)`,例如 `固定定时器(Constant Timer)` 或 `高斯随机定时器(Gaussian Random Timer)`,以模拟用户操作之间的间隔。 #### 数据驱动测试 在并发多个接口时,通常需要使用不同的测试数据来模拟真实场景。可以使用 `CSV Data Set Config` 元件来读取外部文件中的测试数据,并将其分配给不同的线程。这样可以实现数据驱动的性能测试,确保每个线程使用不同的输入参数进行请求。 例如,可以创建一个 CSV 文件,包含多个接口的请求参数,然后在每个 `HTTP Request` 控制器中引用这些参数。这样,每个线程在执行请求时都会从文件中读取一组新的数据,从而实现多样化的测试场景。 #### 监听器配置 为了分析结果,可以使用多种监听器来收集和展示性能数据。常用的监听器包括: - **查看结果树(View Results Tree)**:用于调试,查看每个请求的响应内容。 - **聚合报告(Aggregate Report)**:显示平均响应时间、吞吐量、错误率等关键指标。 - **响应时间图(Response Times Over Time)**:展示请求响应时间随时间的变化趋势。 - **吞吐量图(Throughput Over Time)**:展示单位时间内处理的请求数量。 通过这些监听器,可以全面评估系统的性能表现,并识别潜在的瓶颈。 #### 分布式(可选) 如果单台机器无法满足高并发的需求,可以使用 JMeter 的分布式功能。通过配置多台远程 JMeter 服务器(Remote Servers),可以将负载分散到不同的机器上,从而实现更大规模的并发测试。主控机器(Master)负责协调所有远程机器的执行,并汇总结果。 分布式的配置步骤如下: 1. 在远程机器上启动 JMeter Server。 2. 在主控机器的 `jmeter.properties` 文件中配置远程服务器的 IP 地址。 3. 启动主控机器的 JMeter GUI,并选择“Run > Remote Start All”来启动所有远程服务器的测试任务。 #### 示例代码 以下是一个简单的 JMeter 测试计划配置示例,展示了如何并发两个不同的接口: ```xml <jmeterTestPlan version="1.2" properties="5.0" jmeter="5.4"> <hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group - Interface A" enabled="true"> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <stringProp name="LoopController.loops">10</stringProp> </elementProp> <stringProp name="ThreadGroup.num_threads">50</stringProp> <stringProp name="ThreadGroup.ramp_time">10</stringProp> <boolProp name="ThreadGroup.scheduler">true</boolProp> <stringProp name="ThreadGroup.duration">60</stringProp> </ThreadGroup> <hashTree> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request - Interface A" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="param1" elementType="HTTPArgument"> <boolProp name="HTTPArgument.always_encode">false</boolProp> <stringProp name="HTTPArgument.name">param1</stringProp> <stringProp name="HTTPArgument.value">${param1}</stringProp> </elementProp> </collectionProp> </elementProp> <stringProp name="HTTPSampler.domain">example.com</stringProp> <stringProp name="HTTPSampler.port">80</stringProp> <stringProp name="HTTPSampler.protocol">http</stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">/api/interfaceA</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> </HTTPSamplerProxy> <hashTree/> </hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group - Interface B" enabled="true"> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <stringProp name="LoopController.loops">10</stringProp> </elementProp> <stringProp name="ThreadGroup.num_threads">30</stringProp> <stringProp name="ThreadGroup.ramp_time">10</stringProp> <boolProp name="ThreadGroup.scheduler">true</boolProp> <stringProp name="ThreadGroup.duration">60</stringProp> </ThreadGroup> <hashTree> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request - Interface B" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="param2" elementType="HTTPArgument"> <boolProp name="HTTPArgument.always_encode">false</boolProp> <stringProp name="HTTPArgument.name">param2</stringProp> <stringProp name="HTTPArgument.value">${param2}</stringProp> </elementProp> </collectionProp> </elementProp> <stringProp name="HTTPSampler.domain">example.com</stringProp> <stringProp name="HTTPSampler.port">80</stringProp> <stringProp name="HTTPSampler.protocol">http</stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">/api/interfaceB</stringProp> <stringProp name="HTTPSampler.method">POST</stringProp> </HTTPSamplerProxy> <hashTree/> </hashTree> </hashTree> </jmeterTestPlan> ``` #### 性能测试注意事项 在进行并发时,需要注意以下几点: - **避免测试环境对结果的影响**:确保测试环境与生产环境尽可能一致,包括网络带宽、服务器配置、数据库性能等。此外,测试过程中应避免其他任务对系统资源的占用[^1]。 - **合理设置线程数和循环次数**:线程数过高可能导致系统崩溃,而线程数过低则无法真实反映系统的承受能力。建议逐步增加线程数,观察系统的响应情况。 - **监控系统资源**:在过程中,使用监控工具(如 JMeter 自带的监听器或第三方工具)实时监控服务器的 CPU 使用率、内存占用、磁盘 I/O 等指标,以便及时发现性能瓶颈。 - **分析测试结果**:通过监听器收集的数据,分析接口的响应时间、吞吐量、错误率等指标,找出系统性能的薄弱环节,并进行优化。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值