换基线:说清「新底座里多出来的到访不会进导出包」,并把它钉成用例
写文案时去核这条,先把一条写错的断言纠正了:导出条数本来就不等于站点条数。 tableWriter.finish() 是两段:先删「基线里有、PG 已没有」的行(known − seen), 再把「导入时进不了 PG 但留档还在」的行(w.skipped × raws)按原样补回——否则 「导入→导出」一趟会凭空少数据。实测 823 条到访的数据集导出包里是 824 条,差值正常。 (第一版成功路径用例断言「导出 == 站点」,红在 824 != 823 就是这个原因;已改成更锋利的 「换底座前后导出包里 ZVISIT 的 UUID 集合逐条一致」。) 同一段代码定下了换基线的语义:新底座里站点没有的行会被清掉(进 known 没进 seen)。 所以换一份更新的手机包**不会**把手机新记录带进导出包,要带得先走「分析差异」合并。 页面提示与 flash 文案都写明了这点,并新增用例 TestSwapBaselineDoesNotCarryRowsTheSiteDoesNotHave 钉住它(站内补一条到访 → 导成包 → 从站内删掉 → 换底座 → 断言导出里既没有那条的派生 UUID、UUID 集合也与换之前逐条一致)。 验收:./scripts/verify.sh 全量 PASS=319 FAIL=0 SKIP=0。
This commit is contained in:
@@ -192,3 +192,22 @@ V2(+3 个站内新建地点)、V3(手机里也有的行按手机原值重
|
||||
|
||||
验收:`./scripts/verify.sh` 全量 **PASS=318 FAIL=0 SKIP=0**(10m15s)。
|
||||
新增用例 7 条(`internal/web/baseline_swap_test.go`)。
|
||||
|
||||
### 补记:导出条数 ≠ 站点条数(19:00)
|
||||
|
||||
收尾时想到一个真实的认知陷阱:站长会以为「换一份更新的手机包当底座 ⇒ 导出的包里就有手机上的新记录」。
|
||||
写文案时顺手去核这条,结果**先把自己写错的断言给纠正了**。
|
||||
|
||||
`tableWriter.finish()` 是**两段**:先删「基线里有、PG 已没有」的行(`known` − `seen`),
|
||||
再把「导入时进不了 PG 但留档还在」的行(`w.skipped` × `raws`)按原样补回——否则「导入→导出」一趟
|
||||
会凭空少数据。所以实测那份 823 条到访的数据集导出包里有 **824** 条,差值正常。
|
||||
(我第一次写成功路径用例时断言「导出 == 站点」,红在 824 != 823,就是没意识到这一段。)
|
||||
|
||||
同一段代码也定下了换基线的语义:**新底座里站点没有的行会被清掉**(进 `known` 没进 `seen`)。
|
||||
所以「换更新的手机包」不会把手机新记录偷偷带进导出包;要带得先走「分析差异」合并。
|
||||
这条既写进了页面提示与 flash 文案,也用 `TestSwapBaselineDoesNotCarryRowsTheSiteDoesNotHave`
|
||||
钉住了(站内补一条到访 → 导出成包 → 从站内删掉 → 换底座 → 断言导出里既没有那条的派生 UUID、
|
||||
UUID 集合也与换之前逐条一致)。
|
||||
|
||||
第二轮全量验收:**PASS=319 FAIL=0 SKIP=0**。技能 `rond-backup-parse` 补了「导出条数 ≠ 站点条数」
|
||||
与「换基线已做成后台动作」两处。
|
||||
|
||||
@@ -570,6 +570,12 @@ Core Data 元数据、索引、持久化历史、`ZRAWVISIT` 采样点、`ZTRIP*
|
||||
「我确认,强制替换」按钮(不必重传几十 MB);`POST /admin/baseline/confirm` 走同一条路。
|
||||
- 导出内容在换底座前后**逐条不变**(`ZVISIT` 的 UUID 集合):编号会换、身份不该换,
|
||||
这条是回归用例最锋利的断言(谁在底座里没对上,就会多出一条派生 UUID 的行)。
|
||||
- ⚠️ **导出条数 ≠ 站点条数**,别把差值当 bug:`tableWriter.finish()` 有**两段**——先删
|
||||
「基线里有、PG 已没有」的行(`known` − `seen`),再把「导入时进不了 PG 但留档还在」的行
|
||||
(`w.skipped` × `raws`)按原样补回。实测「站内 823 / 导出 824」就是这个第二段。
|
||||
同一段代码也决定了换基线的语义:**新底座里站点没有的行会被清掉**(进 `known` 没进 `seen`),
|
||||
所以换到「更新」的手机包**不会**把手机上的新记录带进导出包——想带得先用「分析差异」合并。
|
||||
页面文案与提示都写明了这点,用例 `TestSwapBaselineDoesNotCarryRowsTheSiteDoesNotHave` 守着它。
|
||||
- 路由:`GET /admin/baseline`、`POST /admin/baseline`(上传并换)、`/confirm`、`/rollback`、`/rebuild`。
|
||||
|
||||
### 用例 `internal/web/baseline_swap_test.go`(7 条)
|
||||
|
||||
Reference in New Issue
Block a user