#!/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 "测试完成!"