From aaf35f2d7a79f503aa74d2e2828a6ff503b2b882 Mon Sep 17 00:00:00 2001 From: QiuSW Date: Sat, 4 Jul 2026 23:34:05 +0800 Subject: [PATCH] test: add pytest baseline --- README.md | 5 +++-- docs/03-tech-stack.md | 8 ++++---- docs/05-coding-rules.md | 7 +++---- docs/06-tasks.md | 2 +- docs/current-state.md | 20 +++++++++++--------- progress.md | 9 +++++++++ pytest.ini | 2 ++ requirements.txt | 1 + tasks.md | 4 ++-- tests/test_project_setup.py | 8 ++++++++ 10 files changed, 44 insertions(+), 22 deletions(-) create mode 100644 pytest.ini create mode 100644 tests/test_project_setup.py diff --git a/README.md b/README.md index de59751..6a78b36 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ 基卫 CHIS 上报数据项目。项目目标是提供稳定的后端 API,供第三方系统提交体检数据;`chisup` 负责校验、转换、维护 CHIS 登录会话,并把符合 CHIS 接口格式的数据提交到基卫 CHIS。 -当前仓库处于 MVP 起步阶段:已有 Flask application factory 地基、health check、基础配置和架构包目录。当前已确认可参考 `D:\hans\chupd\chis\login_client_v2.py` 迁移 CHIS 登录链路,public key 由配置提供;访问 CHIS 支持可选 `CHIS_PROXY` SOCKS5 代理;保存上报前先实现只读体检详情查询来验证登录、会话、加密和通用请求。 +当前仓库处于 MVP 起步阶段:已有 Flask application factory 地基、health check、基础配置、pytest 测试入口和架构包目录。当前已确认可参考 `D:\hans\chupd\chis\login_client_v2.py` 迁移 CHIS 登录链路,public key 由配置提供;访问 CHIS 支持可选 `CHIS_PROXY` SOCKS5 代理;保存上报前先实现只读体检详情查询来验证登录、会话、加密和通用请求。 ## 文档入口 @@ -30,6 +30,7 @@ - Web 框架目标:Flask 3.0.3。 - Flask 结构:使用 application factory 模式,T-001 实现 `create_app(config_object=None)`。 - 依赖管理:T-001 创建 `requirements.txt`,使用 `python -m pip install -r requirements.txt` 安装到当前系统 Python 3.8 环境。 +- 测试入口:T-003 固定 `pytest==8.3.5`,使用 `python -m pytest`。 - 计划使用 Redis 保存 CHIS 会话缓存。 - 访问 CHIS 支持可选 `CHIS_PROXY`:为空直连,有值时 CHIS 登录、查询和保存请求走 SOCKS5 代理。 - 当前已有资料:`reverse_file/` 下的 CHIS 前端脚本、schema 和 HAR。 @@ -45,4 +46,4 @@ 3. [docs/current-state.md](docs/current-state.md) 4. [docs/06-tasks.md](docs/06-tasks.md) -编码前优先完成任务看板中的 Phase 0,先建立最小可运行 Flask 地基,再接入 CHIS 登录与会话验证,随后跑通只读体检详情查询,最后再做保存上报。 +编码前从任务看板领取第一个依赖已完成的 `TODO`。当前 Phase 0 已完成,下一步进入 CHIS 登录与会话验证,随后跑通只读体检详情查询,最后再做保存上报。 diff --git a/docs/03-tech-stack.md b/docs/03-tech-stack.md index 4e2be93..05e63e2 100644 --- a/docs/03-tech-stack.md +++ b/docs/03-tech-stack.md @@ -16,7 +16,7 @@ | 请求归档 | 本地 JSON 文件 | 已定 | `archives/` 每个接口请求一个完整归档文件,部署在内网前置机,不脱敏 | | 数据库 | 待定 | 待定 | MVP 可先只用 Redis;上报流水可能需要 MySQL / SQLite / PostgreSQL | | 第三方鉴权 | 待定,建议 app_key + HMAC 或 Bearer Token | 待定 | 不建议第三方直接裸传 CHIS 账号密码 | -| 测试 | pytest | 建议 | 适合 mapper、client、service 单元测试 | +| 测试 | pytest 8.3.5 | 已定 | 兼容当前系统 Python 3.8;适合 mapper、client、service 单元测试 | | 部署 | 待定,建议 gunicorn / waitress + systemd / Windows 服务 | 待定 | 取决于部署环境 | ## 二、决策记录与演进 @@ -36,16 +36,16 @@ ## 三、构建与运行命令 -当前尚未初始化项目代码,命令待 T-001 补齐。 +当前可用命令: | 用途 | 命令 | | --- | --- | | 安装依赖 | `python -m pip install -r requirements.txt` | | 本地开发 | `python run.py` | -| 测试 | `python -m unittest discover -s tests` | +| 测试 | `python -m pytest` | | 格式化 / 静态检查 | 待定 | -当前可用文档检查: +可选文档检查: ```powershell Get-ChildItem -Recurse -File # PowerShell diff --git a/docs/05-coding-rules.md b/docs/05-coding-rules.md index af35085..5944fb8 100644 --- a/docs/05-coding-rules.md +++ b/docs/05-coding-rules.md @@ -55,14 +55,13 @@ - client 测试:超时、CHIS 错误码、未登录重登。 - API 测试:鉴权失败、参数失败、幂等重复、成功提交。 -当前文档阶段可运行: +当前标准测试命令: ```powershell -Get-ChildItem -Recurse -File # PowerShell -# bash 等价: find . -type f -not -path './.git/*' +python -m pytest ``` -代码阶段的真实命令待 T-001 补齐。 +必要时可补充运行 `python -m unittest discover -s tests`,但 T-003 之后以 pytest 为主测试入口。 ## 6. 绝不 diff --git a/docs/06-tasks.md b/docs/06-tasks.md index a2ed466..3fcc77b 100644 --- a/docs/06-tasks.md +++ b/docs/06-tasks.md @@ -20,7 +20,7 @@ | --- | --- | --- | --- | --- | | T-001 | 初始化 Flask 项目骨架 | - | 使用当前系统 Python 3.8,不创建虚拟环境;创建 `requirements.txt` 并固定 `Flask==3.0.3`;使用 application factory 模式实现 `create_app(config_object=None)`;本地 health check API 可启动;真实命令同步到技术栈和当前状态 | DONE | | T-002 | 建立基础配置与目录 | T-001 | 目录符合架构文档;配置从环境变量读取;无真实密钥 | DONE | -| T-003 | 建立最小测试框架 | T-001 | pytest 可运行;至少有 `create_app` / health check 测试,能通过测试配置创建 Flask app | TODO | +| T-003 | 建立最小测试框架 | T-001 | pytest 可运行;至少有 `create_app` / health check 测试,能通过测试配置创建 Flask app | DONE | ## Phase 1 · CHIS 登录与会话 diff --git a/docs/current-state.md b/docs/current-state.md index 4d2d574..1b6f32c 100644 --- a/docs/current-state.md +++ b/docs/current-state.md @@ -5,13 +5,13 @@ ## 当前快照 - 日期:2026-07-04 -- 阶段:MVP 起步 / Flask 地基已初始化 -- 技术栈:当前系统 Python 3.8、Flask 3.0.3 application factory;不创建虚拟环境 +- 阶段:MVP 起步 / Phase 0 地基已完成 +- 技术栈:当前系统 Python 3.8、Flask 3.0.3 application factory、pytest 8.3.5;不创建虚拟环境 - 生产代码:`app/__init__.py`、`app/api/health.py`、`app/config.py`、`run.py`,以及 `app/middleware/`、`app/services/`、`app/mappers/`、`app/chis/`、`app/repositories/`、`app/validators/` 包目录 -- 测试:`tests/test_app_factory.py`、`tests/test_config_and_structure.py` +- 测试:`tests/test_app_factory.py`、`tests/test_config_and_structure.py`、`tests/test_project_setup.py` - 数据 / 资料:`reverse_file/` 下已有 CHIS HAR、前端脚本和 schema;`D:\hans\chupd\chis\login_client_v2.py` 可作为登录链路参考 - 标准启动路径:`python run.py` -- 标准验证路径:`python -m unittest discover -s tests` +- 标准验证路径:`python -m pytest` - 当前 blocker:无硬阻塞;后续实现需要把 Django 登录代码迁移为 Flask 版本,并通过配置提供 CHIS public key;访问 CHIS 时需要支持可选 SOCKS5 代理 ## 当前目录要点 @@ -29,22 +29,24 @@ | `app/repositories/` | 已有 | 存储 / 缓存包目录 | | `app/services/` | 已有 | 应用服务层包目录 | | `app/validators/` | 已有 | 请求校验包目录 | -| `tests/` | 已有 | `unittest` 测试 | -| `requirements.txt` | 已有 | Python 依赖,固定 `Flask==3.0.3` | +| `tests/` | 已有 | pytest 可收集的测试 | +| `pytest.ini` | 已有 | pytest 测试入口配置,限制测试目录为 `tests` | +| `requirements.txt` | 已有 | Python 依赖,固定 `Flask==3.0.3` 和 `pytest==8.3.5` | | `.env.example` | 已有 | 环境变量占位示例,不含真实密钥 | ## 任务看板状态 任务状态以 [06-tasks.md](06-tasks.md) 为准。 -- 已完成:DOC-001 建立 harness coding 项目文档;DOC-002 更新 CHIS 登录与只读查询验证路线;DOC-003 明确使用系统 Python 3.8;DOC-004 明确 Flask factory 模式;DOC-005 明确日志与请求归档方案;T-001 初始化 Flask 项目骨架;T-002 建立基础配置与目录。详见 [../progress.md](../progress.md)。 +- 已完成:DOC-001 建立 harness coding 项目文档;DOC-002 更新 CHIS 登录与只读查询验证路线;DOC-003 明确使用系统 Python 3.8;DOC-004 明确 Flask factory 模式;DOC-005 明确日志与请求归档方案;DOC-006 明确 CHIS SOCKS5 代理配置;T-001 初始化 Flask 项目骨架;T-002 建立基础配置与目录;T-003 建立最小测试框架。详见 [../progress.md](../progress.md)。 - 正在进行:无。 -- 下一个可领取任务:T-003 建立最小测试框架。 +- 下一个可领取任务:T-101 迁移 CHIS 登录链路。 ## 已确认技术事实 - CHIS public key 可通过配置文件或环境变量提供。 - 使用当前系统 Python 3.8 环境,不创建虚拟环境;T-001 创建 `requirements.txt` 固定依赖。 +- pytest 8.3.5 已固定到 `requirements.txt`;标准测试命令为 `python -m pytest`。 - Flask 应用使用 application factory 模式,`app/__init__.py` 暴露 `create_app(config_object=None)`。 - 基础配置通过环境变量读取:`CHIS_BASE_URL`、`CHIS_PUBLIC_KEY`、`CHIS_PROXY`、`REDIS_URL`、`LOG_DIR`、`ARCHIVE_DIR`。 - CHIS 外呼支持可选 SOCKS5 代理配置:`CHIS_PROXY` 为空直连;有值时后续 CHIS client 对登录、会话验证、查询和保存请求统一走代理。 @@ -61,7 +63,7 @@ ```powershell python -m pip install -r requirements.txt -python -m unittest discover -s tests +python -m pytest python run.py ``` diff --git a/progress.md b/progress.md index a57d392..2e733c9 100644 --- a/progress.md +++ b/progress.md @@ -97,3 +97,12 @@ - 阻塞:无。 - 决策:CHIS 出站请求支持可选 SOCKS5 代理;`CHIS_PROXY` 为空时直连,有值时 CHIS 登录、会话验证、查询和保存请求统一走代理;代理只作用于访问 CHIS 的出站请求,不影响第三方访问 `chisup` 的入站请求。 - 下一步:T-003 建立最小测试框架;后续 T-101 / T-201 实现登录和通用 CHIS client 时落地代理调用。 + +## 2026-07-04 T-003 建立最小测试框架 + +- 状态:DONE +- 变更:新增 `pytest.ini`,固定 pytest 测试目录为 `tests`;`requirements.txt` 增加 `pytest==8.3.5`;新增 `tests/test_project_setup.py` 校验 Flask 与 pytest 依赖固定;更新任务看板、技术栈、编码规则、当前状态、README 和根目录任务总览。 +- 验证:先执行 `python -m pytest tests/test_project_setup.py` 看到 `AssertionError: assert 'pytest==8.3.5' in ['Flask==3.0.3']`;实现后执行 `python -m pip install -r requirements.txt` 显示 Flask 与 pytest 均已满足,执行 `python -m pytest tests/test_project_setup.py` 结果 `1 passed`,执行 `python -m pytest` 结果 `4 passed`,执行 `python -m unittest discover -s tests` 结果 `Ran 3 tests ... OK`,临时启动 `python run.py` 后请求 `/health` 返回 `{"ok":true}`,执行 `git diff --check` 未发现空白错误。 +- 阻塞:无。 +- 决策:T-003 后标准测试入口改为 `python -m pytest`;保留既有 unittest 风格测试,pytest 可正常收集运行。 +- 下一步:T-101 迁移 CHIS 登录链路。 diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..5ee6477 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +testpaths = tests diff --git a/requirements.txt b/requirements.txt index 95fef4e..ba5e990 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ Flask==3.0.3 +pytest==8.3.5 diff --git a/tasks.md b/tasks.md index 2f966db..1ececdc 100644 --- a/tasks.md +++ b/tasks.md @@ -4,7 +4,7 @@ ## 当前阶段 -MVP 起步。当前仓库已具备逆向资料、项目文档、Flask application factory 地基、health check 和基础配置。 +MVP 起步。当前仓库已具备逆向资料、项目文档、Flask application factory 地基、health check、基础配置和 pytest 测试入口。 ## 近期任务 @@ -12,7 +12,7 @@ MVP 起步。当前仓库已具备逆向资料、项目文档、Flask applicatio | --- | --- | --- | | T-001 | 初始化 Flask 项目骨架 | DONE | | T-002 | 建立基础配置与目录 | DONE | -| T-003 | 建立最小测试框架 | TODO | +| T-003 | 建立最小测试框架 | DONE | | T-101 | 迁移 CHIS 登录链路 | TODO | | T-102 | 接入账号信息查询验证会话 | TODO | | T-103 | 实现 Redis 会话缓存 | TODO | diff --git a/tests/test_project_setup.py b/tests/test_project_setup.py new file mode 100644 index 0000000..0354ed4 --- /dev/null +++ b/tests/test_project_setup.py @@ -0,0 +1,8 @@ +from pathlib import Path + + +def test_requirements_pin_test_framework(): + requirements = Path("requirements.txt").read_text(encoding="utf-8").splitlines() + + assert "Flask==3.0.3" in requirements + assert "pytest==8.3.5" in requirements