#!/usr/bin/env bash # 全量测试:逐个包跑完(不在第一个失败处停),最后汇总;连不上测试库直接失败,不让数据库用例静默跳过。 # 用法:sh scripts/test-all.sh [包目录...] 缺省跑全部 workspace 成员 # web 用 Node 跑 vitest(Deno 跑 web 的 vitest 有兼容问题)。 set -u cd "$(dirname "$0")/.." ROOT=$PWD if [ -f .env ]; then set -a; . ./.env; set +a; fi DB_URL=${DATABASE_URL:-postgres://umt:umt@localhost:55433/umt} if [ "${UMT_SKIP_DB_TESTS:-}" != "1" ]; then if ! deno eval --quiet " import pg from 'npm:pg@8.23.1'; const c = new pg.Client({ connectionString: '$DB_URL', connectionTimeoutMillis: 3000 }); await c.connect(); await c.end();" >/dev/null 2>&1; then echo "✗ 连不上测试库($DB_URL)。先 deno task dev:up;确实不跑数据库用例时设 UMT_SKIP_DB_TESTS=1" >&2 exit 2 fi fi members=("$@") [ ${#members[@]} -eq 0 ] && members=(packages/adapters packages/agent packages/contracts packages/db packages/domain packages/mapping packages/tasks packages/testkit apps/server apps/web) LOG_DIR=${TEST_LOG_DIR:-$ROOT/.local/test-logs} mkdir -p "$LOG_DIR" failed=() summary=() for m in "${members[@]}"; do log="$LOG_DIR/$(echo "$m" | tr / -).log" printf '▶ %-20s ' "$m" if [ "$m" = apps/web ]; then (cd "$m" && "$ROOT/node_modules/.bin/vitest" run) >"$log" 2>&1 else (cd "$m" && deno run -A npm:vitest run) >"$log" 2>&1 fi code=$? line=$(sed 's/\x1b\[[0-9;]*m//g' "$log" | grep -E '^\s+Tests ' | tail -1 | tr -s ' ') if [ $code -eq 0 ]; then echo "✓ ${line:-}"; else echo "✗ ${line:-退出码 $code}"; failed+=("$m"); fi summary+=("$m:${line:-exit $code}") done echo if [ ${#failed[@]} -eq 0 ]; then echo "全部通过(日志 $LOG_DIR)" else echo "失败:${failed[*]}" for m in "${failed[@]}"; do echo "── $m" sed 's/\x1b\[[0-9;]*m//g' "$LOG_DIR/$(echo "$m" | tr / -).log" | grep -E '(FAIL|×) ' | head -10 done exit 1 fi