验收:覆盖率改用 -coverpkg 口径,新增关键页冒烟
This commit is contained in:
+48
-3
@@ -5,7 +5,9 @@
|
||||
# ./scripts/verify.sh # 全量验收(默认,约 8 分钟)
|
||||
# ./scripts/verify.sh --fast # 只做 gofmt / vet / build(约 20 秒)
|
||||
# ./scripts/verify.sh --race # 全量 + -race(更慢,需 mingw 在 PATH)
|
||||
# ./scripts/verify.sh --cover # 全量 + 覆盖率
|
||||
# ./scripts/verify.sh --cover # 全量 + 覆盖率(跨包口径,见下)
|
||||
# ./scripts/verify.sh --smoke # 只跑关键页冒烟(需站点已在 --base 上运行)
|
||||
# ./scripts/verify.sh --all # 全量 + 冒烟
|
||||
# ./scripts/verify.sh --pkg ./internal/web/ --run 'TestMapPreview' # 定点跑
|
||||
#
|
||||
# 退出码:0 = 全绿且 0 skip;非 0 = 有失败或有跳过。
|
||||
@@ -24,14 +26,17 @@ FOG_SRC="${FOG_SRC:-$ABS/data/Snapshot-20260914T154839+0800.fwss}"
|
||||
OUT="$ABS/storage/.verify"
|
||||
CLEAN_OUT="$OUT/acceptance-clean.rondbackup"
|
||||
LOG="$OUT/verify.log"
|
||||
COVOUT="$OUT/cover.out"
|
||||
|
||||
FAST=0; RACE=0; COVER=0; PKGS="./..."; RUN=""
|
||||
FAST=0; RACE=0; COVER=0; SMOKE=0; SMOKE_ONLY=0; PKGS="./..."; RUN=""
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--fast) FAST=1 ;;
|
||||
--race) RACE=1 ;;
|
||||
--cover) COVER=1 ;;
|
||||
--smoke) SMOKE=1; SMOKE_ONLY=1 ;;
|
||||
--all) SMOKE=1 ;;
|
||||
--pkg) PKGS="${2:?--pkg 后面要给包路径}"; shift ;;
|
||||
--run) RUN="${2:?--run 后面要给正则}"; shift ;;
|
||||
*) echo "未知参数:$1" >&2; exit 2 ;;
|
||||
@@ -44,6 +49,19 @@ ok() { echo "✓ $*"; }
|
||||
|
||||
echo "== 仓库:$ROOT"
|
||||
|
||||
# 冒烟单独跑:它要一个真在跑的站点(浏览器口径),跟单元测试是两回事
|
||||
run_smoke() {
|
||||
local py="${ROND_PY:-python}"
|
||||
command -v "$py" >/dev/null 2>&1 || py="${ROND_PY:-python3}"
|
||||
command -v "$py" >/dev/null 2>&1 || fail "找不到 python(可用 ROND_PY 指定)"
|
||||
echo "== 冒烟:关键页渲染(站长浏览器 + 访客 HTTP/浏览器)"
|
||||
# 路径必须给 Windows 形式:这里传的是 Git Bash 的 $ROOT(/c/...),
|
||||
# Windows 版 python 会把它拼成 C:\c\... 然后报 No such file
|
||||
"$py" "$ABS/scripts/smoke.py" --base "${ROND_BASE:-http://localhost:8080}" \
|
||||
--shot-dir "$OUT/smoke" || fail "关键页冒烟"
|
||||
ok "关键页冒烟"
|
||||
}
|
||||
|
||||
if [ "$FAST" = 1 ]; then
|
||||
unformatted="$(gofmt -l internal/ main.go 2>&1)"
|
||||
[ -n "$unformatted" ] && fail "gofmt 不干净(注意 CRLF 会假警):$(echo "$unformatted" | tr '\n' ' ')"
|
||||
@@ -55,6 +73,11 @@ if [ "$FAST" = 1 ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "$SMOKE_ONLY" = 1 ]; then
|
||||
run_smoke
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# --- 六个环境变量 ---------------------------------------------------------------
|
||||
[ -f "$CONF" ] || fail "找不到 $CONF"
|
||||
[ -f "$ROND_SRC" ] || fail "找不到备份包 ROND_SRC=$ROND_SRC"
|
||||
@@ -82,7 +105,10 @@ echo "== 库:$DBNAME 备份:$(basename "$ROND_SRC") / $(basename "$FOG_SRC
|
||||
|
||||
GOFLAGS_EXTRA=""
|
||||
[ "$RACE" = 1 ] && GOFLAGS_EXTRA="$GOFLAGS_EXTRA -race"
|
||||
[ "$COVER" = 1 ] && GOFLAGS_EXTRA="$GOFLAGS_EXTRA -cover"
|
||||
# 必须 -coverpkg:-cover 只统计「测试文件所在包」自己的执行,凡是主要由别的包驱动的
|
||||
# 代码(rond 的导出被 internal/web 驱动、geo/gpx/notes/votes 被 web/stats 驱动)
|
||||
# 一律假报 0%,看着像没测,其实是量错了。
|
||||
[ "$COVER" = 1 ] && GOFLAGS_EXTRA="$GOFLAGS_EXTRA -coverpkg=./internal/... -coverprofile=$COVOUT"
|
||||
|
||||
if [ "$RACE" = 1 ] && command -v gcc >/dev/null 2>&1; then :; else
|
||||
for d in "$HOME/scoop/apps/mingw/current/bin"; do
|
||||
@@ -135,3 +161,22 @@ if [ "$SKIP" != 0 ]; then
|
||||
fail "有 $SKIP 个用例被跳过 ⇒ 这次不算验收过"
|
||||
fi
|
||||
ok "全绿且 0 skip(PASS=$PASS)"
|
||||
|
||||
if [ "$COVER" = 1 ] && [ -s "$COVOUT" ]; then
|
||||
echo "== 覆盖率(按包,跨包执行已计入)"
|
||||
# 必须按 (文件,行段) 取 max 而不是求和:-coverpkg 下每个测试二进制都会给同一段代码
|
||||
# 写一条记录,求和等于把语句数乘上二进制份数,每包都会看着只有 1/N。
|
||||
awk 'NR>1 { key=$1; n=$(NF-1); c=$NF+0
|
||||
if (!(key in seen)) seen[key]=c; else if (c>seen[key]) seen[key]=c
|
||||
stmt[key]=n; split(key,a,":"); pkg=a[1]; sub(/\/[^/]+$/,"",pkg); pk[key]=pkg }
|
||||
END { for (k in stmt) { p=pk[k]; tot[p]+=stmt[k]; if (seen[k]>0) cov[p]+=stmt[k] }
|
||||
for (p in tot) printf " %-36s %5.1f%% %d/%d\n", p, 100*cov[p]/tot[p], cov[p], tot[p] }' \
|
||||
"$COVOUT" | sort -k2 -n
|
||||
echo -n " == 项目合计 "
|
||||
go tool cover -func="$COVOUT" | tail -1
|
||||
echo " 明细:go tool cover -html=$COVOUT"
|
||||
fi
|
||||
|
||||
if [ "$SMOKE" = 1 ]; then
|
||||
run_smoke
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user