193 lines
6.3 KiB
Bash
Executable File
193 lines
6.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# =============================================================================
|
||
# Fischer AgentKit — 一键测试环境脚本
|
||
# =============================================================================
|
||
#
|
||
# 启动完整测试环境:后端 API + E2E 测试(使用独立端口,不影响开发环境)
|
||
#
|
||
# 用法:
|
||
# bash scripts/test-start.sh # 启动测试环境并运行全部测试
|
||
# bash scripts/test-start.sh --unit # 仅单元测试
|
||
# bash scripts/test-start.sh --e2e # 仅 E2E 测试
|
||
# bash scripts/test-start.sh --bitable # 仅 bitable 模块测试
|
||
# bash scripts/test-start.sh --skip-server # 跳过服务启动(使用已有服务)
|
||
# bash scripts/test-start.sh --help # 帮助
|
||
# =============================================================================
|
||
|
||
set -euo pipefail
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||
cd "$PROJECT_ROOT"
|
||
|
||
: "${E2E_PORT:=18765}"
|
||
: "${E2E_API_KEY:=ak_live_e2e_test_key_000000000000000000000000000000000000000000000000}"
|
||
|
||
# ── 颜色 ────────────────────────────────────────────────────────────────────
|
||
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
CYAN='\033[0;36m'
|
||
NC='\033[0m'
|
||
|
||
# ── 帮助 ────────────────────────────────────────────────────────────────────
|
||
|
||
show_help() {
|
||
cat <<-'EOF'
|
||
Fischer AgentKit — 测试环境
|
||
|
||
用法: bash scripts/test-start.sh [选项]
|
||
|
||
选项:
|
||
--unit 仅运行单元测试(pytest -m "not integration")
|
||
--e2e 仅运行 E2E 测试
|
||
--bitable 仅运行 bitable 模块测试
|
||
--skip-server 跳过服务启动(使用已有服务)
|
||
--help 显示帮助
|
||
|
||
环境变量:
|
||
E2E_PORT 测试服务器端口(默认: 18765)
|
||
E2E_API_KEY 测试 API Key(默认: 内置测试 Key)
|
||
EOF
|
||
}
|
||
|
||
# ── 参数解析 ────────────────────────────────────────────────────────────────
|
||
|
||
RUN_MODE="all"
|
||
SKIP_SERVER=0
|
||
|
||
while [[ $# -gt 0 ]]; do
|
||
case $1 in
|
||
--unit) RUN_MODE="unit"; shift ;;
|
||
--e2e) RUN_MODE="e2e"; shift ;;
|
||
--bitable) RUN_MODE="bitable"; shift ;;
|
||
--skip-server) SKIP_SERVER=1; shift ;;
|
||
--help|-h) show_help; exit 0 ;;
|
||
*) shift ;;
|
||
esac
|
||
done
|
||
|
||
# ── 日志函数 ────────────────────────────────────────────────────────────────
|
||
|
||
info() { echo -e "${BLUE}[INFO]${NC} $*"; }
|
||
ok() { echo -e "${GREEN}[OK]${NC} $*"; }
|
||
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
||
fail() { echo -e "${RED}[FAIL]${NC} $*"; }
|
||
|
||
# ── 服务管理 ────────────────────────────────────────────────────────────────
|
||
|
||
start_test_server() {
|
||
if [[ $SKIP_SERVER -eq 1 ]]; then
|
||
info "SKIP_SERVER=1,跳过服务启动"
|
||
return 0
|
||
fi
|
||
|
||
info "启动测试服务器(端口 $E2E_PORT)..."
|
||
if lsof -i :$E2E_PORT 2>/dev/null | grep -q LISTEN; then
|
||
ok "测试服务器已在端口 $E2E_PORT 运行"
|
||
return 0
|
||
fi
|
||
|
||
export AGENTKIT_E2E_MODE=1
|
||
export AGENTKIT_WS_TIMEOUT=0
|
||
export AGENTKIT_API_KEY="$E2E_API_KEY"
|
||
|
||
source .venv/bin/activate 2>/dev/null || true
|
||
python3 -m agentkit.cli.main serve --host 127.0.0.1 --port "$E2E_PORT" &
|
||
SERVER_PID=$!
|
||
|
||
# 等待就绪
|
||
local attempt=0
|
||
while [[ $attempt -lt 60 ]]; do
|
||
if curl -sf "http://127.0.0.1:$E2E_PORT/api/v1/health" &>/dev/null; then
|
||
ok "测试服务器就绪 (PID $SERVER_PID,端口 $E2E_PORT)"
|
||
return 0
|
||
fi
|
||
sleep 0.5
|
||
((attempt++))
|
||
done
|
||
|
||
fail "测试服务器启动超时"
|
||
kill $SERVER_PID 2>/dev/null || true
|
||
exit 1
|
||
}
|
||
|
||
stop_test_server() {
|
||
if [[ $SKIP_SERVER -eq 1 ]]; then return 0; fi
|
||
PID=$(lsof -ti :$E2E_PORT 2>/dev/null || true)
|
||
if [[ -n "$PID" ]]; then
|
||
kill $PID 2>/dev/null && ok "测试服务器已停止" || true
|
||
fi
|
||
}
|
||
|
||
# ── 测试执行 ────────────────────────────────────────────────────────────────
|
||
|
||
run_unit_tests() {
|
||
info "运行单元测试..."
|
||
source .venv/bin/activate 2>/dev/null || true
|
||
pytest -m "not integration" -q --tb=short
|
||
ok "单元测试完成"
|
||
}
|
||
|
||
run_bitable_tests() {
|
||
info "运行 bitable 模块测试..."
|
||
source .venv/bin/activate 2>/dev/null || true
|
||
pytest tests/unit/bitable/ -v --tb=short
|
||
ok "bitable 测试完成"
|
||
}
|
||
|
||
run_e2e_tests() {
|
||
info "运行 E2E 测试..."
|
||
FE_DIR="$PROJECT_ROOT/src/agentkit/server/frontend"
|
||
cd "$FE_DIR"
|
||
|
||
if [[ ! -d node_modules ]]; then
|
||
info "安装前端依赖..."
|
||
npm install
|
||
fi
|
||
|
||
export AGENTKIT_SERVER_URL="http://127.0.0.1:$E2E_PORT"
|
||
export AGENTKIT_API_KEY="$E2E_API_KEY"
|
||
|
||
npm run test:e2e
|
||
ok "E2E 测试完成"
|
||
cd "$PROJECT_ROOT"
|
||
}
|
||
|
||
# ── 主流程 ─────────────────────────────────────────────────────────────────
|
||
|
||
echo ""
|
||
echo -e "${CYAN}═══════════════════════════════════════════════════${NC}"
|
||
echo -e "${CYAN} Fischer AgentKit — 测试环境${NC}"
|
||
echo -e "${CYAN}═══════════════════════════════════════════════════${NC}"
|
||
echo ""
|
||
|
||
trap stop_test_server EXIT INT TERM
|
||
|
||
case $RUN_MODE in
|
||
unit)
|
||
run_unit_tests
|
||
;;
|
||
e2e)
|
||
start_test_server
|
||
run_e2e_tests
|
||
;;
|
||
bitable)
|
||
run_bitable_tests
|
||
;;
|
||
all)
|
||
info "运行全部测试..."
|
||
run_unit_tests
|
||
echo ""
|
||
run_bitable_tests
|
||
echo ""
|
||
start_test_server
|
||
run_e2e_tests
|
||
;;
|
||
esac
|
||
|
||
echo ""
|
||
ok "测试完成!"
|