跳转至

测试架构

pplx_export 测试套件:全离线、fixture 已入库、渲染快照锁定。小节保留 架构总览的原始编号;任务导向的测试操作见 测试Fixtures


13. 测试体系

位置 tests/(包外),运行 uv run pytest tests全离线, fixture 已入库,零网络;用例数量随回归增补持续增长,以实测输出为准)。

文件 覆盖 要点
conftest.py render_fixture / rendered fixture 复制 fixtures 的 raw JSON 到 tmp 目录,复用 commands.rerender_cmd.rerender 离线重渲(conftest.py:56-68),与生产路径同一代码
test_render_snapshots.py 渲染快照回归 五模式全线程 fixture(search/deep-research/computer/council/study)+ 五个裁剪缺陷场景(computer 答案兜底 / 子代理 fallback / USER_RESPONSE 问答对 / 桩轮关联 / 嵌套工作流折叠),重渲结果与 golden 逐字节比对;另有 dict repr 残留特征检查
test_units.py 核心单测 BatchState(含尾零归一化 _norm_ts、expired 终态、corrupt 备份)、Throttle(backoff 公式/封顶/reset)、plan_incremental(四态/早停/full/force)、AssetDownloader._final_name(双扩展名防护)、normalize_math_delims(围栏/行内码保护、混合残留)、TestDetectMode(search_mode 判别)、TestSafeFolder(目录名消毒)、TestFetchMissingBlocks(study 范围+多账户分组)、TestExternalReviewFixes(外部审查回归:表格不截断/cookie 权限/域匹配等)
test_interruptions.py 中断语义 classify_wf_status 五类、归属瀑布③附录、渲染加注、中断登记;场景 fixture:scenario_limit_interrupted(限额中断 + 38 步未消费负载入附录)、scenario_canceled
test_stub_workflows.py 桩轮关联 match_stub_workflows 语义(桩定义、10s 窗、used_cand 单次消费、anchored 排除)、render_wf_item 嵌套渲染的递归/去重守卫(深度 ≤2 + id 集合防自引用,render.py:171)
test_fix_n01…n11_*.py
(9 个文件)
第二轮外部审查回归
(N-01..N-12)
内联资产同名多版本落盘冲突(N-01)/ spaces 反链相对层级(N-02)/ 引文去重共享实现 + turns/ 残留清理(N-03、N-12)/ cookie JSON-list 域后缀匹配(N-04)/ WebBridge 错误分类、末次重试不白睡等(N-05/06/09)/ usage-backfill 中途落盘口径(N-07)/ Throttle.backoff 溢出防护(N-08)/ 表格列头转义(N-10)/ batch total 口径(N-11);各文件头 docstring 有逐条发现复述
test_fix_v301 / v305_*.py
(2 个文件)
第三轮审查回归
(V3-01 / V3-05)
嵌套 WORKFLOW_ITEM_SOURCES 的 text_payload 正文渲染(V3-01);导出路径测试盲区补齐——thread.json interruptions 写盘等导出专属产物(V3-05)
test_fix_v4*.py 第四轮审查回归
(V4-01..V4-06)
随各发现修复落地逐条增补(如 V4-03 句柄类资产落盘幂等);文件头 docstring 复述对应发现
test_fix_v5_review.py
(+ 既有文件增补)
第五轮审查回归
(V5-01..V5-10)
lastUpdated 契约(V5-01:export 用索引 updatedAt / ts_us_to_iso_full / is_unchanged 恢复)/ find_thread_dirs 与 spaces 反链严格化(V5-03/04)/ --mode 五模式过滤(V5-05)/ cookie 原子写(V5-06)/ spaces 离线豁免(V5-08)/ cron 片段 out_root 与引号(V5-10);目录迁移冲突语义改为恒保留 keeper 的回归在 test_fix_v401_thread_dir_migration.py 内重写
test_relations.py 关系图(§15 same_prompt 归一化(大小写/尾标点/NFKC/空查询不建边、簇内链式非团簇、定时任务 vs 人工重发 evidence、query_source 取自 raw)/ references(引文 URL、答案文本链接、裸 uuid、未归档与自链忽略、去重单边、子代理引文纳入扫描面)/ subagent_of(会话级 sub_agents 建边、已归档子代理线程记入 evidence、真实 fixture 端到端)
test_search_mode_backfill.py search-mode-backfill(§16 search_mode 特异性优先/原值保留/未知值忽略/非 dict 容错;本地 raw 零网络、expired 终态跳过、在线兜底、幂等续跑、--limit;refresh 合并富化字段、首跑无旧索引、旧索引损坏告警仍写盘;batch --mode 过滤索引 search_mode 权威优先、启发式回退不变
test_sync_deleted.py sync-deleted(§17 候选判定(所有账户索引并集消失才算——跨账户 export_via 防误报、索引缺失安全跳过、非 ok 状态不产生候选);deleted 与 expired 并列终态(is_terminal、plan_incremental 同等截尾)
test_answer_variants.py
test_answer_variant_logging.py
answer_variants 检测链(§18 collect 收窄判据(命中 / 非 control 单独命中 / control 排除 / 负例)、rerender 登记幂等、健康线程无键;ANSWER_VARIANT_DETECTED 单行字段、空命中静默、jsonl 去重与 first_seen、rerender 仅变化告警

fixtures 来源tests/fixtures/README.md 有完整对照表):从 web_archive/ 复制的代表性线程原始数据(raw_entries/raw_blocks/thread.json),全线程 fixture 的 golden 是归档现行产物;裁剪 fixture 按 entry uuid 子集截取、保留归属关系。 回归策略 = 任何渲染层修改若改变产物字节即测试变红,与 re-render 的幂等承诺互锁。