# 商品服务验证记录 验证日期:2026-09-10。系统:Windows。Python:3.12.6。本次使用机器现有 Python 环境,未安装或修改全局依赖。`requirements.txt` 保留此前锁定版本;本次未重新安装该锁定环境,实际使用版本见下表。 ## 自动化验收 在仓库根目录运行: ```text python -m pytest -q examples/test_main.py 41 passed in 21.89s python -m pip check No broken requirements found. ``` 覆盖健康检查与 OpenAPI、商品 CRUD 与 Location、q/is_active 组合筛选、默认 10 条限制、名称与查询参数、PUT 四个字段必填、统一 404/422、请求头与环境变量、CORS、SSE 帧和特殊字符、WebSocket echo/ping/重连。 价格专门验证:省略时默认为 0;0、1990、2147483647 保持整数分;负数、小数、字符串、布尔值、null 与超出 INT 上限的值均返回 422。非法创建或替换后原商品保持不变。描述验证 16000 字符边界,过长描述不会写入。 HTTPX 使用 MockTransport 验证上游成功、读取超时 504、HTTP 失败 502、连接失败 502,并检查 lifespan 关闭共享客户端。上游故障测试不访问网络。 API 入门与 API + 数据库课件中的 4 组 ProductCreate 模型也已实际执行价格边界验证,涵盖完整替换缺失价格、PATCH 显式 null 拒绝。此 API 验证记录不覆盖数据库结构与集成实验。数据库商品表与分类表的新建结构和约束已另行通过 MySQL 8.4.11 验证,范围见根 README;ORM CRUD、迁移和故障演练未在本次运行,代码语法检查不能替代这些集成验证。 ## 真实网络验证 另外启动隐藏的 Uvicorn 子进程,绑定 localhost 的独立临时端口,通过真实 TCP 和 WebSocket 调用。验证结束后已关闭子进程。 | 核验 | 实测结果 | | --- | --- | | 健康检查、文档、商品创建 / 读取 / 替换 / 删除、Location、价格、is_active 筛选 | 通过 | | `/private` 正确密钥与漏传密钥 | 200 / 401 | | `/generate` 完整结果到达 | 请求开始后 1.216 秒 | | 三个 SSE token 到达时间 | 请求开始后 0.418 / 0.821 / 1.225 秒 | | 完整文本与 done 事件 | `准备导出商品清单:catalog。导出进度演示完成。`,通过 | | 客户端中途关流后健康检查 | 200 | | 商品咨询文本的 WebSocket echo、ping、关闭连接 | 通过 | | 同时请求四个 `/slow?delay=1` | 全部 200,总耗时 1.019 秒 | 耗时是本次本机实测值,不是性能保证。SSE 到达时间来自真实 HTTP 流,未使用 TestClient 测量。导出接口只模拟进度文本,未生成实际清单文件;咨询接口只回显消息。 ## 本次实际使用版本 | 依赖 | 版本 | | --- | --- | | FastAPI | 0.115.0 | | Pydantic | 2.10.2 | | Starlette | 0.38.6 | | Uvicorn | 0.32.1 | | websockets | 16.1.1 | | HTTPX | 0.28.1 | | pytest | 8.4.2 | | AnyIO | 4.6.2.post1 | 这些版本与 `requirements.txt` 的此前基线锁定版本不同;本记录只声明上面实际运行环境的结果。