179 lines
5.2 KiB
Markdown
179 lines
5.2 KiB
Markdown
# Pytest 全链路验收说明
|
|
|
|
## 目标
|
|
|
|
把“不同租户 + 不同角色权限”的发布前验收,固化成可重复执行的黑盒测试,而不是继续依赖手工点接口。
|
|
|
|
当前套件覆盖两层:
|
|
|
|
1. `G1-G3` 发布门禁
|
|
2. 多租户、多角色矩阵基础链路
|
|
3. `G4` 文档跨租户读写边界
|
|
4. `G5` RAG 可见性与管理边界
|
|
5. `G6` 规则集/评查组只读矩阵与交叉评查建单边界
|
|
|
|
## 执行方式
|
|
|
|
先安装测试依赖:
|
|
|
|
```bash
|
|
.venv/bin/pip install -e .[test]
|
|
```
|
|
|
|
执行全部发布验收:
|
|
|
|
```bash
|
|
.venv/bin/python -m pytest tests/release -m release
|
|
```
|
|
|
|
只执行门禁链路:
|
|
|
|
```bash
|
|
.venv/bin/python -m pytest tests/release/test_g1_rbac_context.py tests/release/test_g2_g3_tenant_entry_chain.py -m release
|
|
```
|
|
|
|
## 默认环境变量
|
|
|
|
测试默认打正在运行的本地后端:
|
|
|
|
- `LEAUDIT_TEST_BASE_URL=http://127.0.0.1:8096`
|
|
- `LEAUDIT_TEST_ADMIN_USERNAME=000`
|
|
- `LEAUDIT_TEST_ADMIN_PASSWORD=admin06111`
|
|
- `LEAUDIT_TEST_TENANT_A_CODE=PTA01`
|
|
- `LEAUDIT_TEST_TENANT_B_CODE=PTB01`
|
|
|
|
如需切换:
|
|
|
|
```bash
|
|
LEAUDIT_TEST_BASE_URL=http://127.0.0.1:8096 .venv/bin/python -m pytest tests/release -m release
|
|
```
|
|
|
|
## 当前测试矩阵
|
|
|
|
### 角色
|
|
|
|
- 全局管理用户:直接复用现有管理员账号
|
|
- 租户管理员:自动创建 `admin` 角色测试用户
|
|
- 租户普通用户:自动创建 `common` 角色测试用户
|
|
|
|
### 租户
|
|
|
|
- `PTA01 / Pytest租户A`
|
|
- `PTB01 / Pytest租户B`
|
|
|
|
### 链路
|
|
|
|
- 登录 -> `/api/auth/me`
|
|
- 路由树 -> `/api/rbac/user/routes`
|
|
- 用户列表 -> `/api/v3/rbac/users`
|
|
- 组织树 -> `/api/admin/users/organizations/tree`
|
|
- 租户主数据 -> `/api/v3/tenants/*`
|
|
- 用户租户切换 -> `/api/v3/rbac/users/{id}/tenant`
|
|
- 首页入口 -> `/api/home/entry-modules`
|
|
- 入口模块租户分配 -> `/api/v3/entry-modules/*`
|
|
- 文档上传/列表/详情/更新/附件/删除 -> `/api/documents/*`
|
|
- RAG 应用/数据集详情边界 -> `/api/v3/rag/*`
|
|
- 规则集/评查组/交叉评查 -> `/api/rule-sets`、`/api/v3/evaluation-point-groups/*`、`/api/v3/cross-review/*`
|
|
|
|
## 测试数据策略
|
|
|
|
### 用户
|
|
|
|
测试用户通过 `OAuth 登录自动建号` 方式创建,再由管理员接口补齐:
|
|
|
|
- 角色绑定
|
|
- 租户绑定
|
|
|
|
这样可以避免直连数据库造数据,保持整套测试为 HTTP 黑盒。
|
|
|
|
### 租户
|
|
|
|
测试租户采用“存在则更新,不存在则创建”的策略,保证可重复运行。
|
|
|
|
### 入口模块
|
|
|
|
测试入口模块采用独立名称:
|
|
|
|
- `Pytest发布验收入口模块`
|
|
|
|
该模块默认落到 `/documents`,避免被当前“首页入口还要求命中路由树”的逻辑误过滤。
|
|
该模块在用例内动态切换租户分配,用来验证首页入口是否随租户边界正确显隐。
|
|
|
|
## 当前已固化断言
|
|
|
|
### G1
|
|
|
|
- 管理员可正常登录
|
|
- `/api/auth/me` 返回角色与权限上下文
|
|
- `/api/rbac/user/routes` 返回管理路由
|
|
- `/api/v3/rbac/users` 可访问
|
|
- `/api/admin/users/organizations/tree` 可访问
|
|
|
|
### G2
|
|
|
|
- 测试租户可创建/更新并保持启用
|
|
- 用户租户切换成功后,重新登录可看到正确 `tenant_code`
|
|
|
|
### G3
|
|
|
|
- 入口模块仅分配给租户 B 时,租户 A 首页不可见、租户 B 可见
|
|
- 入口模块同时分配给租户 A/B 时,两边首页都可见
|
|
|
|
### 角色/租户矩阵
|
|
|
|
- 全局管理员可以按不同租户查询用户
|
|
- 租户管理员只能看到本租户用户
|
|
- 租户管理员查询其他租户用户返回 `403`
|
|
- 租户管理员不能修改其他租户用户
|
|
- 普通用户不能访问系统设置管理接口
|
|
- 普通用户仍可看到本租户业务入口
|
|
|
|
### G4 文档
|
|
|
|
- 租户 A 创建文档后,租户 A 可见、租户 B 不可见
|
|
- 本租户管理员可更新本租户文档
|
|
- 跨租户更新、附件追加、删除返回拒绝
|
|
- 普通用户只能看到自己创建的文档
|
|
- 附件追加 `mergeMode=new` 当前行为是生成新版本,并保留 `previousVersionId`
|
|
|
|
### G5 RAG
|
|
|
|
- 全局管理员可创建/更新不同租户数据集
|
|
- 租户管理员可读取本租户数据集详情
|
|
- 租户管理员当前不能访问 `/api/v3/rag/datasets/admin`
|
|
- 租户管理员当前不能创建或修改数据集
|
|
- 本租户私有应用仅本租户可见
|
|
- 挂载公共数据集的应用可跨租户可见
|
|
|
|
### G6 规则集 / 评查组 / 交叉评查
|
|
|
|
- 规则集元数据列表当前为全局可读
|
|
- 规则绑定列表按入口模块租户映射过滤
|
|
- 评查组树按入口模块租户映射过滤
|
|
- 交叉评查同租户建单成功
|
|
- 交叉评查混入跨租户文档返回 `403`
|
|
- 交叉评查混入跨租户成员返回 `403`
|
|
|
|
## 当前执行结果
|
|
|
|
最近一次完整执行结果:
|
|
|
|
- `tests/release -m release`
|
|
- 结果:`16 passed`
|
|
|
|
这 16 条通过表达的是“当前真实系统行为已经被固定下来”,不等于所有目标设计都已经完成。
|
|
|
|
其中需要特别注意:
|
|
|
|
- `RAG` 当前仍保留“管理接口偏全局管理员”的现实权限模型
|
|
- 规则集元数据目前是全局可读,不应误读为已经完成规则资产完全租户化
|
|
- 交叉评查当前是单任务单租户模型
|
|
## 下一步扩展建议
|
|
|
|
下一批优先补:
|
|
|
|
1. `RAG` 数据集文档上传、重处理、删除链路
|
|
2. `RAG 会话` 创建、重命名、删除、消息反馈链路
|
|
3. `规则版本` 创建、发布、回滚、内容读取矩阵
|
|
4. `交叉评查` 补传、提案、投票、归档深链路
|