verify — prism-style-plot 回归验证套件
技能自带的回归验证脚本,随技能包分发,换机器不丢验证能力。
失败如何被捕获(v2.10.0 审计确认)
本目录脚本不用 assert 关键字(改用 verify_common.report(name, ok) 打印
[PASS]/[FAIL] + 脚本内自维护的 fails 列表),因此 grep -c assert 会得到 0,
但失败仍能被run_all.py 正确捕获——每个脚本收尾都有
sys.exit(1 if fails else 0),verify13 则用裸 assert(异常即非零退出)。
实测 19 个脚本全部具备失败退出分支。
排查时可直接看 stdout 里的 [FAIL] 行,或跑单脚本后echo $?(0=过,1=挂)。
与 pytest 的分工(重要,避免重复劳动)
技能有两层验证,职责不同,不要互相重复:
| | tests/(pytest) | scripts/verify/(本目录) |
|---|---|---|
| 断言 | 主战场:统计正确性、输入防御、API 契约 | 只保留本层独有的断言 |
| 产物 | 不产图(只断言) | 产出 PNG/PDF/报告供人工目视 |
| 规模 | 单点、小数据 | 大设计矩阵(组数×样本量)、端到端串跑 |
| 进程 | 单进程、共享 import | 每个脚本独立进程 |
| 耗时 | 全量 ≈40s(--fast ≈32s;单主题文件 ≈8–14s) | 全量 ≈10min |
新增能力时的规则:
- 先在
tests/建断言(快、可定位、随包分发、可只跑相关文件); - 只有当需要人工目视产物(图型外观、布局、标注位置)或要跑大设计矩阵时, 才在本目录加 verify 脚本;
- 不要在 verify 脚本里重复 pytest 已断言的内容。
重叠已消除(v2.12.x 重构):verify15 / verify16 原本与 pytest 的
test_plot_series / test_plot_forest_survival / test_plot_pairplot /
test_plot_traces_raster / test_plot_canvas_size 存在断言重叠。现已将其中
纯逻辑断言全部移除,verify15/16 只保留两类内容:① 跑真实数据产出 PNG 供
人工目视;② 极少数 pytest 未覆盖的断言(series options 渲染、非法 error_type
防御、forest sort/value_fmt、recommend_shape 既有档位锁、traces y 刻度隐藏、
raster n_bins 分箱、raster t_range 裁剪)。两体系至此各守一边、零重叠:
pytest = 逻辑断言,verify = 图产物 + 上述 unique 断言。
verify1–14 的真实分工(v2.12.x 审计修正):这些旧脚本的纯逻辑断言
(堆叠柱 / 水平柱 / 配对连线 / 误差线 5 口径 / CLD / 断轴 / 离群值 / RM one-way /
合并面板图等 API 契约)现已被 pytest 套件覆盖——它们保留的价值在三类 pytest
做不到的事:① 产出图供人工目视(所有脚本);② 大设计矩阵深度回归
(verify9/10/11:组数×样本量×交互形态,pytest 故意用小额数据);③ 少数视觉/
端到端断言(zorder 层级 pytest 0 覆盖、长标签旋转、多 sheet Excel 端到端、
墙钟耗时护栏)。故 verify1–14 勿删,但可按 verify15/16 同法进一步去重——
把其中与 pytest 完全重复的纯逻辑 check 删掉、只留出图 + 大矩阵 + 视觉断言(见
下表"建议"列)。
文件
| 文件 | 覆盖范围 |
|---|---|
| verify_common.py | 公共工具:模拟数据生成(make_groups)、重叠检查、PASS/FAIL 报告 |
| verify1_column.py | Column 表三大图型:prism_bars / prism_boxplot / prism_violin + ttest/ANOVA 统计 |
| verify2_others.py | 其他表型:Grouped 手写分组柱、Survival KM、XY 4PL/linear、Contingency |
| verify3a_dot_size.py | 点径自适应 + 配色越界 + 非参数检验 |
| verify3b_zorder_layout.py | 抖动布局 + zorder 图层 + 长标签旋转 |
| verify3c_edge_cases.py | 统计边界场景 + 3 表型 + 报告补强 |
| verify4_twoway_posthoc.py | Two-way ANOVA 事后比较:交互显著→简单效应 / 纯加性→主效应 |
| verify5_grouped_annotated.py | Grouped 图上简单效应显著性标注(交互数据,48h 起效示例) |
| verify6_figsize_recommend.py | 画布推荐(recommend_shape / recommend_figsize,表型默认 + 关键词覆盖) |
| verify7_ylim_small.py | ylim<1 值域:细粒度步长 + bracket 数据最大值收集 |
| verify8_ylim_small_allsigns.py | ylim<1 修复全图型推广(下限分级 / boxplot 边框 / 负值) |
| verify9_deep_matrix.py | 析因设计矩阵深度回归(组数×样本量×交互形态) |
| verify10_deep_others.py | 其他表型深度回归(含 figsize 关键词覆盖) |
| verify11_deep_edge.py | 深度边界/性能(NaN/inf、空组、n=1、预检、向量化;含墙钟耗时断言,强制串行) |
| verify12_combined_panel.py | v2.7.0 多数据集合并面板图 + 总报告(compose_panel_figure / build_master_report) |
| verify13_multi_sheet.py | v2.7.2 单 Excel 多 sheet 读取 → 合并面板图(read_excel_sheets) |
| verify14_v28_additions.py | v2.8.0 新增 API 回归(23 项):误差线 5 口径 + n=0/n=1 防御、log 轴守卫、零基线只在跨零时画、堆叠柱/水平柱/配对连线三个新图型、CLD 字母(两入口一致/链式 a·ab·b)、断轴、标签折行、离群值 Grubbs/ROUT、RM one-way(SS 分解闭合 + F 自洽)、投稿合规自检(不误报 + 真违规必检出)、XY 模型族(power 真实参数恢复)、7 种事后方案 + 效应量单调性、risk 表计数单调不增、布局缓存容量护栏。每个 check 用独立固定种子,可单独重跑任一检查 |
| verify15_v29_additions.py | v2.9.0 新增 API 图产物回归(12 项):prism_series(默认阴影带 / n=1 退化 / options 渲染{show_points·show_n·自定义 colors·markers·legend} / y 轴收尾出图)、prism_forest(显式 HR / mean-diff / cox= 端到端 / sort+value_fmt 渲染)、prism_survival cumulative 3 组出图、prism_pairplot upper='mirror' 出图、recommend_shape 时间序列→wide + 既有档位锁。纯逻辑断言已移交给 pytest;本文件只出图 + 保留 pytest 未覆盖的 4 项断言(options/非法 error_type/sort/value_fmt/档位锁)。每个 check 用独立固定种子,可单独重跑任一检查 |
| verify16_traces_raster.py | v2.9.2 新图型图产物回归(6 项):prism_traces(2D×6 出图 / groups 同组同色出图 / 自建 wide + y 刻度隐藏 + 显式比例尺)、prism_raster(PSTH 计数闭合 bin_size 出图 / n_bins 分箱出图 / t_range 裁剪)。纯逻辑断言(offset·spacing 公式、groups 着色、PSTH 计数闭合、trial 顺序、边界防御)已移交给 pytest;本文件只出图 + 保留 pytest 未覆盖的 3 项断言(y 刻度隐藏 / n_bins 路径 / t_range 裁剪)。每个 check 用独立固定种子,可单独重跑任一检查 |
| build_deep_report.py | 把 verify9/10 的深度回归产物汇总成一个 HTML 报告 |
| run_all.py | 一键回归入口(首选),跑固定 18 个 verify;无参数=全套,支持 --quick/--only <档位> |
| run_full_suite.py | 备用入口(v2.7.6 明确):glob 自动发现 verify*.py/test*.py。仅当你另有自定义 verify 脚本、不想改 run_all.py 注册表时用——不保证执行顺序、不并行、不隔离耗时脚本,日常回归请用 run_all.py |
运行方式
# 遵循技能环境约定:先取 venv 解释器
PY=$(python ../../scripts/ensure_env.py 2>/dev/null || python scripts/ensure_env.py)
# 入口 1(首选):跑固定 18 个官方 verify(自动清理 output/)
$PY scripts/verify/run_all.py
$PY scripts/verify/run_all.py --keep-output # 保留产物供人工复查
# 入口 2(备用,v2.3.1+):glob 自动发现当前目录所有 verify*.py + test*.py
# 仅当你有自定义 verify 脚本、不想改 run_all.py 注册表时使用
$PY scripts/verify/run_full_suite.py # Markdown 表格输出
$PY scripts/verify/run_full_suite.py --json # CI 友好 JSON 输出
$PY scripts/verify/run_full_suite.py /path/to # 自定义 verify 目录
单跑一个用例(调试时):
$PY scripts/verify/verify1_column.py
输出
- 产物(PNG/PDF/_report.md)写入
output/子目录,默认在回归全部通过后清理; - 退出码 0 = 全部 PASS,1 = 存在 FAIL;
- 新增用例:命名
verifyN_*.py放入本目录,并在run_all.py的VERIFY_SCRIPTS注册。
维护约定
- 每次对
scripts/prism_theme.py做改动,先python -c "import prism_theme"确认不崩, 再跑run_all.py确认无回归; - 回归失败立即还原改动,并记
status=reverted到 learnings.jsonl。 output/不参与技能包分发:该目录是回归运行的副产物 (PNG/PDF/_report.md/html),体积可达 1.5M+,只应存在于本地。 交付/分享技能包前用run_all.py(默认自动清理)或手动清空output/, 不要把output/内容带进技能包。run_all.py默认行为已满足此约定; 如需在沙箱环境(回收站不可用)手动清理,直接删除output/内文件即可。- 新增验证脚本必须带失败退出码:每个
verifyN_*.py结尾必须sys.exit(1 if fails else 0)(无 fails 列表时用sys.exit(0 if ok else 1))——run_all.py靠子进程退出码判定 PASS/FAIL,缺退出码会让脚本内 FAIL 被误报为 PASS("假绿",v2.1.1 教训)。
微信扫一扫