test.sh 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #!/bin/bash
  2. # 订单服务一键测试脚本
  3. # 用法: bash test.sh # 内存存储
  4. # STORAGE=sqlite bash test.sh # SQLite 存储
  5. PASS=0
  6. FAIL=0
  7. SERVER_PID=
  8. PORT=8080
  9. echo "选择存储后端:"
  10. echo " 1) memory(默认)"
  11. echo " 2) sqlite"
  12. read -p "请选择 [1/2]: " choice
  13. case "$choice" in
  14. 2|sqlite) STORAGE=sqlite ;;
  15. *) STORAGE=memory ;;
  16. esac
  17. green() { echo -e "\033[32m$1\033[0m"; }
  18. red() { echo -e "\033[31m$1\033[0m"; }
  19. cleanup() {
  20. [ -n "$SERVER_PID" ] && kill $SERVER_PID 2>/dev/null || true
  21. sleep 0.5
  22. rm -f orders.db
  23. }
  24. trap cleanup EXIT
  25. # 先释放 8080 端口(处理上次残留)
  26. fuser -k ${PORT}/tcp >/dev/null 2>&1 || true
  27. sleep 1
  28. echo "========================================"
  29. echo " 订 单 服 务 — 一 键 测 试"
  30. echo " 存储: $STORAGE"
  31. echo "========================================"
  32. # 启动服务
  33. export STORAGE
  34. GIN_MODE=release go run main.go > /tmp/order_server.log 2>&1 &
  35. SERVER_PID=$!
  36. sleep 3
  37. # 检查进程
  38. if ! kill -0 $SERVER_PID 2>/dev/null; then
  39. red " ❌ 服务启动失败"
  40. cat /tmp/order_server.log
  41. exit 1
  42. fi
  43. assert() {
  44. local desc="$1" exp="$2" act="$3" exp_body="$4" act_body="$5"
  45. if echo "$act_body" | grep -qF "$exp_body" && [ "$act" = "$exp" ]; then
  46. green " ✅ PASS: $desc"
  47. ((PASS++))
  48. else
  49. red " ❌ FAIL: $desc"
  50. echo " HTTP $exp 期望, 实际 $act"
  51. echo " body 期望含: $exp_body"
  52. echo " body 实际: $act_body"
  53. ((FAIL++))
  54. fi
  55. }
  56. echo ""
  57. echo "1. 创建订单..."
  58. RESP=$(curl -s -w "\n%{http_code}" -X POST http://localhost:$PORT/orders \
  59. -H "Content-Type: application/json" \
  60. -d '{"service_time":"2025-08-01T14:00:00Z","duration":120,"address":"北京朝阳"}')
  61. BODY=$(echo "$RESP" | sed '$d')
  62. CODE=$(echo "$RESP" | tail -1)
  63. ID=$(echo "$BODY" | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4)
  64. assert "创建订单" 201 "$CODE" '"status":"pending"' "$BODY"
  65. echo ""
  66. echo "2. 接单(首次)..."
  67. RESP=$(curl -s -w "\n%{http_code}" -X PUT "http://localhost:$PORT/orders/$ID/accept" \
  68. -H "Content-Type: application/json" \
  69. -d '{"provider_id":"prov_001"}')
  70. BODY=$(echo "$RESP" | sed '$d')
  71. CODE=$(echo "$RESP" | tail -1)
  72. assert "首次接单成功" 200 "$CODE" "接单成功" "$BODY"
  73. echo ""
  74. echo "3. 重复接单(应拒绝)..."
  75. RESP=$(curl -s -w "\n%{http_code}" -X PUT "http://localhost:$PORT/orders/$ID/accept" \
  76. -H "Content-Type: application/json" \
  77. -d '{"provider_id":"prov_002"}')
  78. BODY=$(echo "$RESP" | sed '$d')
  79. CODE=$(echo "$RESP" | tail -1)
  80. assert "重复接单被拒" 409 "$CODE" "已被其他服务者接单" "$BODY"
  81. echo ""
  82. echo "4. 取消订单..."
  83. RESP=$(curl -s -w "\n%{http_code}" -X PUT "http://localhost:$PORT/orders/$ID/cancel" \
  84. -H "Content-Type: application/json" \
  85. -d '{}')
  86. BODY=$(echo "$RESP" | sed '$d')
  87. CODE=$(echo "$RESP" | tail -1)
  88. assert "取消成功" 200 "$CODE" "取消成功" "$BODY"
  89. echo ""
  90. echo "5. 取消后接单(应拒绝)..."
  91. RESP=$(curl -s -w "\n%{http_code}" -X PUT "http://localhost:$PORT/orders/$ID/accept" \
  92. -H "Content-Type: application/json" \
  93. -d '{"provider_id":"prov_003"}')
  94. BODY=$(echo "$RESP" | sed '$d')
  95. CODE=$(echo "$RESP" | tail -1)
  96. assert "取消后接单被拒" 400 "$CODE" "已取消" "$BODY"
  97. echo ""
  98. echo "6. 重复取消(应拒绝)..."
  99. RESP=$(curl -s -w "\n%{http_code}" -X PUT "http://localhost:$PORT/orders/$ID/cancel" \
  100. -H "Content-Type: application/json" \
  101. -d '{}')
  102. BODY=$(echo "$RESP" | sed '$d')
  103. CODE=$(echo "$RESP" | tail -1)
  104. assert "重复取消被拒" 400 "$CODE" "已取消" "$BODY"
  105. echo ""
  106. echo "7. 订单不存在..."
  107. RESP=$(curl -s -w "\n%{http_code}" -X PUT "http://localhost:$PORT/orders/nonexistent/accept" \
  108. -H "Content-Type: application/json" \
  109. -d '{"provider_id":"prov_001"}')
  110. BODY=$(echo "$RESP" | sed '$d')
  111. CODE=$(echo "$RESP" | tail -1)
  112. assert "订单不存在" 404 "$CODE" "订单不存在" "$BODY"
  113. echo ""
  114. echo "========================================"
  115. if [ $FAIL -eq 0 ]; then
  116. green " 🎉 全部 $PASS 个测试通过!"
  117. else
  118. red " $PASS 通过, $FAIL 失败"
  119. fi
  120. echo "========================================"
  121. exit $FAIL