#!/usr/bin/env bash set -euo pipefail PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$PROJECT_DIR" RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' TIMEOUT="${TEST_TIMEOUT:-600s}" COUNT="${TEST_COUNT:-1}" VERBOSE="${TEST_VERBOSE:-}" PACKAGE="${1:-./...}" print_usage() { echo "Usage: $0 [package] [options]" echo "" echo "Examples:" echo " $0 # 运行全部测试" echo " $0 ./internal/model/... # 只运行 model 层测试" echo " $0 ./internal/logic/auth # 只运行 auth logic 测试" echo "" echo "Environment variables:" echo " TEST_TIMEOUT=600s 超时时间 (default: 600s)" echo " TEST_COUNT=1 运行次数 (default: 1)" echo " TEST_VERBOSE=1 详细输出 (default: off)" echo " TEST_RUN=TestName 只运行匹配的测试函数" } if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then print_usage exit 0 fi echo -e "${CYAN}============================================${NC}" echo -e "${CYAN} Perms System Server - Test Runner${NC}" echo -e "${CYAN}============================================${NC}" echo "" # 前置检查: MySQL 和 Redis 连通性 echo -e "${YELLOW}[检查] 验证 MySQL 连接...${NC}" if mysql -u root -p'NsDmWyM@312' -h 127.0.0.1 -P 3306 -e "SELECT 1" perms_system &>/dev/null; then echo -e "${GREEN} ✓ MySQL 连接正常${NC}" else echo -e "${RED} ✗ MySQL 连接失败 (127.0.0.1:3306/perms_system)${NC}" echo -e "${RED} 请确认 MySQL 正在运行且密码正确${NC}" exit 1 fi echo -e "${YELLOW}[检查] 验证 Redis 连接...${NC}" if redis-cli -h 127.0.0.1 -p 6379 -a 'NsDmWyM@312' ping 2>/dev/null | grep -q PONG; then echo -e "${GREEN} ✓ Redis 连接正常${NC}" else echo -e "${RED} ✗ Redis 连接失败 (127.0.0.1:6379)${NC}" echo -e "${RED} 请确认 Redis 正在运行且密码正确${NC}" exit 1 fi echo "" # 构建参数 ARGS=(-count="$COUNT" -timeout="$TIMEOUT") if [[ -n "$VERBOSE" ]]; then ARGS+=(-v) fi if [[ -n "${TEST_RUN:-}" ]]; then ARGS+=(-run "$TEST_RUN") fi echo -e "${YELLOW}[编译] 检查代码编译...${NC}" if ! go build ./... 2>&1; then echo -e "${RED} ✗ 编译失败${NC}" exit 1 fi echo -e "${GREEN} ✓ 编译通过${NC}" echo "" echo -e "${YELLOW}[测试] 运行测试: ${PACKAGE}${NC}" echo -e "${YELLOW} 参数: ${ARGS[*]}${NC}" echo "" START_TIME=$(date +%s) if [[ -n "$VERBOSE" ]]; then go test "$PACKAGE" "${ARGS[@]}" 2>&1 TEST_EXIT=$? else OUTPUT=$(go test "$PACKAGE" "${ARGS[@]}" 2>&1) TEST_EXIT=$? echo "$OUTPUT" fi END_TIME=$(date +%s) ELAPSED=$((END_TIME - START_TIME)) echo "" echo -e "${CYAN}============================================${NC}" if [[ $TEST_EXIT -eq 0 ]]; then # 统计通过的包数 if [[ -n "$VERBOSE" ]]; then PASS_COUNT=$(go test "$PACKAGE" "${ARGS[@]}" 2>&1 | grep -c "^--- PASS:" || true) echo -e "${GREEN} ✓ 全部测试通过 (${ELAPSED}s)${NC}" else PASS_PKG=$(echo "$OUTPUT" | grep -c "^ok" || true) echo -e "${GREEN} ✓ 全部测试通过 ${PASS_PKG} 个包 (${ELAPSED}s)${NC}" fi else FAIL_PKG=$(echo "${OUTPUT:-}" | grep -c "^FAIL" || true) echo -e "${RED} ✗ 测试失败 ${FAIL_PKG} 个包 (${ELAPSED}s)${NC}" echo "" echo -e "${RED}失败详情:${NC}" echo "${OUTPUT:-}" | grep -E "^(FAIL|--- FAIL)" || true fi echo -e "${CYAN}============================================${NC}" exit $TEST_EXIT