🍲 sip 第二轮测试报告
覆盖周期:2026-08-11 ~ 2026-08-12 测试版本:v1.0 → v1.1 → v1.1.4(含簇重构) 测试方式:自动化 CLI + 人工 TUI + 故障注入 + 压力测试 + 安全渗透 说明:本报告汇总第二轮以来全部测试过程与复测数据,可直接通读,无需翻阅中间文件
目录
- 测试总览与时间线
- 第一轮回顾(v1.0,7.1 分)
- v1.1 新功能测试(dedup/policy/insights/onboarding/遥测)
- 安全复测(7 漏洞 → 6 修复)
- 酒馆笑话(边界花样挖掘)
- 压力测试(dedup/policy/遥测/苏暖泉)
- 补充梯队(进度/健康度/WAL/OPML/导出)
- 第二轮评分(7.6 分)
- v1.1.4 复测(发现 cap 与双向配对)
- 簇重构验证(输出爆炸根治)
- grep 通配符问题与修复
- 大改动回归(+696 行零回归)
- 最终问题清单
- 最终评分
- 附录:测试数据与现场
1. 测试总览与时间线
| 阶段 | 时间 | 版本 | 核心产出 |
|---|---|---|---|
| 第一轮全功能 | 08-11 | v1.0 | 51 项测试,评分 7.1 |
| v1.1 新功能 | 08-12 上午 | v1.1 | 28 项测试,23 过/5 败 |
| 安全复测 | 08-12 | v1.1 | 7 漏洞 6 修复 |
| 酒馆笑话 | 08-12 | v1.1 | 30 项挖出 4 缺陷 |
| 压测 | 08-12 | v1.1 | 性能曲线 + 并发 |
| 苏暖泉压测 | 08-12 | v1.1 | 463 事件规模/并发 |
| v1.1.4 复测 | 08-12 | v1.1.4 | cap 2000 发现 |
| 簇重构 | 08-12 | v1.1.4 | 输出爆炸根治 |
| 大改动回归 | 08-12 | v1.1.4 (18:52) | +696 行零回归 |
累计测试:约 230+ 项 | 缺陷发现:约 25 项 | 已修复验证:22 项
2. 第一轮回顾(v1.0)
51 项功能测试,评分 7.1/10。
| 维度 | 得分 |
|---|---|
| 功能完整性 | 8.5 |
| 稳定性 | 6.0(主库裸崩、O(n²)) |
| 性能 | 7.0 |
| 安全性 | 6.5 |
| 文档 | 7.5 |
| AI 友好 | 6.5 |
主要缺陷:-l N O(n²) 卡死、rss.db 损坏裸崩、SSRF、终端注入、退出码契约混乱、--init 非 TTY 崩溃。
3. v1.1 新功能测试
3.1 跨源去重 --dedup(pair 形态,当时)
- 检测边界:构造 100% / 80% / 71% / 61% 四档相似度实测,段落级重合 ≥80% 才报
- 检测:
--dedup scan12 组(11 组 100% + 1 组 80%) - 隐藏/撤销:hide/list/undo 基本正常
- ⚠️ 失败项:
- 防卷土重来失效(删文重拉重新导入)
-l N列表未过滤 dedup- 隐藏后 scan 候选不减少
3.2 Source Policy --policy ✅ 全过
5 动作(tag/keep/lower_frequency/archive/unsubscribe)+ remove + 边界退出码,createdBy 恒为 user。
3.3 Insights ✅ 全过
status+reasons 重构,无 health/action/basis,无价值判断。
3.4 Onboarding
- CLI ✅(list/分类/添加/跳过)
- TUI 命令行 ❌ 漏接(后修复)
3.5 遥测 ✅ 全过
consent_change / feed_change / search(含完整查询词)/ dedup 事件全齐。
4. 安全复测(7 漏洞 → 6 修复)
| # | 漏洞 | 复测结果 | 关键证据 |
|---|---|---|---|
| 1 | SSRF(全文抓取访问内网) | ✅ 修复 | loopback/私网/CGNAT/云元数据全拦,服务器日志零内网请求 |
| 2 | 终端注入(ESC 控制符) | ✅ 修复 | cat -v 确认 ESC 全剥离 |
| 3 | javascript:/file: 链接 | ⚠️ 部分 | TUI 打开已拦,导出 .md 仍保留文本 |
| 4 | rss.db 损坏裸崩 | ✅ 修复 | 保留现场 .corrupt + 自动重建 |
| 5 | --init 非 TTY 崩溃 | ✅ 修复 | ReadKey 异常降级 ReadLine |
| 6 | 退出码契约 | ✅ 修复 | 6 命令全符合(0/1/3) |
| 7 | grep 通配符 | ❌ 未修(后修) | 见第 11 节 |
安全分:6.5 → 8.5
5. 酒馆笑话(30 项边界花样)
头奖:dedup 自嗨全家桶
hide 924 924 → 已隐藏 924(保留 924) ← 自己藏自己
hide 924 925 + hide 925 924 → 环形隐藏 ← canonical 自己是 hidden次奖:hide 打破语义
hide 931(Rust文) 1(热汤AI文) → 已隐藏 931(保留 1) ← 无关文章也接受铜奖:policy 口是心非
lower_frequency 每日三次 → 无效计划 但照样写入 policy台词喜剧:退出码横跳、-L==-l、-d "not a url" 补全成 https://not a url 等。
从中提炼 4 个真缺陷:hide 无校验、非法计划残留、-l 不滤 dedup、自嗨叠加。
6. 压力测试
6.1 dedup scan 复杂度(pair 时代)
| 数据量 | 耗时 | 结论 |
|---|---|---|
| 1500 篇 | 1.2s | 快 |
| 6500 篇 | 14.3s | O(n²) 明显 |
| 4945 篇真重复 | 9.7s + 50.3 万组 + 105MB | 输出爆炸 |
6.2 批量操作
- hide ×100:48s(0.48s/次,启动开销为主)
- undo ×20:10.3s
- policy ×15:瞬间
-l27 源:541ms
6.3 并发
- 5 并发读 / 4 并发写 / 8 进程混合:全成功,库无损
- WAL 崩溃恢复:kill -9 后库完好
6.4 苏暖泉压测(遥测)
- 463 事件:show 0.5s / export 0.6s / insights 0.6s
- 事件构成:search 304 / dedup 132 / feed_change 19 / consent_change 1
- 4~8 并发读写全安全
7. 补充梯队
| 测试项 | 结果 |
|---|---|
| 阅读进度容错(非法/负数/超界/400KB) | ✅ 全不崩 |
| feed 健康度(失败累积→成功重置) | ✅ FailCount 4→0 |
| SQLite WAL 崩溃恢复 | ✅ kill 后完好 |
| sidecar 时序缺陷 | ✅ 确认修复 |
| OPML 往返幂等 | ✅ |
| --likes --json / --lang 变体 | ✅ |
| 大源导出 839 篇 | ✅ 0.88s |
8. 第二轮评分
7.6/10(A-),比第一轮 +0.5。
| 维度 | v1.0 | v1.1 | 变化 |
|---|---|---|---|
| 功能 | 8.5 | 8.0 | -0.5 |
| 稳定性 | 6.0 | 7.5 | +1.5 |
| 性能 | 7.0 | 6.5 | -0.5 |
| 安全 | 6.5 | 8.5 | +2.0 |
| 文档 | 7.5 | 7.5 | 持平 |
| AI 友好 | 6.5 | 7.0 | +0.5 |
9. v1.1.4 复测(关键转折)
9.1 8 项缺陷复测
| # | 缺陷 | 结果 |
|---|---|---|
| 1 | 防卷土重来 | ✅ 修复(拦截 + 对照实验) |
| 2 | -l N 过滤 dedup | ✅ 修复 |
| 3 | scan 性能/爆炸 | ⚠️ 部分(见下) |
| 4 | hide 语义校验 | ✅ 修复(自嗨/无关都拦) |
| 5 | lower_frequency 非法计划 | ✅ 修复 |
| 6 | grep 通配符 | ❌(后修,见 11) |
| 7 | TUI telemetry 空命令 | ✅ 修复 |
| 8 | 删源孤儿规则 | ✅ 修复 |
9.2 重大发现:cap 2000 + 双向配对 bug
决定性实验(2 源×30 篇完全同文):
| 指标 | 理论 | 实际 |
|---|---|---|
| 唯一重复对 | 900 | 1800(翻倍) |
| 对称反向对 | 0 | 1800(全部) |
结论:
FindNearDuplicates有MaxCandidates = 2000静默截断(防输出爆炸)- 底层把每个跨源对算了两次(双向遍历)——cap 预算被对称重复浪费一半
- GitHub 主分支源码是单向
i<j,本地 exe 是双向——exe 与源码不一致(复制错版本)
10. 簇重构验证(根治方案)
将 pair 检测改为 cluster(簇)检测:
发现 1 组重复簇(段落重合度 ≥ 80%):
簇 60 篇 · 重合度 ≥ 100% · 代表 [18818]
成员:18819, 18820, ...
保留代表隐藏其余:sip --dedup hide-cluster 1881810.1 效果对比
| 场景 | 旧版(pair) | 新版(cluster) |
|---|---|---|
| 30×30 完全同文 | 900 对(双向 bug 时 1800) | 1 簇(60 篇) |
| 101 篇完全同文 | 输出爆炸(万级对) | 1 簇 · 357 字节 · 765ms |
| 输出上限 | 2000 对静默截断 | 无截断 |
| 隐藏操作 | 逐对 hide | hide-cluster 一键整簇 |
10.2 全链路验证
- scan 簇形态 ✅(10 对 → 5 簇)
- hide-cluster ✅(3 篇簇 → 隐藏 2 保留 1)
- 边界 ✅(重复 hide / 非代表 / 不存在 → 都正确拒绝)
- list/undo ✅(每成员独立 undo key)
- 防卷土重来 ✅(簇模式下仍拦截)
--today交互 ✅(「可能同文 N 组」正常)
10.3 JSON 结构
{ "clusters": [{ "size": 60, "representativeId": 18818,
"title": "...", "source": "...", "minOverlap": 100,
"members": [18818, 18819, ...] }] }11. grep 通配符问题与修复
11.1 现象
--grep "%" → [1] 文章 (出现 0 次) ← 命中但计数 0
--grep "_" → [14] 文章 (出现 0 次) ← 同上11.1 根因(% 与 _ 同一问题)
- SQL 匹配:关键词转义成字面量,LIKE 匹配整篇 Content 原文(含 HTML 属性)
- 片段计数:
ExtractGrepSnippets用原始 keyword,在StripHtml后的可见文本里IndexOf - 差异:
%/_全在 HTML 属性里(URL 编码、bilibili 链接),剥离标签后可见文本为 0
实测数据:
| 文章 | 字符 | Content 总数 | 属性里 | 可见文本 |
|---|---|---|---|---|
| 文章1 | % | 36 | 是 | 0 |
| 文章14 | _ | 2 | 是 | 0 |
| 文章49 | _ | 1 | 否(huggingface_hub) | 1 ✅ |
11.3 修复(A 方案)
命中但可见计数 0 时提示:
[1] 文章 (出现 0 次) (仅命中链接/属性,未计入可见文本)实测:%/_ 提示正确,正常命中(huggingface_hub 1 次)不受影响。
12. 大改动回归(+696 行)
RssReader.cs +696 行(簇重构 + grep 提示 + 全部缺陷修复 + --version 编译时间)后系统性回归:
| 类别 | 结果 |
|---|---|
| 基础回归脚本 19 项 | ✅ 全过 |
| dedup 簇全链路 + 边界 | ✅ |
| 退出码契约 6 项 | ✅ |
| 安全(ESC/SSRF/init) | ✅ 零回退 |
| 核心功能(export/versions/diff/更新/like/schedule/OPML) | ✅ |
| 版本追踪(模拟 v2) | ✅ |
| 大导出 936 篇 | ✅ 1s |
结论:+696 行零回归。
13. 最终问题清单
🟢 低危(2)
| # | 问题 | 说明 |
|---|---|---|
| 1 | --export 保留恶意协议链接文本 | TUI 打开已拦,导出 .md 里 javascript: 等仍在(仅外部渲染器触发) |
| 2 | dedup.json 偶发丢失 | 簇重构后再未复现,疑似旧版遗留,待观察 |
🎨 UX 细节(3)
| # | 问题 | 说明 |
|---|---|---|
| 3 | i 界面(已隐藏列表)无 x | 只能撤销,不能删除 |
| 4 | 首页内容仍居中 | 左对齐修复未覆盖起始页 |
| 5 | s 与 Enter 面板冗余 | 设计划入口重叠 |
✅ 已澄清
- 文件占用 = 用户手动操作导致,非程序问题(已划掉)
- 其余 22 项缺陷全部修复并验证
14. 最终评分
| 维度 | v1.0 | v1.1 | v1.1.4(最终) | 说明 |
|---|---|---|---|---|
| 功能完整性 | 8.5 | 8.0 | 8.8 | 簇检测上线,功能完整 |
| 稳定性 | 6.0 | 7.5 | 8.5 | 输出爆炸根治、防卷土重来修复 |
| 性能 | 7.0 | 6.5 | 8.0 | 簇化后无 O(n²) 输出问题 |
| 安全性 | 6.5 | 8.5 | 8.5 | 稳定保持 |
| 文档 | 7.5 | 7.5 | 8.0 | README/Wiki 完善 |
| AI 友好 | 6.5 | 7.0 | 8.0 | init 可用、退出码全对、TUI 补全 |
总分:8.4 / 10(A- 优)
8.8×0.25 + 8.5×0.20 + 8.0×0.15 + 8.5×0.20 + 8.0×0.10 + 8.0×0.10
= 2.20 + 1.70 + 1.20 + 1.70 + 0.80 + 0.80
= 8.40评分演进
v1.0 7.1 (功能好,安全/稳定性欠账)
v1.1 7.6 (安全 6 漏洞修复,进入可信任区间)
v1.1.4 8.4 (簇重构根治输出爆炸,+696 行零回归)一句话:从「能用」(7.1)到「可信任」(8.4),三轮迭代把安全、稳定性、性能三个短板全部补齐,剩下的只是低危 UX 细节。
15. 附录:测试现场
环境现状
- 4 真实源(热汤茶馆/HF/World/hin.cool)923 篇,
integrity ok - 全部测试源/临时文件/dedup 规则已清理
- 待 commit:
RssReader.cs +696、Tui.cs +17、3 语言文件、README×2、sip.csproj、--version
测试数据说明
- 抄袭测试源:5 个(dup_a~h.xml,100%/80%/71%/61% 相似梯度)
- 压测构造:最大 7445 篇 / 27 源
- 安全测试:SSRF 服务器、实体炸弹、XXE、终端注入载荷
- 全部测试后已恢复干净环境
参考文件
sip-regression.sh(19 项快速回归脚本,任何人可跑)- sip 全面测试报告(2026-08-11)(第一轮,51 项功能测试)
sip-v1.1-测试报告-2026-08-12.md(v1.1 新功能)sip-安全复测报告-2026-08-12.md(安全)sip-第二轮成果汇总与评分-2026-08-12.md(第二轮)
报告生成:2026-08-12 | 全部结论基于实测复现 + 源码行号佐证 | 版本 sip v1.1.4 (built 2026-08-12 18:52)