Files
ft/CodexOutput/upserver/ReviewLifecycleTests/README.md

44 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 独立复审生命周期确定性复现
本目录只运行本地 .NET 宿主,不连接网络、不运行 Unity、不读写游戏存档。
## 修复后最新结果
2026-09-22:正常 4 项、原缺陷回归 4 项、扩展 41 项、Stage 停止边界 9 项,**共 58 项通过**,各命令退出 0。见 `fixed-*-result.json` 与 `fixed-*.log`。`fixed-source-test-hashes.json` 记录当前四生产文件及提取体、替身、断言 hash;下面修复前证据保持原样。
扩展测试直接使用 GetUI/NewEnterMap/OnCameraSpeedEvent 生产方法(async void 仅转换为可等待 Task),声音两级实际初始化/释放方法。Stage 使用实际 Start 前缀、完整 Stop/OnDestroy 和 base.StartAsync 的原异常过滤片段;未用复制的 guard 镜像替代真实方法。Stage 前缀在声音初始化后截断,末尾 Applied 仅作为「旧流程是否能继续」观察点。
Unity 对象等号、可控等待、逐资源引用和事件订阅是替身;真实引擎效果以主会话 Unity 结果为准。可用 `--extended`、`--stage` 运行扩展矩阵。修复前 `regression-failing.log`/baseline 未覆盖;修复后命令写 `fixed-*`。
`generate.py` 从实际生产文件提取方法。GetUI 唯一转换是 `async void` → `public async Task`,便于测试等待;SoundMgr.Init/Release、SoundService.InitAsync/Release 方法体不改。`extraction.json` 记录文件与方法 hash。替身依赖在 Stubs.cs,测试编排在 Program.cs;没有复制一套被测业务逻辑。
## 已保存结果(修复前)
- `normal.log`:四项正常流程通过,退出码 0。
- `regression-failing.log`:四项退出安全断言失败,退出码 1。
- `normal-result.json` / `regression-result.json`:结构化副作用计数。
- `baseline/`:修复前提取方法与结果快照,明确排除参与构建。
- `test-hashes.json`:本次被测提取体、替身、断言的 hash。
## 重跑
从 C:/projects/ft 运行:
```powershell
python CodexOutput/upserver/ReviewLifecycleTests/generate.py
$env:DOTNET_CLI_HOME='C:/projects/ft/CodexOutput/dotnet-home'
$env:APPDATA='C:/projects/ft/CodexOutput/dotnet-appdata'
dotnet run --project CodexOutput/upserver/ReviewLifecycleTests/ReviewLifecycleTests.csproj -- --normal
dotnet run --no-build --project CodexOutput/upserver/ReviewLifecycleTests/ReviewLifecycleTests.csproj -- --regression
```
修复前第二个命令预期退出码 1,是保存的缺陷证据,不能改成「预期失败等于验收通过」。修复后需重新提取源码、适配新增依赖,并使同样安全断言通过;不得覆写 baseline 证据。
## 限制
资源替身把操作完成与 Release 分开,允许已发出的 Task 完成,专门暴露生产代码缺失的生命周期检查。真实 Addressables 可能在释放后先抛出无效句柄/已销毁对象异常,因此这里证明的是退出后的控制流和所有权缺口,不声称真实引擎必然产生完全相同计数或异常。
修复前 GetUI 的 Destroyed 标识仅代表测试时序;旧生产方法从不读取它,测试同时实际替换容器,并观察随后对新解析服务的调用。修复后已补 Unity Object 等号替身,分别验证销毁、取消及容器替换,仍以 Unity 验证实际销毁语义。
SoundMgr 的测试先使底层声音服务初始化成功,暂停在其自身音频加载循环,以隔离该层缺口。SoundService 的两个内部等待窗口另行使用实际方法测试。正常对照排除「替身无条件报错」;不存在真实服务器或账号数据修改。