Files
PrivyDrop/test-health-apis.sh
T
2025-09-26 14:02:55 +08:00

218 lines
5.6 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 测试结果统计
TESTS_PASSED=0
TESTS_FAILED=0
TOTAL_TESTS=0
# 日志函数
log_info() {
echo -e "${BLUE}$1${NC}"
}
log_success() {
echo -e "${GREEN}$1${NC}"
TESTS_PASSED=$((TESTS_PASSED + 1))
}
log_error() {
echo -e "${RED}$1${NC}"
TESTS_FAILED=$((TESTS_FAILED + 1))
}
log_warning() {
echo -e "${YELLOW}⚠️ $1${NC}"
}
# 测试函数
test_api() {
local url="$1"
local description="$2"
local expected_status="${3:-200}"
TOTAL_TESTS=$((TOTAL_TESTS + 1))
echo ""
log_info "测试: $description"
log_info "URL: $url"
# 发送请求并获取响应
response=$(curl -s -w "\n%{http_code}" "$url" 2>/dev/null)
if [ $? -ne 0 ]; then
log_error "请求失败 - 无法连接到服务"
return 1
fi
# 分离响应体和状态码
http_code=$(echo "$response" | tail -n1)
response_body=$(echo "$response" | head -n -1)
# 检查HTTP状态码
if [ "$http_code" -eq "$expected_status" ]; then
log_success "HTTP状态码正确: $http_code"
else
log_error "HTTP状态码错误: 期望 $expected_status, 实际 $http_code"
return 1
fi
# 检查JSON格式
if echo "$response_body" | jq . >/dev/null 2>&1; then
log_success "响应格式为有效JSON"
# 显示格式化的JSON响应
echo -e "${BLUE}响应内容:${NC}"
echo "$response_body" | jq .
# 检查必要字段
status=$(echo "$response_body" | jq -r '.status // empty')
service=$(echo "$response_body" | jq -r '.service // empty')
timestamp=$(echo "$response_body" | jq -r '.timestamp // empty')
if [ -n "$status" ] && [ -n "$service" ] && [ -n "$timestamp" ]; then
log_success "包含必要字段: status, service, timestamp"
else
log_error "缺少必要字段"
return 1
fi
else
log_error "响应不是有效的JSON格式"
echo "响应内容: $response_body"
return 1
fi
return 0
}
# 检查服务是否运行
check_service() {
local port="$1"
local service_name="$2"
if nc -z localhost "$port" 2>/dev/null; then
log_success "$service_name 服务运行中 (端口 $port)"
return 0
else
log_error "$service_name 服务未运行 (端口 $port)"
return 1
fi
}
# 等待服务启动
wait_for_service() {
local port="$1"
local service_name="$2"
local max_attempts=30
local attempt=0
log_info "等待 $service_name 服务启动..."
while [ $attempt -lt $max_attempts ]; do
if nc -z localhost "$port" 2>/dev/null; then
log_success "$service_name 服务已启动"
return 0
fi
attempt=$((attempt + 1))
echo -n "."
sleep 2
done
log_error "$service_name 服务启动超时"
return 1
}
# 主测试函数
main() {
echo -e "${BLUE}=== PrivyDrop 健康检查API测试 ===${NC}"
echo ""
# 检查必要工具
if ! command -v curl &> /dev/null; then
log_error "curl 未安装,请先安装 curl"
exit 1
fi
if ! command -v jq &> /dev/null; then
log_error "jq 未安装,请先安装 jq 用于JSON解析"
exit 1
fi
if ! command -v nc &> /dev/null; then
log_error "netcat 未安装,请先安装 nc 用于端口检查"
exit 1
fi
# 检查服务状态
echo -e "${BLUE}=== 检查服务状态 ===${NC}"
backend_running=false
frontend_running=false
if check_service 3001 "后端"; then
backend_running=true
fi
if check_service 3002 "前端"; then
frontend_running=true
fi
# 如果服务未运行,提供启动提示
if [ "$backend_running" = false ]; then
echo ""
log_warning "后端服务未运行,请先启动后端服务:"
echo " cd backend && npm run dev"
echo ""
fi
if [ "$frontend_running" = false ]; then
echo ""
log_warning "前端服务未运行,请先启动前端服务:"
echo " cd frontend && pnpm dev"
echo ""
fi
# 测试后端健康检查API
if [ "$backend_running" = true ]; then
echo -e "${BLUE}=== 测试后端健康检查API ===${NC}"
test_api "http://localhost:3001/health" "后端基础健康检查"
test_api "http://localhost:3001/api/health" "后端API路径健康检查"
test_api "http://localhost:3001/health/detailed" "后端详细健康检查"
fi
# 测试前端健康检查API
if [ "$frontend_running" = true ]; then
echo -e "${BLUE}=== 测试前端健康检查API ===${NC}"
test_api "http://localhost:3002/api/health" "前端基础健康检查"
test_api "http://localhost:3002/api/health/detailed" "前端详细健康检查"
fi
# 测试结果汇总
echo ""
echo -e "${BLUE}=== 测试结果汇总 ===${NC}"
echo "总测试数: $TOTAL_TESTS"
echo -e "通过: ${GREEN}$TESTS_PASSED${NC}"
echo -e "失败: ${RED}$TESTS_FAILED${NC}"
if [ $TESTS_FAILED -eq 0 ]; then
echo -e "${GREEN}🎉 所有测试通过!${NC}"
exit 0
else
echo -e "${RED}❌ 有 $TESTS_FAILED 个测试失败${NC}"
exit 1
fi
}
# 捕获中断信号
trap 'echo -e "\n${YELLOW}测试被中断${NC}"; exit 1' INT TERM
# 运行主函数
main "$@"