2026-03-02 13:31:54 +08:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
|
|
|
|
# 🦟 蚊子项目 E2E测试启动脚本
|
|
|
|
|
|
# 同时启动前后端服务并运行E2E测试
|
|
|
|
|
|
|
|
|
|
|
|
set -e
|
|
|
|
|
|
|
|
|
|
|
|
echo "🚀 蚊子项目 E2E测试启动器"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
# 颜色定义
|
|
|
|
|
|
RED='\033[0;31m'
|
|
|
|
|
|
GREEN='\033[0;32m'
|
|
|
|
|
|
YELLOW='\033[1;33m'
|
|
|
|
|
|
NC='\033[0m' # No Color
|
|
|
|
|
|
|
|
|
|
|
|
# 检查端口占用
|
|
|
|
|
|
check_port() {
|
|
|
|
|
|
local port=$1
|
|
|
|
|
|
if lsof -i :$port > /dev/null 2>&1; then
|
|
|
|
|
|
echo -e "${RED}❌ 端口 $port 已被占用${NC}"
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
return 0
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 清理函数
|
|
|
|
|
|
cleanup() {
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo -e "${YELLOW}🧹 清理进程中...${NC}"
|
|
|
|
|
|
|
|
|
|
|
|
# 杀死后端进程
|
|
|
|
|
|
if [ -n "$BACKEND_PID" ]; then
|
|
|
|
|
|
kill $BACKEND_PID 2>/dev/null || true
|
|
|
|
|
|
echo " 后端进程已停止"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 杀死前端进程
|
|
|
|
|
|
if [ -n "$FRONTEND_PID" ]; then
|
|
|
|
|
|
kill $FRONTEND_PID 2>/dev/null || true
|
|
|
|
|
|
echo " 前端进程已停止"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
echo -e "${GREEN}✅ 清理完成${NC}"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 注册清理函数
|
|
|
|
|
|
trap cleanup EXIT INT TERM
|
|
|
|
|
|
|
|
|
|
|
|
# 检查必要命令
|
|
|
|
|
|
command -v mvn >/dev/null 2>&1 || { echo -e "${RED}❌ 需要Maven (mvn)${NC}"; exit 1; }
|
|
|
|
|
|
command -v node >/dev/null 2>&1 || { echo -e "${RED}❌ 需要Node.js${NC}"; exit 1; }
|
|
|
|
|
|
command -v npm >/dev/null 2>&1 || { echo -e "${RED}❌ 需要npm${NC}"; exit 1; }
|
|
|
|
|
|
|
|
|
|
|
|
# 检查端口
|
|
|
|
|
|
echo "🔍 检查端口..."
|
|
|
|
|
|
check_port 8080 || exit 1
|
|
|
|
|
|
check_port 5173 || exit 1
|
|
|
|
|
|
echo -e "${GREEN} ✅ 端口可用${NC}"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
# 获取项目根目录
|
|
|
|
|
|
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
|
|
|
|
FRONTEND_DIR="$PROJECT_ROOT/frontend"
|
|
|
|
|
|
|
|
|
|
|
|
echo "📂 项目目录: $PROJECT_ROOT"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
# 步骤1: 编译后端
|
|
|
|
|
|
echo "📦 步骤1: 编译后端..."
|
|
|
|
|
|
cd "$PROJECT_ROOT"
|
|
|
|
|
|
mvn clean compile -q -DskipTests
|
|
|
|
|
|
if [ $? -eq 0 ]; then
|
|
|
|
|
|
echo -e "${GREEN} ✅ 后端编译成功${NC}"
|
|
|
|
|
|
else
|
|
|
|
|
|
echo -e "${RED} ❌ 后端编译失败${NC}"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
# 步骤2: 启动后端服务
|
|
|
|
|
|
echo "🚀 步骤2: 启动后端服务..."
|
|
|
|
|
|
cd "$PROJECT_ROOT"
|
|
|
|
|
|
mvn spring-boot:run -Dspring-boot.run.profiles=e2e -Dspring-boot.run.jvmArguments="-Xmx512m" > /tmp/mosquito-backend.log 2>&1 &
|
|
|
|
|
|
BACKEND_PID=$!
|
|
|
|
|
|
echo " 后端PID: $BACKEND_PID"
|
|
|
|
|
|
echo " 日志: /tmp/mosquito-backend.log"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
# 等待后端启动
|
|
|
|
|
|
echo "⏳ 等待后端服务就绪..."
|
|
|
|
|
|
for i in {1..60}; do
|
|
|
|
|
|
if curl -s http://localhost:8080/api/v1/activities > /dev/null 2>&1; then
|
|
|
|
|
|
echo -e "${GREEN} ✅ 后端服务已就绪${NC}"
|
|
|
|
|
|
break
|
|
|
|
|
|
fi
|
|
|
|
|
|
if [ $i -eq 60 ]; then
|
|
|
|
|
|
echo -e "${RED} ❌ 后端服务启动超时${NC}"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
echo -n "."
|
|
|
|
|
|
sleep 2
|
|
|
|
|
|
done
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
# 步骤3: 安装前端依赖
|
|
|
|
|
|
echo "📦 步骤3: 安装前端依赖..."
|
|
|
|
|
|
cd "$FRONTEND_DIR"
|
|
|
|
|
|
npm install --silent
|
|
|
|
|
|
echo -e "${GREEN} ✅ 前端依赖已安装${NC}"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
# 步骤4: 启动前端服务
|
|
|
|
|
|
echo "🚀 步骤4: 启动前端服务..."
|
|
|
|
|
|
cd "$FRONTEND_DIR"
|
|
|
|
|
|
npm run dev -- --port 5173 > /tmp/mosquito-frontend.log 2>&1 &
|
|
|
|
|
|
FRONTEND_PID=$!
|
|
|
|
|
|
echo " 前端PID: $FRONTEND_PID"
|
|
|
|
|
|
echo " 日志: /tmp/mosquito-frontend.log"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
# 等待前端启动
|
|
|
|
|
|
echo "⏳ 等待前端服务就绪..."
|
|
|
|
|
|
for i in {1..30}; do
|
|
|
|
|
|
if curl -s http://localhost:5173 > /dev/null 2>&1; then
|
|
|
|
|
|
echo -e "${GREEN} ✅ 前端服务已就绪${NC}"
|
|
|
|
|
|
break
|
|
|
|
|
|
fi
|
|
|
|
|
|
if [ $i -eq 30 ]; then
|
|
|
|
|
|
echo -e "${RED} ❌ 前端服务启动超时${NC}"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
echo -n "."
|
|
|
|
|
|
sleep 1
|
|
|
|
|
|
done
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
# 步骤5: 运行E2E测试
|
|
|
|
|
|
echo "🎭 步骤5: 运行E2E测试..."
|
|
|
|
|
|
echo " 后端地址: http://localhost:8080"
|
|
|
|
|
|
echo " 前端地址: http://localhost:5173"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
cd "$FRONTEND_DIR"
|
|
|
|
|
|
|
|
|
|
|
|
# 设置环境变量
|
|
|
|
|
|
export API_BASE_URL=http://localhost:8080
|
|
|
|
|
|
export PLAYWRIGHT_BASE_URL=http://localhost:5173
|
|
|
|
|
|
|
|
|
|
|
|
# 运行Playwright测试
|
|
|
|
|
|
echo " 正在运行Playwright E2E测试..."
|
|
|
|
|
|
npx playwright test --reporter=list "$@"
|
|
|
|
|
|
TEST_EXIT_CODE=$?
|
|
|
|
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
if [ $TEST_EXIT_CODE -eq 0 ]; then
|
|
|
|
|
|
echo -e "${GREEN}✅ E2E测试通过!${NC}"
|
|
|
|
|
|
else
|
|
|
|
|
|
echo -e "${RED}❌ E2E测试失败${NC}"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "📊 查看报告:"
|
2026-03-23 13:02:36 +08:00
|
|
|
|
echo " Playwright报告: npx playwright show-report e2e/e2e-report"
|
2026-03-02 13:31:54 +08:00
|
|
|
|
echo " 后端日志: tail -100 /tmp/mosquito-backend.log"
|
|
|
|
|
|
echo " 前端日志: tail -100 /tmp/mosquito-frontend.log"
|
|
|
|
|
|
|
|
|
|
|
|
exit $TEST_EXIT_CODE
|