写卡(测试面四项收口批·文档定稿+卡片成立): 四项待裁全收口——④规格句落 test-conventions v1.0(§2 两段式「先接线断言快速失败、后真输入保玩家可达」用户裁+§8.3「批量模拟测量语义」句=tune_sim 对拍判据出处); ②等宽纪律句落 battle.md「Component Inventory」(同直接父容器 ≥2 可见按钮等宽 ≤1px, 停手/图例钮统一 64px); ①③定性=探针问题非游戏 bug(emit 绕过视图置隐前提, ui_struct_probe:227:249 注记实证)。卡片五验收行(V1 选路两段式/V2 battle_hud 实采样落点三钉/V3 图例两段式/V4 宽度 64 钉值/V5 注记改锚), 验收档低, 零待裁开工门 U0; 能力表两新行当场入 README(冒险簇两段式/图例两段式); 只读子代理对抗复核一轮 3 发现(2自判1补写: 返回出口计数三/isolate_save 三参显式/enable 态读数义务)全落卡, 复核报告同批落盘; 待办状态推进已写卡并登记卡路径+复核报告路径。凭据: 流水线闸 PASS(32条目/58行/7链/10卡)、文档域闸全绿(receipt all_green=true, 8闸 exit 0 无继承红, 基点 0f686900)

This commit is contained in:
DKChan committed 2026-11-10 03:31:30 +08:00
1 parent 0f6869000a
commit e812c3e60f
6 files changed
+242 -4

No files matched your search

