Replace the old bbox/heuristic placement (scale search rounds, large-font capping, stratified sampling, fill-retry ladders) with an area-model font sizing pass feeding a C++ exact-glyph collision engine (centroid-biased spiral + random probing, HD clearance refinement, density/hole optimization). Simplify the frontend advanced-params panel and JobParams type to match the surviving config surface, add a layout-constraints test suite and a repeatable benchmark tool, and bring docs/*.md back in sync with current code (plus new TESTING.md and DEPLOYMENT.md). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
4.2 KiB
4.2 KiB
测试与基准
本文档覆盖当前代码中的测试工具和基准脚本。
单元测试
位置:backend/tests/test_layout_constraints.py
运行方式:
cd backend
python -m pytest tests/test_layout_constraints.py -v
测试矩阵(基于 unittest,不依赖外部服务):
| 测试 | 目的 |
|---|---|
test_size_ratio_one_keeps_every_equal_weight_size_identical |
SIZE_RATIO=1 时所有同权重词字号完全相同 |
test_explicit_equal_min_max_is_exact |
USER_MIN=USER_MAX=12 时所有词精确为 12px |
test_same_weight_groups_receive_the_same_size |
相同权重组内字号一致;权重组间字号递增 |
test_stroke_weight_is_applied_when_excel_weights_are_flat |
Excel 权重全为 1 时,笔画权重仍能产生区分度 |
test_largest_empty_square_ignores_space_outside_mask |
最大空洞算法只计算掩膜内区域 |
test_conflicting_explicit_font_bounds_fail |
MIN > MAX 时报错而非静默回退 |
test_explicit_max_overrides_automatic_readability_floor |
用户覆盖最大字号时,自动可读性下限让位于用户输入 |
test_base_class_never_uses_a_private_fallback_size |
基类布局不使用隐藏回退字号 |
test_rendered_ink_stays_inside_mask_and_does_not_overlap |
工作网格上:墨迹不超出掩膜、不重叠 |
test_hd_rendered_ink_does_not_overlap_after_scaling |
高清放大后:零重叠像素、零碰撞边距 |
固定种子(SEED=LAYOUT_SEED=20260718)确保可复现。
基准测试
位置:backend/tools/benchmark_layout.py
运行方式:
cd backend
python tools/benchmark_layout.py --counts 80 800 --canvas 2000 --assert-targets
参数:
| 参数 | 说明 |
|---|---|
--counts COUNT [COUNT ...] |
测试名单数量,默认 80 800 |
--canvas CANVAS |
画布尺寸,默认 2000 |
--max-growth-rounds N |
最大画布扩展轮数,默认 1 |
--assert-targets |
启用门禁检查 |
--output-dir PATH |
输出目录,默认 backend/benchmark_outputs/ |
门禁检查项(--assert-targets)
| 指标 | 阈值 | 含义 |
|---|---|---|
completeness |
= 1.0 |
名单必须全部放入 |
equal_weight_font_consistent |
True |
等权重时字号一致 |
hd_overlap_pixels |
= 0 |
高清渲染后零重叠 |
contour_grid_coverage |
≥ 0.80 |
轮廓网格覆盖率(避免大块空洞) |
hd_true_density |
≥ 0.10 |
真实笔画密度 |
total_seconds |
< 1.0s (count<100) / < 5.0s (count<1000) |
性能门槛 |
输出指标
| 指标 | 说明 |
|---|---|
count |
名单数量 |
canvas |
最终画布尺寸 |
canvas_growth_rounds |
画布扩展轮数 |
placed |
实际放置词数 |
completeness |
完整率 |
layout_seconds / render_seconds / total_seconds |
各阶段耗时 |
work_fill_ratio |
工作网格填充率 |
font_size_min / font_size_max |
字号范围 |
equal_weight_font_consistent |
等权重字号一致性 |
collision_margin |
碰撞边距 |
hd_clearance_shifted_words |
高清精修时位移词数 |
hd_clearance_max_shift |
最大位移像素 |
hd_clearance_px |
隔离带宽度 |
hd_clearance_priority_restarts |
优先级回溯次数 |
hd_overlap_pixels |
高清重叠像素(双重检查) |
largest_empty_square_work_px |
工作网格最大空洞(像素) |
largest_empty_square_font_ratio |
空洞相对字号比例 |
hd_true_density |
高清真实笔画密度 |
ink_bbox_coverage |
墨迹包围盒覆盖率 |
contour_grid_coverage |
轮廓网格覆盖率 |
基准结果保存为 JSON:backend/benchmark_outputs/benchmark.json
扩展基准
基准脚本使用 run_generation_pass() 直接调用核心管线,绕过 HTTP 服务和文件 IO。
- 生成数据:
make_names()使用中文姓氏库和双字名库组合出不重复姓名 - 掩膜:
make_round_mask()生成圆形掩膜 - 固定种子:
SEED=LAYOUT_SEED=20260718 - 固定配置:
SIZE_RATIO=1.0, N_REPETITIONS=1, WORK_SCALE=0.18, TARGET_FILL_RATIO=0.45
CI 建议
cd backend
python -m pytest tests/test_layout_constraints.py -v
python tools/benchmark_layout.py --counts 80 800 --canvas 2000 --assert-targets
两次运行均应在数秒内完成。