使用JMeter模拟以下场景:
(1)500并发用户持续搜索航班
(2)混合场景:60%搜索+30%预订+10%支付
下面我将详细介绍如何使用 Flask 模拟航班预订系统的接口,并使用 JMeter 设置性能测试场景。以下只是方法之一
创建 flight_api.py 文件:
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)运行:
pip install flask
python flight_api.py1. 创建线程组
2. 创建交易控制器
3. 添加搜索请求 (60%)
4. 添加预订请求 (30%)
• Method: POST
• Path: /book
• Body Data (JSON):
{
"flight_id": ${flight_id},
"passenger": {
"name": "Test User",
"id_card": "110101199001011234"
}
}• 右键 HTTP Request > Add > Pre Processor > JSR223 PreProcessor
• 语言: groovy
• 脚本如下:
// 随机选择一个航班ID
def flights = [1, 2, 3] // 实际应用中应从搜索响应中获取
vars.put("flight_id", flights.get(new Random().nextInt(flights.size()) as String)5. 添加支付请求 (10%)
• Method: POST
• Path: /pay
• Body Data (JSON):
{
"booking_id": ${booking_id},
"payment_info": {
"card": "4111111111111111",
"expiry": "12/25"
}
}• 右键 HTTP Request > Add > Pre Processor > JSR223 PreProcessor
• 语言: groovy
• 脚本:
// 从之前的预订中获取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)
7. 添加监听器
8. 配置定时器
执行jmeter -n -t test.jmx -l results.jtl
项目结构如下

场景1




场景2



其他的设置类似

#Jmeter #Jmeter混合场景