+5 -2
View File
@@ -1,5 +1,6 @@
# 测试规范(Dungeon Sweeper)
> 现行为 v1.0(2026-11-09)
> 约束范围:`game/probe/ 与 game/sim/`、`game/tests/` 与一切场景探针的编写与验收。
> 分工:测试**执行义务**(改完必须测什么)归 AGENTS.md「硬性红线·改完即测铁规」与 `process-conventions.md` §4;**跑什么闸、什么顺序**归 `tools/run_all_gates.sh`(脚本即清单,本文与 AGENTS.md 均不另列);本文管测试怎么写、怎么算合格。每件测试工具**是什么、判什么、怎么单独跑、什么时候适合单独用**——见 `game/tests/README.md`(测试工具手册),本文不重复工具介绍。
> 归属:随游戏逻辑写/改的测试=需求改动的一部分(随需求卡片同批落地);不伴随逻辑改动的纯测试维护=工程改动(不写卡,用户发令直改)。
@@ -34,7 +35,7 @@
凡模态覆盖层,探针必须断言:打开后自身 visible 且遮挡物已隐藏(模态被遮挡 = 功能存在但不可达)。
**UI 驱动断言须走真输入管线(2026-11-06 立)**:探针里「点按钮/点场景物件」类驱动断言,一律经引擎输入管线承载(合成 InputEvent 走 `push_input`,press+release 成对;合成滚轮同样必须 press+release 成对——只发 press 会把鼠标焦点钉死在按下点控件上,后续点击全部失效);信号直发(`pressed.emit()` 等)绕过命中测试,保不了「玩家点击可达」,只许用于真输入到不了的面并当场标〔接线断言〕(现役例:置灰态穿透钉处理器兜底)。折叠区控件先以真输入滚轮滚入可视区再点。每个动线断言钉「落点」判定(点了之后到哪个屏/哪层可见),防驱动中断后的空转假绿。真输入命中控件时自动登记控件覆盖(探针共用面登记件落 `.gates/` 观测产物),覆盖面生长不靠人记。
**UI 驱动断言两段式:先接线、后真输入(2026-11-06 立;2026-11-09 用户裁两段式)**:探针里「点按钮/点场景物件」类驱动断言按先后两段执行——**第一段接线断言**:信号直发(`pressed.emit()` 等)验证信号接线与处理器逻辑,快速失败(接线不通即红,不必等真输入段定位);**第二段真输入断言**:经引擎输入管线承载(合成 InputEvent 走 `push_input`,press+release 成对;合成滚轮同样必须 press+release 成对——只发 press 会把鼠标焦点钉死在按下点控件上,后续点击全部失效),验证玩家点击可达。真输入绕过不得——信号直发绕过命中测试,保不了「玩家点击可达」;真实入口只认第二段(§8.3 口径不变),第一段不充当能力行的真实入口。真输入到不了的面(现役例:置灰态穿透钉处理器兜底)止于第一段并当场标〔接线断言〕。折叠区控件先以真输入滚轮滚入可视区再点。每个动线断言钉「落点」判定(点了之后到哪个屏/哪层可见),防驱动中断后的空转假绿。真输入命中控件时自动登记控件覆盖(探针共用面登记件落 `.gates/` 观测产物),覆盖面生长不靠人记。
## 3. 缺陷修复必须沉淀回归断言
@@ -117,7 +118,9 @@
**判据出处锚(2026-11-05 立;2026-11-09 用户裁内容化改版——行号形态废止,内容节锚为唯一形态)**:对照表「需求点」列每行必须带**判据出处锚**——该行验收判据所依据的现行文档句子,格式「`<文档相对路径>「节名」<行关键词>`」。现行文档=`design/` 全域现行文档(含 `ux/` 交互规格与 art-bible 的判据行);已退役的需求卡片不是现行文档,不得充当判据出处。节名=判据句所在节的标题词(节名首段「·」前须命中目标文档标题行);行关键词=判据句上的无空白子串(须落在该节块内)。锚指向内容不指向行号——文档增删行不牵动锚与测试代码,只有判据句内容真被改动才使锚失配;失配(节名不在档/关键词不命中)=红,改动该句的文档批同批改锚。作用=断言预期值从规格句抄出,不从实现反推:实现行为与规格句冲突时断言红;规格缺席的行写不出锚,即停卡退回写卡段(那是需求澄清缺口,不是测试缺口)。机检=`tools/pipeline_gate.py` 判据 C5(内容锚形态唯一+节名在档+关键词命中节内,核验口径归 `tools/anchor_util.py` 共用件;行号形态出现即红)+`tools/capability_audit.py` 链式锚检查(断言→套件→能力行→系统文档,见 §8.9)。
**测试函数的判据出处注记(2026-11-06 立;2026-11-09 内容化改版——内容节锚唯一形态)**:`game/tests/**` 与 `game/probe/**` 内每个**验证函数**(函数体含 `check(`/`check_quiet(`/`_problems.append(`/`push_error(` 判定调用的函数——定义行与 `_check(` 前缀不作判定计)必须带至少一条**判据出处注记**,格式「`# 判据出处: <design/相对路径>「节名」<行关键词> <判据一句>`」——指针在前、判据摘要句在后;节名与行关键词口径同上(卡片判据锚同款,`game/sim/` 测量面实现件无标题结构,节名与关键词按文件内子串命中),断言预期值的出处随断言走:断言红时读注记即达出处文档句,零查表。指针空间=`design/` 全域现行文档(行为测试锚 owner 系统文档「验收标准」句或 `ux/` 规格句;惯例类测试〔封装扫描、判定通道纪律、驱动契约〕锚规约条款行;测量面驱动契约锚 `game/sim/` 实现件文件头注——规范句在哪锚哪,2026-11-09 架构收敛批立);`game/sim/` 不进扫描面(测量面直构惯例)。与链式锚的分工:链式锚(断言→套件→能力行→系统文档)不变、属义务清单层;本注记属执行证据层、写在断言文件内,非独立账本(§8.9 法则 4 不变)。写新测试函数时当场挂注记;判据句被改动使关键词失配时,改动该句的文档批同批改锚——失配即红。局限如实声明:注记核验到「关键词命中节内」粒度,判据句被改写而关键词仍为其子串时语义漂移机检抓不到,由复核门实读兜(与卡片判据 C5 同限)。机检=`tools/capability_audit.py` 判据出处注记道(覆盖检查+内容锚核验,行号形态出现即红;扫描面零文件自检红)。规格缺席写不出锚=发现规格缺口:记发现不造锚、收尾呈报,禁锚到非现行文档凑数。
**测试函数的判据出处注记(2026-11-06 立;2026-11-09 内容化改版——内容节锚唯一形态)**:`game/tests/**` 与 `game/probe/**` 内每个**验证函数**(函数体含 `check(`/`check_quiet(`/`_problems.append(`/`push_error(` 判定调用的函数——定义行与 `_check(` 前缀不作判定计)必须带至少一条**判据出处注记**,格式「`# 判据出处: <design/相对路径>「节名」<行关键词> <判据一句>`」——指针在前、判据摘要句在后;节名与行关键词口径同上(卡片判据锚同款,`game/sim/` 测量面实现件无标题结构,节名与关键词按文件内子串命中),断言预期值的出处随断言走:断言红时读注记即达出处文档句,零查表。指针空间=`design/` 全域现行文档(行为测试锚 owner 系统文档「验收标准」句或 `ux/` 规格句;惯例类测试〔封装扫描、判定通道纪律、驱动契约〕锚规约条款行;测量面驱动契约锚 `game/sim/` 实现件文件头注或本节「批量模拟测量语义」句——规范句在哪锚哪,2026-11-09 架构收敛批立);`game/sim/` 不进扫描面(测量面直构惯例)。与链式锚的分工:链式锚(断言→套件→能力行→系统文档)不变、属义务清单层;本注记属执行证据层、写在断言文件内,非独立账本(§8.9 法则 4 不变)。写新测试函数时当场挂注记;判据句被改动使关键词失配时,改动该句的文档批同批改锚——失配即红。局限如实声明:注记核验到「关键词命中节内」粒度,判据句被改写而关键词仍为其子串时语义漂移机检抓不到,由复核门实读兜(与卡片判据 C5 同限)。机检=`tools/capability_audit.py` 判据出处注记道(覆盖检查+内容锚核验,行号形态出现即红;扫描面零文件自检红)。规格缺席写不出锚=发现规格缺口:记发现不造锚、收尾呈报,禁锚到非现行文档凑数。
**批量模拟测量语义(测量面驱动契约,2026-11-09 用户裁落文)**:调试浮窗批量模拟(tune_sim,呈现层调参测量件)与 headless 扫描同口径(同款自动策略驱动);逐帧步进每局恰占一帧——第 0 局在调用点同步段执行,第 i 局(i≥1)在第 i 帧信号发射点执行,收尾恒在第 n 帧发射点;n=0 退化路径为调用点同步收尾零帧;进度逐局更新,报告注入与运行态复位在整批收尾之后。双实现对拍套件(产品码帧步进形态 vs 旧 await 形态夹具)以本句为判据出处。
**验收档申报(2026-11-04 立,自 2026-11-05 起对文件名日期不早于该日的需求卡片生效;旧卡不回头改)**:每张需求卡片在头部信息区(与设计事实源声明同区)申报一个验收档,三档:高/中/低。判据=失败代价单维——这条改动做错了,后果随存档或结算传播的(存档写读与迁移、RNG 流、战斗结算公式与乘区、经济入账、数值表结构校验)=高;后果玩家可见但不损持久状态的(常规玩法逻辑、门控、交互逻辑、呈现数据面)=中;后果即看即知且无状态残留的(文案、纯呈现样式、布局微调)=低。一张卡触多档按最高档申报;申报由写卡段落笔,用户批卡(U0)时确认或改判。档位只调节 §8.7 审计深度——闸机与 CI 的域划分、选闸算法、全量强制档一概不因档位变化,真实入口、判据绑定面、禁削弱等验收闭合判据全部照旧。未申报档位的卡一律按高档全量审计。机检=`tools/pipeline_gate.py` 判据 C4:卡内须含「验收档:高/中/低」申报行。