首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Jmeter混合场景压测

Jmeter混合场景压测

作者头像
小田测测看
发布2026-06-17 16:59:30
发布2026-06-17 16:59:30
150
举报

使用JMeter模拟以下场景:

(1)500并发用户持续搜索航班

(2)混合场景:60%搜索+30%预订+10%支付

下面我将详细介绍如何使用 Flask 模拟航班预订系统的接口,并使用 JMeter 设置性能测试场景。以下只是方法之一

第一步:创建 Flask 模拟应用

创建 flight_api.py 文件:

代码语言:javascript
复制
from flask import Flask, jsonify, request
import time
import random

app = Flask(__name__)

# 模拟数据
flights = [
    {"id": 1, "flight_no": "CA123", "from": "PEK", "to": "SHA", "price": 980, "seats": 150},
    {"id": 2, "flight_no": "MU456", "from": "SHA", "to": "CAN", "price": 750, "seats": 180},
    {"id": 3, "flight_no": "CZ789", "from": "CAN", "to": "CTU", "price": 650, "seats": 120},
]

bookings = {}
booking_counter = 1

@app.route('/search', methods=['GET'])
def  search_flights():
    """航班搜索接口"""
    # 模拟处理时间 (50-150ms)
    time.sleep(random.uniform(0.05, 0.15))
    
    from_city = request.args.get('from')
    to_city = request.args.get('to')
    date = request.args.get('date')
    
    # 简单过滤逻辑
    results = [f for f in flights if f['from'] == from_city and f['to'] == to_city]
    
    return jsonify({
        "status": "success",
        "results": results,
        "count": len(results)
    })

@app.route('/book', methods=['POST'])
def  book_flight():
    """航班预订接口"""
    # 模拟处理时间 (100-300ms)
    time.sleep(random.uniform(0.1, 0.3))
    
    data = request.json
    flight_id = data.get('flight_id')
    passenger = data.get('passenger')
    
    # 查找航班
    flight = next((f for f in flights if f['id'] == flight_id), None)
    
    if  not flight:
        return jsonify({"status": "error", "message": "Flight not found"}), 404
    
    if flight['seats'] <= 0:
        return jsonify({"status": "error", "message": "No seats available"}), 400
    
    # 创建预订
    global booking_counter
    booking_id = booking_counter
    booking_counter += 1
    
    bookings[booking_id] = {
        "booking_id": booking_id,
        "flight": flight,
        "passenger": passenger,
        "status": "confirmed"
    }
    
    # 减少座位
    flight['seats'] -= 1
    
    return jsonify({
        "status": "success",
        "booking_id": booking_id,
        "flight": flight,
        "passenger": passenger
    })

@app.route('/pay', methods=['POST'])
def  make_payment():
    """支付接口"""
    # 模拟处理时间 (200-500ms)
    time.sleep(random.uniform(0.2, 0.5))
    
    data = request.json
    booking_id = data.get('booking_id')
    payment_info = data.get('payment_info')
    
    # 查找预订
    booking = bookings.get(booking_id)
    
    if  not booking:
        return jsonify({"status": "error", "message": "Booking not found"}), 404
    
    # 模拟支付处理
    if random.random() < 0.95:  # 95%成功率
        booking['status'] = "paid"
        return jsonify({
            "status": "success",
            "payment_id": random.randint(100000, 999999),
            "booking": booking
        })
    else:
        return jsonify({
            "status": "error",
            "message": "Payment failed"
        }), 400

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, threaded=True)

运行:

代码语言:javascript
复制
pip install flask
python flight_api.py

第二步:JMeter 测试计划设置

场景1:500并发用户持续搜索航班
  1. 1. 创建线程组
    • • 右键 Test Plan > Add > Threads (Users) > Thread Group
    • • 设置:
      • • Number of Threads (users): 500
      • • Ramp-up period (seconds): 60 (500用户在60秒内启动)
      • • Loop Count: Forever
      • • Duration (seconds): 600 (持续10分钟)
  2. 2. 添加 HTTP 请求
    • • 右键 Thread Group > Add > Sampler > HTTP Request
    • • 设置:
      • • Name: Flight Search
      • • Protocol: http
      • • Server Name or IP: localhost
      • • Port Number: 5000
      • • Path: /search
      • • Parameters:
        • • from: PEK
        • • to: SHA
        • • date: 2025-06-01
  3. 3. 添加监听器
    • • 右键 Thread Group > Add > Listener >
      • • View Results Tree
      • • Summary Report
      • • Response Time Graph
      • • Aggregate Report
  4. 4. 配置定时器
    • • 右键 HTTP Request > Add > Timer > Constant Timer
    • • 设置 Delay (ms): 500 (每个请求间隔500ms)
