增加测试 修复错误

This commit is contained in:
yml
2026-06-05 22:01:14 +08:00
parent 402c19320d
commit b04fb629cb
6 changed files with 2042 additions and 1 deletions
+393
View File
@@ -0,0 +1,393 @@
#!/bin/bash
# 压力测试快速启动脚本
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
function log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
function log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
function log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
function show_usage() {
cat << EOF
压力测试脚本
用法:
$0 [command] [options]
命令:
data 生成测试数据
test 执行压力测试
monitor 监控系统性能
clean 清理测试数据
report 生成压测报告
all 执行完整流程(生成数据 + 压测 + 报告)
选项:
-u, --users NUM 生成用户数量(默认: 10000)
-l, --listings NUM 生成商品数量(默认: 50000)
-o, --orders NUM 生成订单数量(默认: 30000)
-c, --concurrency NUM 并发数(默认: 100
-d, --duration SEC 测试时长/秒(默认: 60)
-s, --scenario NAME 测试场景: list_listings, create_order, wallet, chat, mixed(默认: mixed
--url URL 后端地址(默认: http://localhost:8080
-h, --help 显示帮助信息
示例:
# 生成测试数据
$0 data
# 执行混合场景压测(100并发,持续60秒)
$0 test -c 100 -d 60 -s mixed
# 执行商品列表查询压测
$0 test -s list_listings -c 200 -d 120
# 执行完整流程
$0 all
# 清理测试数据
$0 clean
EOF
}
# 默认参数
USERS=10000
LISTINGS=50000
ORDERS=30000
LEDGER=100000
CONCURRENCY=100
DURATION=60
SCENARIO="mixed"
BASE_URL="http://localhost:8080"
# 解析命令行参数
COMMAND=""
while [[ $# -gt 0 ]]; do
case $1 in
data|test|monitor|clean|report|all)
COMMAND="$1"
shift
;;
-u|--users)
USERS="$2"
shift 2
;;
-l|--listings)
LISTINGS="$2"
shift 2
;;
-o|--orders)
ORDERS="$2"
shift 2
;;
-c|--concurrency)
CONCURRENCY="$2"
shift 2
;;
-d|--duration)
DURATION="$2"
shift 2
;;
-s|--scenario)
SCENARIO="$2"
shift 2
;;
--url)
BASE_URL="$2"
shift 2
;;
-h|--help)
show_usage
exit 0
;;
*)
log_error "未知参数: $1"
show_usage
exit 1
;;
esac
done
if [ -z "$COMMAND" ]; then
log_error "请指定命令"
show_usage
exit 1
fi
# 检查数据库连接
function check_database() {
log_info "检查数据库连接..."
if docker exec hfb-mysql mysql -uhfb -psecret -e "SELECT 1" &>/dev/null; then
log_info "数据库连接正常"
return 0
else
log_error "数据库连接失败,请确保 Docker 容器正在运行"
log_info "提示: 执行 'docker-compose -f deploy/docker-compose.dev.yml up -d' 启动服务"
return 1
fi
}
# 检查后端服务
function check_backend() {
log_info "检查后端服务..."
if curl -s "$BASE_URL/health" &>/dev/null; then
log_info "后端服务正常"
return 0
else
log_warn "后端服务未响应: $BASE_URL"
log_info "提示: 确保后端服务已启动"
return 1
fi
}
# 生成测试数据
function generate_data() {
log_info "开始生成测试数据..."
log_info "配置: 用户=$USERS, 商品=$LISTINGS, 订单=$ORDERS"
check_database || exit 1
# 创建临时SQL文件
TMP_SQL="/tmp/load_test_data_$(date +%s).sql"
cat > "$TMP_SQL" << EOF
-- 临时生成的测试数据脚本
USE hfb_sys;
-- 调用存储过程生成数据
CALL generate_users($USERS);
CALL generate_listings($LISTINGS);
CALL generate_orders($ORDERS);
CALL generate_wallet_ledger($LEDGER);
-- 生成聊天会话
INSERT INTO chat_conversations (order_id, type, title, status, last_message_at)
SELECT id, 'order_group', CONCAT('订单', order_no, '群聊'), 'active', created_at
FROM rental_orders
WHERE id <= 1000
ON DUPLICATE KEY UPDATE order_id=order_id;
CALL generate_chat_messages(50000);
-- 显示统计
SELECT '用户数' as item, COUNT(*) as count FROM users
UNION ALL SELECT '游戏账号数', COUNT(*) FROM game_accounts
UNION ALL SELECT '商品数', COUNT(*) FROM rental_listings
UNION ALL SELECT '订单数', COUNT(*) FROM rental_orders
UNION ALL SELECT '钱包流水数', COUNT(*) FROM wallet_ledger
UNION ALL SELECT '聊天会话数', COUNT(*) FROM chat_conversations
UNION ALL SELECT '聊天消息数', COUNT(*) FROM chat_messages;
EOF
log_info "执行数据生成..."
# 先执行基础SQL创建存储过程
docker exec -i hfb-mysql mysql -uhfb -psecret hfb_sys < "$SCRIPT_DIR/load_test_data.sql"
# 执行数据生成
docker exec -i hfb-mysql mysql -uhfb -psecret hfb_sys < "$TMP_SQL"
rm -f "$TMP_SQL"
log_info "测试数据生成完成!"
}
# 执行压力测试
function run_stress_test() {
log_info "开始压力测试..."
log_info "配置: 场景=$SCENARIO, 并发=$CONCURRENCY, 时长=${DURATION}秒, 目标=$BASE_URL"
check_backend || log_warn "后端服务未响应,测试可能失败"
# 编译压测工具
log_info "编译压测工具..."
cd "$SCRIPT_DIR"
go build -o stress_test stress_test.go
# 执行压测
log_info "开始执行压力测试..."
./stress_test -url "$BASE_URL" -c "$CONCURRENCY" -d "$DURATION" -s "$SCENARIO"
log_info "压力测试完成!"
}
# 监控系统性能
function monitor_system() {
log_info "开始监控系统性能(按 Ctrl+C 停止)..."
echo ""
echo "=== Docker 容器资源使用 ==="
docker stats --no-stream hfb-backend hfb-mysql hfb-redis 2>/dev/null || log_warn "部分容器未运行"
echo ""
echo "=== MySQL 连接数 ==="
docker exec hfb-mysql mysql -uhfb -psecret -e "SHOW STATUS LIKE 'Threads_connected';" 2>/dev/null
echo ""
echo "=== MySQL 慢查询统计 ==="
docker exec hfb-mysql mysql -uhfb -psecret -e "SHOW STATUS LIKE 'Slow_queries';" 2>/dev/null
echo ""
echo "=== Redis 信息 ==="
docker exec hfb-redis redis-cli INFO stats | grep -E "total_connections_received|total_commands_processed|instantaneous_ops_per_sec" 2>/dev/null
echo ""
log_info "持续监控请使用: docker stats"
}
# 清理测试数据
function clean_data() {
log_warn "即将清理所有测试数据,此操作不可恢复!"
read -p "确认继续?(yes/no): " confirm
if [ "$confirm" != "yes" ]; then
log_info "已取消清理操作"
exit 0
fi
check_database || exit 1
log_info "开始清理测试数据..."
docker exec -i hfb-mysql mysql -uhfb -psecret hfb_sys << 'EOF'
SET FOREIGN_KEY_CHECKS = 0;
-- 清理测试数据(保留ID < 1000的数据)
DELETE FROM chat_messages WHERE id > 100;
DELETE FROM chat_conversations WHERE id > 100;
DELETE FROM wallet_ledger WHERE id > 100;
DELETE FROM rental_orders WHERE id > 100;
DELETE FROM rental_listings WHERE id > 100;
DELETE FROM game_accounts WHERE id > 100;
DELETE FROM users WHERE id > 1000;
-- 重置自增ID
ALTER TABLE users AUTO_INCREMENT = 1001;
ALTER TABLE game_accounts AUTO_INCREMENT = 101;
ALTER TABLE rental_listings AUTO_INCREMENT = 101;
ALTER TABLE rental_orders AUTO_INCREMENT = 101;
ALTER TABLE wallet_ledger AUTO_INCREMENT = 101;
ALTER TABLE chat_conversations AUTO_INCREMENT = 101;
ALTER TABLE chat_messages AUTO_INCREMENT = 101;
SET FOREIGN_KEY_CHECKS = 1;
-- 显示清理后的统计
SELECT '用户数' as item, COUNT(*) as count FROM users
UNION ALL SELECT '商品数', COUNT(*) FROM rental_listings
UNION ALL SELECT '订单数', COUNT(*) FROM rental_orders
UNION ALL SELECT '钱包流水数', COUNT(*) FROM wallet_ledger;
EOF
log_info "测试数据清理完成!"
}
# 生成压测报告
function generate_report() {
log_info "生成压测报告..."
REPORT_FILE="$PROJECT_ROOT/stress_test_report_$(date +%Y%m%d_%H%M%S).txt"
{
echo "==================================="
echo "压力测试报告"
echo "生成时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "==================================="
echo ""
echo "--- 数据库统计 ---"
docker exec hfb-mysql mysql -uhfb -psecret hfb_sys -e "
SELECT '用户数' as item, COUNT(*) as count FROM users
UNION ALL SELECT '商品数', COUNT(*) FROM rental_listings
UNION ALL SELECT '订单数', COUNT(*) FROM rental_orders
UNION ALL SELECT '钱包流水', COUNT(*) FROM wallet_ledger;
" 2>/dev/null
echo ""
echo "--- MySQL 性能指标 ---"
docker exec hfb-mysql mysql -uhfb -psecret -e "
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Slow_queries';
SHOW STATUS LIKE 'Questions';
" 2>/dev/null
echo ""
echo "--- 表大小统计 ---"
docker exec hfb-mysql mysql -uhfb -psecret hfb_sys -e "
SELECT
table_name AS '表名',
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS '大小(MB)',
table_rows AS '行数'
FROM information_schema.TABLES
WHERE table_schema = 'hfb_sys'
ORDER BY (data_length + index_length) DESC
LIMIT 10;
" 2>/dev/null
} > "$REPORT_FILE"
cat "$REPORT_FILE"
log_info "报告已保存到: $REPORT_FILE"
}
# 执行完整流程
function run_all() {
log_info "执行完整压测流程..."
generate_data
sleep 3
run_stress_test
sleep 2
generate_report
log_info "完整流程执行完成!"
}
# 执行命令
case $COMMAND in
data)
generate_data
;;
test)
run_stress_test
;;
monitor)
monitor_system
;;
clean)
clean_data
;;
report)
generate_report
;;
all)
run_all
;;
*)
log_error "未知命令: $COMMAND"
show_usage
exit 1
;;
esac