248 lines
8.3 KiB
Markdown
248 lines
8.3 KiB
Markdown
# Web-Lite 数据审核平台 - TDD 开发计划
|
|
|
|
> 创建时间: 2025-05-22
|
|
> 测试框架: pytest (后端) + vitest (前端)
|
|
> 目标覆盖率: > 60%
|
|
|
|
---
|
|
|
|
## 测试环境配置
|
|
|
|
### 后端 (pytest)
|
|
|
|
```
|
|
pip install pytest pytest-asyncio httpx aiomysql
|
|
```
|
|
|
|
**conftest.py 基础配置:**
|
|
- 使用 SQLite in-memory 数据库
|
|
- FastAPI TestClient + async 测试
|
|
- 自动创建/销毁表
|
|
- 测试用户 fixture
|
|
|
|
### 前端 (vitest)
|
|
|
|
```
|
|
npm install -D vitest @testing-library/react @testing-library/jest-dom jsdom
|
|
```
|
|
|
|
---
|
|
|
|
## 测试计划
|
|
|
|
### Phase 1: 后端 API 测试 (P0 — 阻塞)
|
|
|
|
> 目标:确保所有现有 API 行为正确,为前后端对接打基础
|
|
|
|
#### 1.1 认证模块 `tests/test_auth.py`
|
|
|
|
| # | 测试用例 | 优先级 | 状态 |
|
|
|---|---------|--------|------|
|
|
|| 1 | 正确密码登录 → 200 + token + user | P0 | ✅ |
|
|
|| 2 | 错误密码登录 → 401 | P0 | ✅ |
|
|
|| 3 | 用户不存在 → 401 | P0 | ✅ |
|
|
|| 4 | 已禁用用户登录 → 403 | P0 | ✅ |
|
|
|| 5 | GET /me 无 token → 401 | P0 | ✅ |
|
|
|| 6 | GET /me 有效 token → 200 + user info | P0 | ✅ |
|
|
|| 7 | token 过期 → 401 | P1 | ✅ |
|
|
|| 8 | POST /logout → 200 | P1 | ✅ |
|
|
|
|
#### 1.2 用户管理 `tests/test_users.py`
|
|
|
|
| # | 测试用例 | 优先级 | 状态 |
|
|
|---|---------|--------|------|
|
|
| 1 | admin 列出用户 → 200 | P0 | ⬜ |
|
|
| 2 | non-admin 列出用户 → 403 | P0 | ⬜ |
|
|
| 3 | 创建用户(正常) → 201 | P0 | ⬜ |
|
|
| 4 | 创建用户(重复用户名) → 400 | P0 | ⬜ |
|
|
| 5 | 获取单个用户 → 200 | P1 | ⬜ |
|
|
| 6 | 更新用户信息 → 200 | P1 | ⬜ |
|
|
| 7 | 删除用户 → 200 | P1 | ⬜ |
|
|
| 8 | 删除自己 → 400 | P1 | ⬜ |
|
|
|
|
#### 1.3 数据源管理 `tests/test_instances.py`
|
|
|
|
| # | 测试用例 | 优先级 | 状态 |
|
|
|---|---------|--------|------|
|
|
|| 1 | 列出实例 → 200 | P0 | ✅ |
|
|
|| 2 | 创建实例 → 201 | P0 | ✅ |
|
|
|| 3 | 创建实例(non-admin) → 403 | P0 | ✅ |
|
|
|| 4 | 获取实例详情 → 200 | P1 | ✅ |
|
|
|| 5 | 更新实例 → 200 | P1 | ✅ |
|
|
|| 6 | 删除实例 → 200 | P1 | ✅ |
|
|
|| 7 | 测试连接(MySQL mock) → 测试结果 | P1 | ✅ |
|
|
|| 8 | 列出数据库 → 列表 | P2 | ⬜ |
|
|
|| 9 | 列出表 → 列表 | P2 | ⬜ |
|
|
|
|
#### 1.4 工单管理 `tests/test_tickets.py`
|
|
|
|
| # | 测试用例 | 优先级 | 状态 |
|
|
|---|---------|--------|------|
|
|
|| 1 | 列出工单(developer 只看自己的) → 过滤正确 | P0 | ✅ |
|
|
|| 2 | 列出工单(admin 看全部) → 全部 | P0 | ✅ |
|
|
|| 3 | 创建工单 → 201 | P0 | ✅ |
|
|
|| 4 | 创建工单(实例不存在) → 400 | P0 | ✅ |
|
|
|| 5 | 获取工单详情 → 200 | P1 | ✅ |
|
|
|| 6 | 获取别人工单(developer) → 403 | P1 | ✅ |
|
|
|| 7 | 审批工单(approve) → approved | P0 | ✅ |
|
|
|| 8 | 审批工单(reject) → rejected | P0 | ✅ |
|
|
|| 9 | 审批工单(non-dba) → 403 | P0 | ✅ |
|
|
|| 10 | 审批已执行工单 → 400 | P1 | ✅ |
|
|
|| 11 | 执行工单(已审批) → success | P0 | ✅ |
|
|
|| 12 | 执行工单(未审批) → 400 | P0 | ✅ |
|
|
|| 13 | 执行工单(执行失败) → failed | P1 | ⬜ |
|
|
|| 14 | 工单统计 → 正确数字 | P1 | ✅ |
|
|
|| 15 | 分页查询 → 正确分页 | P1 | ✅ |
|
|
|
|
#### 1.5 查询模块 `tests/test_query.py`
|
|
|
|
| # | 测试用例 | 优先级 | 状态 |
|
|
|---|---------|--------|------|
|
|
|| 1 | 执行 SELECT 查询 → 结果 | P0 | ✅ |
|
|
|| 2 | 执行 DROP → 拒绝 | P0 | ✅ |
|
|
|| 3 | 执行 DELETE → 拒绝 | P0 | ✅ |
|
|
|| 4 | 无 LIMIT 自动追加 → 限制行数 | P1 | ⬜ |
|
|
|| 5 | guest 无权查询 → 403 | P1 | ✅ |
|
|
|| 6 | 查询超时 → 错误 | P2 | ⬜ |
|
|
|| 7 | 审计日志记录 → 有记录 | P1 | ⬜ |
|
|
|
|
#### 1.6 仪表盘 `tests/test_dashboard.py`
|
|
|
|
| # | 测试用例 | 优先级 | 状态 |
|
|
|---|---------|--------|------|
|
|
| 1 | 获取统计数据 → 正确结构 | P1 | ⬜ |
|
|
| 2 | 未登录 → 401 | P1 | ⬜ |
|
|
|
|
---
|
|
|
|
### Phase 2: 前端对接 (P0 — v0.2.0) ✅ 已完成
|
|
|
|
> 前后端对接已完成,所有页面已替换 mock 数据为真实 API 调用
|
|
|
|
#### 2.1 API 集成测试
|
|
|
|
| # | 测试场景 | 优先级 | 状态 |
|
|
|---|---------|--------|------|
|
|
|| 1 | 登录流程:输入→请求→token存储→跳转 | P0 | ✅ |
|
|
|| 2 | Dashboard 加载:请求stats→渲染卡片 | P0 | ✅ |
|
|
|| 3 | 工单列表:请求→筛选→分页 | P0 | ✅ |
|
|
|| 4 | 新建工单:表单→提交→刷新列表 | P0 | ✅ |
|
|
|| 5 | 实例管理:CRUD→列表刷新 | P1 | ✅ |
|
|
|| 6 | 401 自动跳转登录页 | P0 | ✅ |
|
|
|
|
#### 2.2 组件测试
|
|
|
|
| # | 测试场景 | 优先级 | 状态 |
|
|
|---|---------|--------|------|
|
|
| 1 | LoginPage 渲染 + 表单验证 | P1 | ⬜ |
|
|
| 2 | Dashboard 统计卡片渲染 | P1 | ⬜ |
|
|
| 3 | TicketsPage 筛选功能 | P1 | ⬜ |
|
|
| 4 | RouteGuard 权限拦截 | P0 | ⬜ |
|
|
|
|
---
|
|
|
|
### Phase 3: 新功能 TDD (P1 — v0.3.0)
|
|
|
|
> 先写测试,再写代码
|
|
|
|
#### 3.1 Instance 密码加密 ✅ 已完成
|
|
|
|
| # | TDD 步骤 | 状态 |
|
|
|---|---------|------|
|
|
| 1 | 🔴 写测试:创建实例时密码加密存储 | ✅ test_crypto.py |
|
|
| 2 | 🔴 写测试:读取实例时密码解密返回 | ✅ test_crypto.py |
|
|
| 3 | 🟢 实现 AES-256-GCM 加密/解密工具 | ✅ app/core/crypto.py |
|
|
| 4 | 🟢 集成到 instance endpoint (create/update/decrypt) | ✅ |
|
|
| 5 | ✅ 9 个加密相关测试全部通过 | ✅ |
|
|
|
|
#### 3.2 SQL 审核规则引擎 ✅ 已完成
|
|
|
|
| # | TDD 步骤 | 状态 |
|
|
|---|---------|------|
|
|
| 1 | 🔴 写测试:SELECT * 规则触发 info | ✅ |
|
|
| 2 | 🔴 写测试:无 WHERE 的 UPDATE/DELETE 规则触发 error | ✅ |
|
|
| 3 | 🔴 写测试:DROP TABLE/TRUNCATE 规则 | ✅ |
|
|
| 4 | 🔴 写测试:生产环境额外规则(ALTER TABLE 等) | ✅ |
|
|
| 5 | 🟢 实现 10 条规则引擎 | ✅ app/services/audit_engine.py |
|
|
| 6 | 🟢 集成到工单创建流程(自动审核+评分) | ✅ |
|
|
| 7 | ✅ 23 个审核引擎测试全部通过 | ✅ |
|
|
|
|
#### 3.3 操作审计日志 ✅ 已完成
|
|
|
|
| # | 测试用例 | 状态 |
|
|
|---|---------|------|
|
|
| 1 | 审计日志列表 API (admin/dba) | ✅ |
|
|
| 2 | 审计日志列表 API (developer 禁止) | ✅ |
|
|
| 3 | 创建实例 → 审计日志 | ✅ |
|
|
| 4 | 创建用户 → 审计日志 | ✅ |
|
|
| 5 | 创建工单 → 审计日志(含审核评分) | ✅ |
|
|
| 6 | 审批工单 → 审计日志 | ✅ |
|
|
| 7 | 审计日志分页 | ✅ |
|
|
| 8 | 审计日志过滤 | ✅ |
|
|
| 9 | ✅ 9 个审计日志测试全部通过 | ✅ |
|
|
|
|
---
|
|
|
|
### Phase 4: 安全测试 (P1)
|
|
|
|
| # | 测试场景 | 状态 |
|
|
|---|---------|------|
|
|
| 1 | SQL 注入:`DROP TABLE users; --` 被拦截 | ⬜ |
|
|
| 2 | SQL 注入:`UNION SELECT * FROM users` 被拦截 | ⬜ |
|
|
| 3 | 越权:developer 不能审批工单 | ⬜ |
|
|
| 4 | 越权:developer 不能访问 admin API | ⬜ |
|
|
| 5 | Token 伪造 → 401 | ⬜ |
|
|
| 6 | 并发创建工单不会重复 | ⬜ |
|
|
|
|
---
|
|
|
|
## 测试目录结构
|
|
|
|
```
|
|
backend/
|
|
├── tests/
|
|
│ ├── conftest.py # fixtures: db, client, users, token, test_instance
|
|
│ ├── test_auth.py # 认证测试 (8)
|
|
│ ├── test_users.py # 用户管理测试 (8)
|
|
│ ├── test_instances.py # 数据源测试 (8)
|
|
│ ├── test_tickets.py # 工单测试 (11)
|
|
│ ├── test_query.py # 查询测试 (4)
|
|
│ ├── test_dashboard.py # 仪表盘测试 (2)
|
|
│ ├── test_crypto.py # 加密测试 (9)
|
|
│ ├── test_audit_engine.py # SQL审核引擎测试 (23)
|
|
│ ├── test_audit_logs.py # 审计日志测试 (9)
|
|
│ ├── test_sql_analyzer.py # SQL AST测试 (34)
|
|
│ └── test_audit_rules.py # 审核规则CRUD测试 (14)
|
|
|
|
frontend/
|
|
├── src/
|
|
│ ├── __tests__/
|
|
│ │ ├── setup.ts # vitest setup
|
|
│ │ ├── LoginPage.test.tsx
|
|
│ │ ├── Dashboard.test.tsx
|
|
│ │ ├── TicketsPage.test.tsx
|
|
│ │ └── RouteGuard.test.tsx
|
|
```
|
|
|
|
---
|
|
|
|
## 覆盖率目标
|
|
|
|
| 阶段 | 目标后端覆盖率 | 目标前端覆盖率 |
|
|
|------|--------------|--------------|
|
|
| Phase 1 完成 | 40% | 0% |
|
|
| Phase 2 完成 | 50% | 30% |
|
|
| Phase 3 完成 | 60% | 40% |
|
|
| Phase 4 完成 | 70% | 50% |
|
|
|
|
---
|
|
|
|
## 执行优先级
|
|
|
|
1. ~~**立刻** — 创建 conftest.py + test_auth.py~~ ✅
|
|
2. ~~**v0.2.0** — Phase 1 全部完成~~ ✅
|
|
3. ~~**v0.2.1** — Phase 2 前后端对接~~ ✅
|
|
4. ~~**v0.3.0** — Phase 3 密码加密 + SQL 审核引擎~~ ✅ (85 tests)
|
|
4. ~~**v0.4.0** — Phase 4 SQL AST + 规则管理 + Alembic + Docker~~ ✅ (128 tests)
|
|
5. **v0.5.0** — Phase 5 运维工具 + 真实DB连接 + CI/CD ✅
|