docs(test): 测试架构补「⑩ 已知缺口/测试盲区」单一跟踪源

把散在对话里的盲区收进架构文档,作为单一跟踪源(补一项划一项):
- A 覆盖盲区:前端统计上屏数值未验证(诉求半覆盖)、真实流量数据路径
  (注入非真出网,最大盲区)、原生隧道层零自动化、契约双份可能漂移。
- B 运维/工程缺口:CI 单点 mac(持久化未激活)、go-integration 裸宿主脆性、
  analyze 严格化(B1)+ golden 全集(B2)被 stats-overhaul 耦合阻塞、
  golden 本地难重生。
每项标严重度 + 现状为什么 + 何时怎么补;同步登记 docs/index.html。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-25 21:30:54 +08:00
parent 8356547c2f
commit 55d368d98b
2 changed files with 75 additions and 1 deletions
+74
View File
@@ -426,6 +426,80 @@
</table>
<p class="note">本文档仅为架构说明(设计真相源)。具体落地拆解(契约快照实现、前端 flow 用例、L4 冒烟脚本)走各自实现计划(writing-plans)。</p>
<h2>⑩ 已知缺口 / 测试盲区</h2>
<div class="lead">
框架不是「测了什么」的清单,更要诚实地记「<b>没测什么、为什么、何时补</b>」——否则盲区会散在对话与脑子里被遗忘。本节是这些缺口的<b>单一跟踪源</b>,补上一项就划掉一项。
</div>
<h3>A. 覆盖盲区(功能上没被验证到的部分)</h3>
<table>
<thead><tr><th style="width:22%">缺口</th><th style="width:12%">严重度</th><th style="width:40%">现状 &amp; 为什么没测</th><th style="width:26%">何时 / 怎么补</th></tr></thead>
<tbody>
<tr>
<td><b>前端统计「上屏数值对不对」</b></td>
<td><span class="tag t-warn">中·诉求半覆盖</span></td>
<td>最初诉求是「统计数据对不对」。后端记账已 L4 e2e(<code>ReportUsage → /v1/usage</code> 断言字节);前端只到单测(<code>device_usage_test</code>/<code>format_test</code> 解析+格式化)。<b>解析对 ≠ 渲染对</b>——没有测试验证统计页拿到真实响应后上屏的数字/曲线是对的。</td>
<td>可立即补:widget 级测试,用 e2e server 的真实 <code>/v1/usage</code> 响应喂 <code>stats_page</code>,断言关键数值/曲线上屏。闭合诉求最后一环。</td>
</tr>
<tr>
<td><b>真实流量数据路径</b></td>
<td><span class="tag t-bad">高·最大盲区</span></td>
<td>L4 e2e 是<b>注入</b><code>ReportUsage</code>,不是「真 sing-box 出网 → v2ray stats 采集 → 上报记账」。真链路从未自动跑过——这是「我们其实不知道线上准不准」的根盲区。真出网那环仅 <code>usage_v2ray.go</code> 单测覆盖采集解析。</td>
<td>贵且脆(单机 docker 真出网重、CI 跑不动)。留后续按需,或本地手动跑一次真连基准。</td>
</tr>
<tr>
<td><b>原生隧道层</b></td>
<td><span class="tag t-bad"></span></td>
<td>真正承载流量的代码——<code>client/ios/Runner/VpnManager.swift</code><code>client/android/…/PangolinVpnService.kt</code>、macOS 系统扩展——<b>零自动化测试</b>,全靠真机/模拟器手测。</td>
<td>依赖真机/模拟器,难纯 CI 化。至少补「连上→可达性探针→断开」的半自动脚本。</td>
</tr>
<tr>
<td><b>契约双份可能各自漂移</b></td>
<td><span class="tag t-warn"></span></td>
<td>Dart 与 Go 各冻一份字段面快照,两边是各自独立的真相,理论上可各自漂移(OpenAPI 改了、只更了一边)。</td>
<td>真·单源(从 OpenAPI 生成两端契约)是大改,列入 C 类效率项后续做。</td>
</tr>
</tbody>
</table>
<h3>B. 运维 / 工程缺口(能跑,但脆或欠账)</h3>
<table>
<thead><tr><th style="width:22%">缺口</th><th style="width:12%">严重度</th><th style="width:40%">现状 &amp; 为什么</th><th style="width:26%">何时 / 怎么补</th></tr></thead>
<tbody>
<tr>
<td><b>CI 是单点</b></td>
<td><span class="tag t-warn">中·运维</span></td>
<td>整条 CI 吊在一台 macmac-pangolin-2+ 依赖 jiu 的 relay + Docker Desktop。<b>launchd 持久化尚未激活</b>(见 <code>docs/ci-runner.md</code> 的一次性 <code>!</code> 命令)——mac 一关/重启 CI 就全停。</td>
<td>激活持久化(脚本已就位);理想归宿是 NAS Linux host runner。</td>
</tr>
<tr>
<td><b>go-integration job 脆性</b></td>
<td><span class="tag t-warn"></span></td>
<td>跑在<b>裸宿主机</b>go1.26.1,非容器,testcontainers 要真 dockerDooD 在 Docker Desktop mac 网络不通)——宿主 go 版本漂移即挂;套件 ~5min;曾踩 ryuk 关闭→容器泄漏坑(已用默认 ryuk + <code>-p 1</code> 串行规避)。</td>
<td>迁 NAS Linux host runner 可恢复容器化 hermetic;保持 ryuk 开启。</td>
</tr>
<tr>
<td><b>analyze 严格化(闸·B1</b></td>
<td><span class="tag t-warn">中·阻塞</span></td>
<td>去掉 <code>--no-fatal-infos</code> 让 info 变致命,会因 HEAD <code>stats_page.dart</code><code>withOpacity</code> info 当场红;而清 info 正动 stats-overhaul 在改的同一文件。</td>
<td><b>被 stats-overhaul 耦合阻塞</b>,其合并后立刻做。</td>
</tr>
<tr>
<td><b>golden 全集(闸·B2</b></td>
<td><span class="tag t-warn">中·阻塞</span></td>
<td>golden job 现只跑 components + authtablet/desktop-stats golden 与 <code>tablet_pages_golden_test.dart</code> 全是 dirty WIP,并入等于钉死未定稿基线。</td>
<td>stats-overhaul 合并后并入;连带补回临时摘除的 DeviceUsage 契约快照(Dart+Go+ e2e <code>/v1/usage/devices</code> 断言。</td>
</tr>
<tr>
<td><b>golden 本地难重生</b></td>
<td><span class="tag t-ok">低·摩擦</span></td>
<td>Linux 权威基线(mac 渲染不一致),开发机改 UI 后须 docker 起 flutter 容器重生基线,非纯本地。</td>
<td><code>scripts/update-goldens.sh</code> 已封装,文档化即可,非真缺口。</td>
</tr>
</tbody>
</table>
<p class="note">维护约定:补上某项缺口后,从本表删去对应行(或标 <span class="tag t-ok">已补</span>);新发现的盲区即时登记到此,使本节始终等于「当前真实缺口」。</p>
</div>
</body>
</html>