技能|全页面回归冒烟法
适用场景
改动涉及模板拼接(% (...) 占位符漏写最易引发 HTTP 000/500)、路由、权限、数据源,需要一次性确认全站没崩时。触发词:全站冒烟、回归、跑一遍所有页面、改完验一下。
操作步骤
- 起服务并确认单实例:同端口跑两个实例会命中旧代码。先用端口占用检查确认只有一个进程;后台服务用后台启动方式(
run_in_background),别用 shell&(沙箱回收会杀进程)。 - 构造带登录态的会话:从
config.py读账号口令走/loginPOST 拿 Cookie。Cookie 名以代码为准 =hfms_sid(硬编码猜hfms_session会制造几十个假 403)。不要带浏览器 UA / 走系统代理。 - 收集路由全集:从
app.py的分发器(所有elif path == ...分支)+ 模板里的<a href>抽取,别手写清单——手写必漏新增页。 - 逐条请求并记录三件事:① 状态码;② 响应体长度;③ 是否含错误特征串(
Traceback、TypeError、未渲染的占位符 %s/{})。 - 分类判定:
-200但页面极短 / 空 = 隐性失败(模板把异常吞成空页),单独列;
-403先确认是不是权限设计如此(管理页/audit、/settings本应拒绝);
-HTTP 000= 处理线程抛异常中断(多为%格式化漏占位符 / 同步阻塞超时)→ 去看后台标准错误输出,不是网络问题。 - 数据源校验:关键页(如
/docs)与db记录比对,确认documents引用路径有效(缺失文件数 = 0、悬空引用 = 0)。 - 冷启动复测:清缓存重启后再跑一遍,确认不是靠缓存蒙对的。
- 验收口径:错误 0 + 空页面 0 + 悬空引用 0。计数口径要先定:
同源重复/历史版本这类预期内状态不能计进"未处理",否则报告永远差一条。
注意边界
- 测本机地址走直连 HTTP 客户端(如
http.client);常见命令行工具会受系统代理影响报假 502(要加禁用代理参数)。 - 只测 GET,写操作路由不要在冒烟里真跑,会污染真实数据。
反例避雷
- 手写路由清单 → 漏掉新增页面,冒烟覆盖率虚高。
- 猜 Cookie 名 → 满屏假失败,掩盖真实错误。
- 只看状态码 → 模板把异常吞成 200 空页面,漏网。
- 把预期内状态当缺陷 → 计数口径错,报告永远不绿。
- 后台服务被回收后未重启就跑 → 全部超时,误判为系统崩溃。
关联笔记
- [[技能|吞噬异常统一留痕治理法]]
- [[技能|废弃数据源清理三步法]]
- [[技能|Web权限与验密守卫加固法]]
实战战绩
2026-09-28 首跑:197 个页面全量请求,0 错误、0 空页面;documents 的 82 条引用路径全部有效、0 悬空;清缓存冷启动后编号集合与基线 78 条逐条一致、十域齐全。过程中靠"错误特征串"揪出两处模板占位符漏写导致的隐性 500(HTTP 000 的根因)。
V2.0 增补 · 权威实例重启与鉴权守卫实测(2026-09-30)
实操中补两条关键动作,使"全站冒烟"不会测到旧代码、也不会漏掉权限回归:
- 测前重启权威实例(最重要):HFMS 后台进程活不过沙箱回收,且同端口可能残留旧实例——直接测会命中旧代码。标准动作:先用
Get-NetTCPConnection -LocalPort 8765定位监听 PID,Stop-Process -Force强杀旧实例,再从磁盘源码python app.py重拉(run_in_background,别用 shell&);确认单实例后再跑冒烟。宿主进程强杀后会收一条"failed"通知,属预期非真错误。 - 鉴权守卫实测(权限回归):冒烟里加一组鉴权用例——① 错密码
/loginPOST 不签发hfms_sid且回显"密码错误";② 未登录发财务写 POST(如/txn/new)期望403;③ 未登录访问/settings、/audit期望303重定向到/login;④ 用他人 Cookie 直接请求高权限路由期望仍被拦。这四组把"权限闭环"从"声称"变成"实测"。 - 44 项检查全绿:按上述重启 + 路由全集 + 鉴权守卫,十体系台账 / 十域目录 / 财务双入口 / 7 张动态表单 / 76 份制度 / 鉴权守卫逐项过,达成 44 PASS / 0 FAIL。旧报告"5 项失败"经核查均为"测了旧实例 + 测了已删功能 + 断言写错",非代码缺陷。
- ★强杀后立即重启报
disk I/O error的处置(2026-10-13 实测回填):Stop-Process -Force强杀后立刻重启,会偶发sqlite3.OperationalError: disk I/O error(挂在db.init阶段)。这是瞬时错误、不是库损坏,PRAGMA integrity_check= ok。处置顺序:① 先确认 DB 健康;② 原样重试启动一次(实测一次即成功);③ 切勿删 WAL /-shm文件——删了才是真丢数据。把这条写进冒烟前置,避免把"重启时序问题"误判成"数据库坏了"。
V2.0 增补 · 权威实例重启与鉴权守卫实测(2026-09-30)
实操中补两条关键动作,使"全站冒烟"不会测到旧代码、也不会漏掉权限回归:
- 测前重启权威实例(最重要):HFMS 后台进程活不过沙箱回收,且同端口可能残留旧实例——直接测会命中旧代码。标准动作:先用
Get-NetTCPConnection -LocalPort 8765定位监听 PID,Stop-Process -Force强杀旧实例,再从磁盘源码python app.py重拉(run_in_background,别用 shell&);确认单实例后再跑冒烟。宿主进程强杀后会收一条"failed"通知,属预期非真错误。 - 鉴权守卫实测(权限回归):冒烟里加一组鉴权用例——① 错密码
/loginPOST 不签发hfms_sid且回显"密码错误";② 未登录发财务写 POST(如/txn/new)期望403;③ 未登录访问/settings、/audit期望303重定向到/login;④ 用他人 Cookie 直接请求高权限路由期望仍被拦。这四组把"权限闭环"从"声称"变成"实测"。 - 44 项检查全绿:按上述重启 + 路由全集 + 鉴权守卫,十体系台账 / 十域目录 / 财务双入口 / 7 张动态表单 / 76 份制度 / 鉴权守卫逐项过,达成 44 PASS / 0 FAIL。旧报告"5 项失败"经核查均为"测了旧实例 + 测了已删功能 + 断言写错",非代码缺陷。
V2.0 增补 · 权威实例重启与鉴权守卫实测
V2.0 在 v1.1.0 基础上补两条实战要点(2026-09-30 全要素测试报告):
1. 先重启"权威实例"再测:同端口跑两个实例会命中旧代码(沙箱回收旧实例、新实例未必是你想测的)。做法——先用 Get-NetTCPConnection -LocalPort 8765 定位监听 PID,Stop-Process -Force 强杀,再用托管 Python 从磁盘源码重拉(run_in_background),确认单实例后再测。这样测的是"当前磁盘代码",不是内存里旧构建。
2. 鉴权守卫实测(不光看状态码):① 错密码登录 → 不签发 hfms_sid Cookie + 页面回显"密码错误";② 未登录写财务 POST /txn/new → 期望 403(不是 500/崩溃);③ 未登录访问 /settings、/audit → 期望 303 跳 /login;④ 切号不验密 → 仍被拦(P0)。这四条把"权限闭环"从"看得到"变成"验得过"。
验证口径不变:错误 0 + 空页面 0 + 悬空引用 0;V2.0 实测 44 项全过(44 PASS / 0 FAIL)。
版本记录
| 版本 | 日期 | 变更 |
|---|---|---|
| v1.0.0 | 2026-09-28 | 首版实战固化:单实例确认→登录态→路由全集→三类记录→冷启动复测 |
| v1.1.0 | 2026-09-28 | 回填真实锚点:会话 Cookie 名 hfms_sid、分发器抽路由、错误特征串、HTTP 000=线程异常看 stderr、documents 路径校验、计数口径排除同源重复 |
| v1.2.0 | 2026-10-03 | 增补:权威实例重启(杀旧 PID 重拉磁盘源码)+ 鉴权守卫实测(错密/未登录写 403/管理页 303) |
| v1.2.0 | 2026-10-03 | 增补 V2.0:测前重启权威实例(强杀旧 PID 重拉)+ 鉴权守卫实测(错密/未登录写 403/管理页 303)+ 44 项检查全绿 |
| v1.2.0 | 2026-10-03 | 增补 V2.0:测前重启权威实例(强杀旧 PID 重拉)+ 鉴权守卫实测(错密/未登录写 403/管理页 303)+ 44 项检查全绿 |
版本记录(续)
| 版本 | 日期 | 变更 |
|---|---|---|
| v1.3.0 | 2026-10-18 | 回填:强杀后立即重启报 disk I/O error 属瞬时错误,先 integrity_check 确认库健康再原样重试启动一次,切勿删 WAL / -shm(2026-10-13 实测) |