run-test.sh 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
  4. cd "$PROJECT_DIR"
  5. RED='\033[0;31m'
  6. GREEN='\033[0;32m'
  7. YELLOW='\033[1;33m'
  8. CYAN='\033[0;36m'
  9. NC='\033[0m'
  10. TIMEOUT="${TEST_TIMEOUT:-600s}"
  11. COUNT="${TEST_COUNT:-1}"
  12. VERBOSE="${TEST_VERBOSE:-}"
  13. PACKAGE="${1:-./...}"
  14. print_usage() {
  15. echo "Usage: $0 [package] [options]"
  16. echo ""
  17. echo "Examples:"
  18. echo " $0 # 运行全部测试"
  19. echo " $0 ./internal/model/... # 只运行 model 层测试"
  20. echo " $0 ./internal/logic/auth # 只运行 auth logic 测试"
  21. echo ""
  22. echo "Environment variables:"
  23. echo " TEST_TIMEOUT=600s 超时时间 (default: 600s)"
  24. echo " TEST_COUNT=1 运行次数 (default: 1)"
  25. echo " TEST_VERBOSE=1 详细输出 (default: off)"
  26. echo " TEST_RUN=TestName 只运行匹配的测试函数"
  27. }
  28. if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
  29. print_usage
  30. exit 0
  31. fi
  32. echo -e "${CYAN}============================================${NC}"
  33. echo -e "${CYAN} Perms System Server - Test Runner${NC}"
  34. echo -e "${CYAN}============================================${NC}"
  35. echo ""
  36. # 前置检查: MySQL 和 Redis 连通性
  37. echo -e "${YELLOW}[检查] 验证 MySQL 连接...${NC}"
  38. if mysql -u root -p'NsDmWyM@312' -h 127.0.0.1 -P 3306 -e "SELECT 1" perms_system &>/dev/null; then
  39. echo -e "${GREEN} ✓ MySQL 连接正常${NC}"
  40. else
  41. echo -e "${RED} ✗ MySQL 连接失败 (127.0.0.1:3306/perms_system)${NC}"
  42. echo -e "${RED} 请确认 MySQL 正在运行且密码正确${NC}"
  43. exit 1
  44. fi
  45. echo -e "${YELLOW}[检查] 验证 Redis 连接...${NC}"
  46. if redis-cli -h 127.0.0.1 -p 6379 -a 'NsDmWyM@312' ping 2>/dev/null | grep -q PONG; then
  47. echo -e "${GREEN} ✓ Redis 连接正常${NC}"
  48. else
  49. echo -e "${RED} ✗ Redis 连接失败 (127.0.0.1:6379)${NC}"
  50. echo -e "${RED} 请确认 Redis 正在运行且密码正确${NC}"
  51. exit 1
  52. fi
  53. echo ""
  54. # 构建参数
  55. ARGS=(-count="$COUNT" -timeout="$TIMEOUT")
  56. if [[ -n "$VERBOSE" ]]; then
  57. ARGS+=(-v)
  58. fi
  59. if [[ -n "${TEST_RUN:-}" ]]; then
  60. ARGS+=(-run "$TEST_RUN")
  61. fi
  62. echo -e "${YELLOW}[编译] 检查代码编译...${NC}"
  63. if ! go build ./... 2>&1; then
  64. echo -e "${RED} ✗ 编译失败${NC}"
  65. exit 1
  66. fi
  67. echo -e "${GREEN} ✓ 编译通过${NC}"
  68. echo ""
  69. echo -e "${YELLOW}[测试] 运行测试: ${PACKAGE}${NC}"
  70. echo -e "${YELLOW} 参数: ${ARGS[*]}${NC}"
  71. echo ""
  72. START_TIME=$(date +%s)
  73. if [[ -n "$VERBOSE" ]]; then
  74. go test "$PACKAGE" "${ARGS[@]}" 2>&1
  75. TEST_EXIT=$?
  76. else
  77. OUTPUT=$(go test "$PACKAGE" "${ARGS[@]}" 2>&1)
  78. TEST_EXIT=$?
  79. echo "$OUTPUT"
  80. fi
  81. END_TIME=$(date +%s)
  82. ELAPSED=$((END_TIME - START_TIME))
  83. echo ""
  84. echo -e "${CYAN}============================================${NC}"
  85. if [[ $TEST_EXIT -eq 0 ]]; then
  86. # 统计通过的包数
  87. if [[ -n "$VERBOSE" ]]; then
  88. PASS_COUNT=$(go test "$PACKAGE" "${ARGS[@]}" 2>&1 | grep -c "^--- PASS:" || true)
  89. echo -e "${GREEN} ✓ 全部测试通过 (${ELAPSED}s)${NC}"
  90. else
  91. PASS_PKG=$(echo "$OUTPUT" | grep -c "^ok" || true)
  92. echo -e "${GREEN} ✓ 全部测试通过 ${PASS_PKG} 个包 (${ELAPSED}s)${NC}"
  93. fi
  94. else
  95. FAIL_PKG=$(echo "${OUTPUT:-}" | grep -c "^FAIL" || true)
  96. echo -e "${RED} ✗ 测试失败 ${FAIL_PKG} 个包 (${ELAPSED}s)${NC}"
  97. echo ""
  98. echo -e "${RED}失败详情:${NC}"
  99. echo "${OUTPUT:-}" | grep -E "^(FAIL|--- FAIL)" || true
  100. fi
  101. echo -e "${CYAN}============================================${NC}"
  102. exit $TEST_EXIT