beiweixiaohuang 2025-11-21 12:47 采纳率: 0%
浏览 5

jmeter做性能测试遇到了问题

公司让我做性能测试,系统的逻辑是调用两个接口,调用第二个接口时会生成一个订单,我想半小时内逐步生成50个订单,但是用自定义线程组设置五十个线程循环一次不太行,想问问有什么正确的实现方法
补充一下:半个小时生成五十个订单是第一阶段,还有二阶段和三阶段,是不是需要结合UItimate ThreadGroup进行测试?

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2025-11-21 13:14
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    在使用 JMeter 进行性能测试时,如果你的目标是在半小时内逐步生成50个订单,并且系统逻辑是先调用第一个接口,再调用第二个接口生成订单,那么使用“自定义线程组”或“线程组”进行设置时需要注意以下几点:


    一、问题分析

    你提到“用自定义线程组设置五十个线程循环一次不太行”,这可能是因为:

    • 线程数过多:50个线程同时运行可能导致服务器压力过大。
    • 请求频率过高:如果每个线程都立即执行,可能会导致短时间内产生大量请求,不符合“逐步生成”的需求。
    • 没有控制请求的节奏:没有设置合适的延迟(如Constant Timer)来控制请求速率。

    二、正确的实现方法

    为了在30分钟内逐步生成50个订单,建议采用以下方式:

    1. 使用“线程组” + “定时器”控制请求频率

    步骤如下:

    1. 创建一个线程组

      • 线程数设为 1(单线程)。
      • 循环次数设为 50(生成50个订单)。
      • 勾选“调度器”并设置“持续时间”为 1800秒(30分钟)。
    2. 添加两个HTTP请求

      • 第一个请求:调用第一个接口。
      • 第二个请求:调用第二个接口生成订单。
    3. 添加“Constant Timer”控制请求间隔

      • 第二个请求前添加一个 Constant Timer
      • 设置 延迟时间36秒(因为 1800 / 50 = 36 秒/次)。

    重点说明:

    • 使用单线程可以保证请求按顺序执行,避免并发导致的数据冲突。
    • Constant Timer 控制请求之间的间隔,确保每36秒生成一个订单,总时间为30分钟。

    三、代码示例(JMX结构)

    以下是 JMeter 的基本结构(JMX 文件中的一部分):

    <threadGroup guiclass="ThreadGroupGui" name="线程组" ...>
        <stringProp name="ThreadGroup.num_threads">1</stringProp>
        <stringProp name="ThreadGroup.ramp_time">0</stringProp>
        <stringProp name="ThreadGroup.loops">50</stringProp>
        <boolProp name="ThreadGroup.scheduler">true</boolProp>
        <stringProp name="ThreadGroup.duration">1800</stringProp>
        <elementProp name="ThreadGroup.thread_group" elementType="ThreadGroup">
            <collectionProp name="ThreadGroup.processors">
                <elementProp name="HTTP Request 1" elementType="HTTPSamplerProxy">
                    <stringProp name="HTTPSampler.path">/api/endpoint1</stringProp>
                    <stringProp name="HTTPSampler.method">GET</stringProp>
                </elementProp>
                <elementProp name="Constant Timer" elementType="ConstantTimer">
                    <stringProp name="ConstantTimer.value">36000</stringProp> <!-- 36秒 -->
                </elementProp>
                <elementProp name="HTTP Request 2" elementType="HTTPSamplerProxy">
                    <stringProp name="HTTPSampler.path">/api/endpoint2</stringProp>
                    <stringProp name="HTTPSampler.method">POST</stringProp>
                </elementProp>
            </collectionProp>
        </elementProp>
    </threadGroup>
    

    注意: 36000 是毫秒单位,表示36秒。


    四、其他优化建议

    | 优化点 | 说明 | |--------|------| | 使用“CSV Data Set Config” | 如果需要模拟不同用户生成订单,可以使用CSV文件提供不同的参数。 | | 使用“If Controller” | 可以根据条件判断是否执行生成订单的请求。 | | 监控资源使用情况 | 使用 Monitor Metrics 插件监控服务器CPU、内存等指标。 |


    五、总结

    要实现“在30分钟内逐步生成50个订单”,推荐使用以下方案:

    1. 使用单线程,避免并发问题。
    2. 设置循环次数为50,确保总共生成50个订单。
    3. 设置调度器和持续时间,控制总时长为30分钟。
    4. 使用 Constant Timer 控制请求间隔,确保每36秒生成一个订单。

    如有更多接口依赖或复杂逻辑,可进一步使用 If ControllerSwitch ControllerJSR223 Sampler 实现更灵活的控制。需要我帮你设计更复杂的脚本也可以继续提问!

    评论

报告相同问题?

问题事件

  • 修改了问题 11月21日
  • 创建了问题 11月21日