# 实施计划:按现有架构接入测试管理模块 ## 目标 在当前 Flask + SQLAlchemy 手写分层架构下,按现有模式扩展测试管理能力。保持 `model/dao/service/controller/views` 分层,不引入 FastAPI、异步框架、Celery、WebSocket 等大改架构内容。先实现同步 CRUD 与核心数据流,异步任务/实时推送/外部缺陷系统作为后续阶段。 ## 当前架构约束 - 路由集中在 `app/api/views.py` 的 Flask Blueprint `api` 下。 - Controller 位于 `app/api/controller/*Controller.py`。 - Service 位于 `app/api/service/*Service.py`。 - DAO 位于 `app/api/dao/*Dao.py`。 - Model 位于 `app/api/model/*Model.py`,使用 SQLAlchemy declarative。 - 数据库连接使用 `common/sqlSession.py` 的 `SqlSession`。 - 响应统一使用 `common/apiResponse.py`。 ## 命名与接口策略 当前已有接口路径是 `/it/api/...` 风格,不采用设计稿中的 `/api/v1/projects/{project_id}/...` 作为硬切换。 新增接口建议挂在同一个 Blueprint 下,保持风格: - 项目:`/project/list`、`/project/detail`、`/project/create`、`/project/update`、`/project/delete` - 环境:`/environment/list`、`/environment/create`、`/environment/update`、`/environment/delete` - 模块:`/module/tree`、`/module/create`、`/module/update`、`/module/delete` - 用例:`/case/list`、`/case/detail`、`/case/create`、`/case/update`、`/case/delete` - 用例快照:`/case/snapshot/create`、`/case/snapshot/list` - 用例评审:`/case/review/create`、`/case/review/update`、`/case/review/list` - 测试计划:`/plan/list`、`/plan/detail`、`/plan/create`、`/plan/update`、`/plan/delete` - 计划用例:`/plan/case/add`、`/plan/case/list`、`/plan/case/execute` - 轮次:`/plan/round/list`、`/plan/round/create` - 报告:`/report/list`、`/report/detail`、`/report/generate` - 造数:`/data/builder/list`、`/data/builder/detail`、`/data/builder/create`、`/data/builder/update`、`/data/builder/delete`、`/data/builder/execute`、`/data/task/status` ## 阶段 1:模型层与基础 DAO 新增 model 文件: - `projectModel.py` - `Project` - `ProjectMember` - `Environment` - `caseModel.py` - `Module` - `TestCase` - `CaseSnapshot` - `CaseReview` - `planModel.py` - `TestPlan` - `PlanCase` - `TestRound` - `reportModel.py` - `Report` - `DefectSync` - `dataBuilderModel.py` - `DataBuilder` - `DataTask` 实现细节: - PostgreSQL `JSONB` 使用 `sqlalchemy.dialects.postgresql.JSONB`。 - PostgreSQL 数组 `tags VARCHAR(64)[]` 使用 `ARRAY(String(64))`。 - `BIGSERIAL` 模型上用 `BigInteger` + `Sequence` 或直接 `BigInteger primary_key=True autoincrement=True`,保持 SQLAlchemy 兼容。 - 所有 `created_time/updated_time` 使用 `TIMESTAMP, server_default=text('CURRENT_TIMESTAMP')`,风格参考现有 `UpdateSqlProject`。 - 如需软删除,设计稿多数表未含 `is_delete`。为了保持删除接口一致性,优先给业务主表补 `is_delete` 字段:`project`、`module`、`test_case`、`test_plan`、`data_builder`。关联/历史表可物理保留不删。 新增 DAO 文件: - `projectDao.py` - `caseDao.py` - `planDao.py` - `reportDao.py` - `dataBuilderDao.py` DAO 公共实现规则: - 列表方法统一接收 `filter_list, page, limit`。 - 详情方法统一按 `id` + `is_delete=0` 查询。 - 删除方法统一更新 `is_delete=1`。 - 创建/更新方法返回 `(id, err_msg)` 或 `(obj, err_msg)`,与现有 `UpdateSqlProjectDao` 保持一致。 ## 阶段 2:项目、环境、模块、用例基础 CRUD 新增 Service: - `projectService.py` - `caseService.py` 新增 Controller: - `projectController.py` - `caseController.py` 先实现: - 项目 CRUD - 项目成员新增/删除/列表 - 环境 CRUD - 模块树 CRUD - 用例 CRUD - 用例详情返回不暴露 `is_delete` - 用例列表支持:`projectId/moduleId/priority/caseType/status/tags/keyword/pageNo/pageSize` 关键逻辑: - 创建用例时生成 `case_key`,项目内递增,如 `TC-001`。初版可按当前项目最大 id 或 count 生成,后续再优化并发锁。 - 更新用例时可选生成快照,初版提供单独 `/case/snapshot/create`。 - 删除用例只更新 `test_case.is_delete=1`。 ## 阶段 3:评审与快照 在 `caseDao/service/controller` 内补: - 创建快照 - 查询快照列表 - 创建评审记录 - 更新评审状态/评论 接口: - `POST /case/snapshot/create` body: `{caseId, createdBy}` - `GET /case/snapshot/list?caseId=...` - `POST /case/review/create` body: `{caseId, reviewerId, comments?}` - `POST /case/review/update` body: `{reviewId, status, comments?}` - `GET /case/review/list?caseId=...` ## 阶段 4:测试计划与执行闭环 新增 Service/Controller: - `planService.py` - `planController.py` 实现: - 测试计划 CRUD - 轮次创建/列表 - 批量添加用例到计划 - 执行计划用例,更新状态、实际结果、缺陷链接、附件、执行时间、执行耗时 - 计划详情聚合统计:`total_cases/completed/pass_rate/passed/failed/blocked` - 进度接口:按轮次、执行人聚合 接口: - `GET /plan/list` - `POST /plan/create` - `GET /plan/detail?planId=...` - `POST /plan/delete` - `POST /plan/case/add` - `GET /plan/case/list?planId=...&roundNo=...` - `POST /plan/case/execute` - `GET /plan/progress?planId=...` 初版不自动创建外部缺陷,只保存 `defect_links`。外部 JIRA/TAPD/禅道集成后续单独做。 ## 阶段 5:报告 新增: - `reportService.py` - `reportController.py` - `reportDao.py` 实现同步版报告生成: - 根据 `plan_id` 聚合 `plan_case` 状态 - 保存 `report.summary` 和简单 HTML `content` - 列表/详情查询 接口: - `GET /report/list?planId=&pageNo=&pageSize=` - `POST /report/generate` body: `{planId, generatedBy}` - `GET /report/detail?reportId=...` 不实现 PDF 导出、异步任务、模板编辑器;这些需后续引入任务队列/文件服务。 ## 阶段 6:造数模块 MVP 新增: - `dataBuilderService.py` - `dataBuilderController.py` - `dataBuilderDao.py` - `common/dataBuilderExecutor.py` 实现: - 造数器 CRUD - 同步执行 JSON 定义 - 支持 step type:`http`、`db` - 先不支持不安全的 `script exec`,避免安全风险 - 执行结果保存到 `data_task` 接口: - `GET /data/builder/list?projectId=...` - `POST /data/builder/create` - `GET /data/builder/detail?builderId=...` - `POST /data/builder/update` - `POST /data/builder/delete` - `POST /data/builder/execute` body: `{builderId, params, async:false}` - `GET /data/task/status?taskId=...` ## 阶段 7:路由注册 修改 `app/api/views.py`: - 保留现有 SQL 管理接口。 - 追加新模块路由。 - 每个路由实例化对应 Controller,返回 `ApiResponse`。 为避免 `views.py` 过大,若当前应用允许多 Blueprint,后续可拆 `projectViews.py/caseViews.py/...`;本次先保持单文件,符合现有架构。 ## 阶段 8:数据库初始化 SQL 新增建表 SQL 文件需要用户确认放置位置。建议: - `sql/test_management_schema.sql` 注意:当前仓库不应主动创建文档,但 schema SQL 属于代码资产,可在用户确认后创建。 ## 阶段 9:验证 最低验证: - Python 语法检查:`python -m py_compile` 对新增/改动 py 文件。 - 手动接口链路: 1. 创建项目 2. 创建模块 3. 创建用例 4. 查询用例列表/详情 5. 创建计划 6. 添加用例到计划 7. 执行用例 8. 生成报告 ## 非本次直接实现范围 - WebSocket 实时推送 - Celery 异步任务 - PDF 导出/OSS 上传 - 外部缺陷系统自动创建 - 前端页面 - Docker Compose - Python 脚本沙箱执行 这些会影响架构和依赖,需要单独确认后再做。