================================================================================ EasyGoAdmin 后端开发者文档 · 16 测试与质量保障 ================================================================================ -------------------------------------------------------------------------------- 1. 现状(封板时点,如实说明) -------------------------------------------------------------------------------- 仓库当前不含 *_test.go 单元/集成测试文件(find 全仓为 0)。 质量保障依赖以下四层手段;测试补齐方向见第 5 节(待补齐建议,未实施)。 -------------------------------------------------------------------------------- 2. 静态质量门禁(每次提交前必跑) -------------------------------------------------------------------------------- go build ./... 编译(生成器产物、service 接口同步的第一道闸) go vet ./... 静态分析 gofmt -l . 格式检查(无输出=通过;生成器产物已统一 gofmt) Windows 无 make 时直接执行上述命令;有 make 时: make vet / make fmt / make build / make test(test 目前为空跑) -------------------------------------------------------------------------------- 3. 接口响应黄金样本回归(hack/golden 体系) -------------------------------------------------------------------------------- 3.1 目录与用途 hack/golden/ 34 个响应 JSON —— 当前回归基线(比对基准) hack/after_all/ 31 个响应 JSON —— 全量接口终态快照(覆盖各域 page/list/ detail/user_detail 等,含 tag_* 等扩展样本) hack/before_c/ 12 个 —— c 轮改造前快照(对照组) hack/after_b/ 5 个 —— b 轮改造后样本 hack/after_c/ 12 个 —— c 轮改造后样本 hack/after/ 12 个 —— 早期轮次样本 命名规律:{模块}_{动作}.json(如 user_page.json、level_list.json、 city_list_pc.json 带场景后缀)。 3.2 比对流程(规范) 1) 录制/回放均须带录制参数对齐:分页接口固定 pageSize=3 等小值, 否则 total/list 长度随数据漂移造成大量伪 DIFF。 2) 请求以管理员身份(admin)发起,保证数据集稳定;筛选条件固定。 3) DIFF 归因三分类后再决定处理: A. 预期变更(本次改动引起)→ 更新对应 golden 样本并说明 B. 动态值漂移(id 递增、时间戳、consume_time、ip/location)→ 归一化后比较,不更新 C. 非预期回归 → 修代码,禁止改样本 4) 样本与代码同库提交,review 时随 diff 一并审阅。 -------------------------------------------------------------------------------- 4. 运行期可观测性(替代部分测试的兜底) -------------------------------------------------------------------------------- 启动自检:cmd/wireDependencies 校验 IdentityLoader/TenantLoader/LogSink 接线(缺失启动 Warning);cache.Init 探测 Redis;调度器 DaemonInit 统计挂载数。 运行探针: GET /api/health 存活(免登录、不限流) GET /api/server/info 运行时/磁盘/DB/缓存/调度器健康(mounted≥expected) GET /api/cache/info 缓存模式与命中率 GET /api/job/daemonStatus 调度条目 GET /api.json 路由全集(与 gmeta 注解一致性自查) 日志信号: 启动期依赖缺失 Warning;Redis 降级 Warning;操作日志通道满丢弃计数 Warning; 调度器任务挂载失败 Warning;panic 堆栈 Error(Response recover)。 -------------------------------------------------------------------------------- 5. 测试补齐建议(当前未实施,给出优先级) -------------------------------------------------------------------------------- P0 hooks 集成测试(sqlite 内存库): Insert 盖章(审计列/租户填充/平台默认租户)、Update 盖章、 Delete 软删改写、ApplyCtx 过滤(del_flag + 租户 IN)。 P0 ModuleSpec 流水线测试:Like/Eq/Keyword 零值跳过、Keyword OR 参数化、 树形挂根、FillTextFields 反射计划、唯一规则 Group 语义。 P1 migrate 渲染器单测:五方言 Column/CreateTable/CreateIndex 金样对比 (纯字符串函数,无需数据库);normalizeType/parsePgIndexCols 解析用例。 P1 utility 单测:crypto(bcrypt 往返)、excel(ReadSheet/WriteSheet tmpfs)、 upload(SaveFromTemp 幂等与外站跳过)、captcha.Verify 一次性、 ua/ip2region 解析。 P2 auth 集成:登录→refresh 轮换→黑名单失效→强退双拉黑闭环(需 Redis 或 内存降级模式)。 建议目录:internal/**/**_test.go 与包同置;sqlite 用例通过 database.default.type=sqlite 临时配置注入;MySQL 集成用例以环境变量门控 (无环境时 t.Skip)。 -------------------------------------------------------------------------------- 6. 变更回归最小集(改动映射到必查项) -------------------------------------------------------------------------------- 改动类型 最小回归 ------------------------ -------------------------------------------------- 中间件/认证 login→带token请求→401路径→refresh→logout 黑名单 权限/菜单 getMenus/getUser/403 接口/角色保存后即时生效 某模块 CRUD 该模块 page/detail golden 比对 + 唯一冲突路径 hooks/dao 相邻两租户数据隔离抽查 + 软删后 list 不可见 生成器 -preview 清单核对 → 生成 → go build → 新路由 200 调度/任务 daemonStatus 挂载数 + 手动 runOnce + job/log 状态 迁移器 行数校验 PASS + 随机抽行值比对 + 序列插入测试 配置 启动日志 + health + 对应功能开关路径 -------------------------------------------------------------------------------- 7. 发布前检查清单 -------------------------------------------------------------------------------- 1) go build ./... && go vet ./... && gofmt -l .(无输出) 2) 关键接口黄金样本回归(带录制参数) 3) 配置核对:jwt.secret / captcha.bypassCode 空 / app.demo=false / app.errorMsg=false / file.uploadDir 与 domainUrl / rateLimit 生产值 4) /api/health、/api/server/info(调度器 mounted=expected、缓存 mode=redis) 5) 登录→菜单加载→任一 CRUD 冒烟;操作日志页有新记录 6) LogClean/CleanTemp 两个内置调度已挂载(daemonStatus/gcron 条目)