51 lines
1.8 KiB
Bash
51 lines
1.8 KiB
Bash
#!/usr/bin/env bash
|
||
# 全量测试:逐个包跑完(不在第一个失败处停),最后汇总;连不上测试库直接失败,不让数据库用例静默跳过。
|
||
# 用法:sh scripts/test-all.sh [包目录...] 缺省跑全部 workspace 成员
|
||
# 全部包使用 Bun 运行 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 ! DATABASE_URL="$DB_URL" bun -e "
|
||
import pg from 'pg';
|
||
const c = new pg.Client({ connectionString: process.env.DATABASE_URL, connectionTimeoutMillis: 3000 });
|
||
await c.connect(); await c.end();" >/dev/null 2>&1; then
|
||
echo "✗ 连不上测试库($DB_URL)。先 bun run dev:up;确实不跑数据库用例时设 UMT_SKIP_DB_TESTS=1" >&2
|
||
exit 2
|
||
fi
|
||
fi
|
||
|
||
members=("$@")
|
||
[ ${#members[@]} -eq 0 ] && members=(packages/runtime 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"
|
||
(cd "$m" && bun --bun "$ROOT/node_modules/vitest/vitest.mjs" run) >"$log" 2>&1
|
||
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
|