场景2:混合场景 (60%搜索+30%预订+10%支付)

1. 创建线程组

  • • 右键 Test Plan > Add > Threads (Users) > Thread Group
  • • 设置:
  • • Number of Threads (users): 500
  • • Ramp-up period (seconds): 60
  • • Loop Count: Forever
  • • Duration (seconds): 600

2. 创建交易控制器

  • • 右键 Thread Group > Add > Logic Controller > Transaction Controller
  • • 名称: Mixed Transactions

3. 添加搜索请求 (60%)

  • • 右键 Transaction Controller > Add > Sampler > HTTP Request
  • • 名称: Flight Search
  • • 设置同场景1
  • • 右键 Thread Group > Add > Logic Controller > Throughput Controller
  • • Percent Execution: 60
  • • Total Executions: 100

4. 添加预订请求 (30%)

  • • 右键 Transaction Controller > Add > Sampler > HTTP Request
  • • 名称: Flight Booking
  • • 设置:

• Method: POST

• Path: /book

• Body Data (JSON):

代码语言:javascript
复制
{
  "flight_id": ${flight_id},
  "passenger": {
    "name": "Test User",
    "id_card": "110101199001011234"
  }
}
  • • 添加前置处理器:

• 右键 HTTP Request > Add > Pre Processor > JSR223 PreProcessor

• 语言: groovy

• 脚本如下:

代码语言:javascript
复制
// 随机选择一个航班ID
def flights = [1, 2, 3] // 实际应用中应从搜索响应中获取
vars.put("flight_id", flights.get(new Random().nextInt(flights.size()) as String)

5. 添加支付请求 (10%)

  • • 右键 Transaction Controller > Add > Sampler > HTTP Request
  • • 名称: Payment
  • • 设置:

• Method: POST

• Path: /pay

• Body Data (JSON):

代码语言:javascript
复制
{
  "booking_id": ${booking_id},
  "payment_info": {
    "card": "4111111111111111",
    "expiry": "12/25"
  }
}
  • • 添加前置处理器可选:

• 右键 HTTP Request > Add > Pre Processor > JSR223 PreProcessor

• 语言: groovy

• 脚本:

代码语言:javascript
复制
// 从之前的预订中获取booking_id
if (vars.get("last_booking_id") != null) {
    vars.put("booking_id", vars.get("last_booking_id"))
} else {
    // 如果没有预订记录,使用默认值
    vars.put("booking_id", "1")
}

6. 添加后置处理器 (保存预订ID)

  • • 右键 Flight Booking 请求 > Add > Post Processor > JSON Extractor
  • • 名称: booking_id
  • • JSON Path: $.booking_id
  • • 变量名称: last_booking_id

7. 添加监听器

  • • 右键 Thread Group > Add > Listener >
  • • Transaction Controller (查看混合事务)
  • • Aggregate Report
  • • Response Times Over Time

8. 配置定时器

  • • 右键 Transaction Controller > Add > Timer > Uniform Random Timer
  • • 设置:
  • • Constant Delay Offset: 300 ms
  • • Random Delay Maximum: 700 ms
  • • 总延迟: 300-1000 ms

执行jmeter -n -t test.jmx -l results.jtl

项目结构如下

场景1

场景2

其他的设置类似

结果分析

  1. 1. 关键性能指标
    • 吞吐量(Throughput):系统每秒处理的请求数
    • 响应时间(Response Time):P90/P95/P99 指标
    • 错误率(Error Rate):失败请求百分比
    • 资源利用率:CPU、内存、网络使用情况
  2. 2. 结果分析
    • • 查看 Aggregate Report:
      • • 平均响应时间应低于500ms
      • • 错误率应低于1%
    • • 分析 Response Times Over Time 图表
      • • 检查响应时间是否随负载增加而上升
      • • 定位性能拐点
    • • 使用 Transactions per Second 监听器
      • • 验证是否达到目标吞吐量

#Jmeter #Jmeter混合场景

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程拾光 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一步:创建 Flask 模拟应用
  • 第二步:JMeter 测试计划设置
    • 场景1:500并发用户持续搜索航班
    • 场景2:混合场景 (60%搜索+30%预订+10%支付)
  • 结果分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档