(二十四)按状态变化组织测试
1. 从纯转换开始
先直接调用清洗函数,不启动网页和数据库,就能检查空白与重复规则。修改输入时只动一处,预测 Book 和计数后再运行。
# 项目文件:demos/cleaning_walk.py
from cataloghub.cleaning import clean_cards
# 改变空白和标签次序,观察两张原始卡片怎样变成一份书目。
first = {"source_id": "b101", "title": " Python 入门 ", "finished": "0", "tags": ["语法", " 基础 "]}
second = {**first, "title": "Python 入门", "tags": ["基础", "语法"]}
batch = clean_cards([first, second])
assert batch.books[0].title == "Python 入门"
assert batch.duplicates == 1 and len(batch.books) == 1
print(batch.books[0].data(), batch.duplicates)# 在 catalog_project 中执行,使用已经安装的 cataloghub 包。
uv run python ../demos/cleaning_walk.py
继续用 pytest 检查单条坏记录、相同重复与同编号冲突。这些测试只需要构造字典,失败时容易定位到转换规则。
2. 检查持久状态与组件组合
| 层次 | 采集查询项目 | 训练推理项目 |
|---|---|---|
| 纯数据 | 空白、标签、坏字段、重复与冲突 | 类型、形状、分组、训练统计量 |
| 文件与数据库 | 原始快照、事务回退、迁移、WAL 备份 | 整版发布、摘要、半途失败、旧版保留 |
| 应用请求 | 参数、翻页、转义、只读方法、就绪状态 | 生命周期、字段校验、预测值与版本 |
| 独立进程 | 重开后书目仍在 | 新进程重载相同版本得到相同结果 |
测试都使用临时数据库或模型目录,运行结束后清理。构造一个会改变数据库的失败,比只检查错误文本更有用:故意让第四本书写入失败,再重新连接查看第一本书是否也回退。模型测试则在数组保存时抛错,核对 current.json 没有跳到未完成版本。
# 分别在两个项目目录中运行同一个测试命令。
uv run python -m pytest
书目项目目前有 20 项、模型项目有 23 项检查。可以从 采集与事务测试、页面与备份测试、数据与版本测试 和 预测接口测试 查看输入与断言。