Jmeter 并发业务场景如何控制接口只执行一次

本文介绍了在并发测试中如何使用JMeter的吞吐量控制器(Throughput Controller)确保登录接口只执行一次。通过设置控制器模式为Total Executions,并将吞吐量设置为1,可以实现目标。同时,详细解析了吞吐量控制器的属性和工作原理,包括PercentExecutions和Total Executions两种模式,以及Per User选项的影响。

今天在做并发测试,执行后会发现登录接口执行多次,实际只需执行一次就可以。
刚开始用了网上推荐的仅一次控制器,但是发现仅一次控制器对线程组无效。
其实只要对元件熟悉,这个问题很简单,只需要用吞吐量控制器(Throughput Controller)即可实现。
1、创建一个线程组(Thread Group),设置10个并发如图:
在这里插入图片描述
2、添加吞吐量控制器(Throughput Contrller)
线程组-逻辑控制器-吞吐量控制器
在这里插入图片描述
3、吞吐量控制器,选择总数计算(Total Executions),吞吐量设置为1
在这里插入图片描述

4、【吞吐量控制器】组件中添加需要单次执行的请求接口
在这里插入图片描述

4、运行脚本,查看结果发现,登录接口执行了1次,组织项目列表接口执行了10次
在这里插入图片描述
问题完美解决!

下面详细介绍一下吞吐量控制器

吞吐量控制器

吞吐量控制器(Throughput Controller)用来控制其下元件的执行次数,并无控制吞吐量的功能,想要控制吞吐量可以使用 Constant throughput Timer。吞吐量控制器有两种模式:PercentExecutions 与 Total Executions。

在这里插入图片描述

属性介绍
  1. 名称:控制器名称,可以随意设置,甚至可以为空。
  2. 注释:可以随意设置,可以为空。
  3. Based on:选择执行模式。
    3.1 PercentExecutions:按执行次数的百分比来计算执行次数,此时Throughput取值是0~
    100。
    3.2 Total Executions:按Throughput的值来指定执行次数,可以是任意整数,如果小于等于
    零则一次也不执行。
  4. 吞吐量:这个值的作用根据你选择的执行模式不同,可分为两种情况:
    4.1 Percent executions 模式下,代表执行次数的百分比。如填写30,则表示子元件会执行原执行次数*0.3次。
    4.2 Total executions模式下,代表执行的总次数。如填写50,则表示子元件会执行50次。
  5. Per User:表示是否要在每个线程组上单独应用控制器的设置。
    5.1 PerUser是否勾选对PercentExecutions模式无影响.
    5.2 PerUser与TotalExecution一起影响执行次数。比如说,在Total executions模式下填写了50的吞吐量,勾选了Per User,那么控制器的子元件会执行线程数 * 50次;不勾选Per User,那么控制器的子元件会执行50次。
序号线程数循环次数模式ThroughputPer User执行次数
1210Percent50Y10
2210Percent50N10
3210Total7Y14
4210Total7N7
522Total7Y4
622Total7N4

上面表格有6个场景,线程数为2,循环次数为10。
下面说明一下这6个场景。
(1)序号 1,2 场景,PerUser 对总的执行次数无影响,都是10次。

在这里插入图片描述

在这里插入图片描述

(2)序号 3 场景,PerUser 勾选,每个虚拟用户(线程)执行7次,共执行16次。

在这里插入图片描述

(3)序号 4 场景,PerUser 没有勾选,则所有虚拟用户共执行7次。

在这里插入图片描述

(4)序号 5 场景,PerUser 勾选,每个虚拟用户执行7次,共16次,由于 ThreadGroup 计划的循环次数是4(2 线程*循环 2 次)次,所以最多只能执行4次。

在这里插入图片描述

(5)序号 6 场景,PerUser 没有勾选,所有虚拟用户共执行7次,由于 ThreadGroup 计划的循环次数是4(2 线程*循环 2 次)次,所以最多只能执行4次。

在这里插入图片描述

### 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
发出的红包

打赏作者

柳絮吹成雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值