#!/usr/bin/env bash # 一键跑完所有回归测试(PHP 单元自测 + Node e2e)。 # 用法:bash tests/run-all.sh set -e cd "$(dirname "$0")/.." # 运行期路径:优先用环境变量,其次用本机工作区路径,最后退回 PATH 里的 php / node # (工作区 node 的版本目录会随升级变化,写死路径会直接 No such file or directory) pick() { local cand="$1" fallback="$2" if [ -n "$cand" ] && [ -x "$cand" ]; then echo "$cand"; return; fi command -v "$fallback" 2>/dev/null || echo "$fallback" } # 本项目用 PHP 7.4+ 语法(箭头函数 / 类型化属性),必须是 PHP 8; # 工作区里已备好便携版 8.2.34(其 php.ini 已开启 pdo_sqlite / zip / mbstring), # 想换别的解释器就设 PHP_BIN=... 覆盖 PHP="$(pick "${PHP_BIN:-C:/Users/Zhang/.workbuddy/binaries/php/8.2.34/php.exe}" php)" NODE="$(pick "${NODE_BIN:-}" node)" INI="${PHP_INI:-}" echo "PHP = $PHP" echo "NODE = $NODE" echo "================ PHP 自测 ================" for f in tests/test-aggregate.php tests/test-new-features.php tests/test-config-persist.php tools/test-xlsxwriter.php tests/test-multi-export.php; do echo "" echo ">>> $f" "$PHP" $INI "$f" done echo "" echo "================ Node e2e(需 mock-server + PHP 内置服务器) ================" # e2e 会把 mock 连接配置写进数据目录;用 NY_DATA 把这两个会改写配置的测试整体指向临时目录, # 彻底避免污染生产 data/ny.db(曾因此把登录页连接信息写成 127.0.0.1)。 NY_DATA_TMP="$(pwd)/.ny-test-data" mkdir -p "$NY_DATA_TMP" # 说明:test-login-loop.js 会清空数据目录里的账密来复现"未配置账号"现场, # 即使不传 NY_DATA 它也会自己建临时目录,绝不回退到项目 data/。 # 这几段依赖 mock-server(dashboard-nav 自带名单,另 4 段需本机 data/roster.json)。 # 逐段容错,避免一个坏掉的环境把后面的测试整段带走;失败照常记账,末尾统一汇总退出码。 e2e_fail=0 for f in tools/test-config-save.js tools/test-upload-guard.js tools/test-whitelist.js tools/test-login-loop.js tools/test-dashboard-nav.js; do echo "" echo ">>> $f (NY_DATA=$NY_DATA_TMP)" if ! NY_DATA="$NY_DATA_TMP" "$NODE" "$f"; then e2e_fail=$((e2e_fail + 1)); fi done # test-draw-alloc.js 不读写连接配置,沿用项目 data/ 即可 echo "" echo ">>> tools/test-draw-alloc.js" "$NODE" "tools/test-draw-alloc.js" || e2e_fail=$((e2e_fail + 1)) # 多考试打印渲染(纯前端函数,不需要服务器):从 app.js 抽取 sheetToHtml 校验合并单元格换算 echo "" echo ">>> tools/test-block-print.js" "$NODE" "tools/test-block-print.js" || e2e_fail=$((e2e_fail + 1)) echo "" if [ "$e2e_fail" -gt 0 ]; then echo "全部测试跑完,但有 $e2e_fail 个 Node 段失败(多为 mock-server 缺 data/roster.json 导致的环境问题)" exit 1 fi echo "全部测试完成。"