480 lines
12 KiB
Markdown
480 lines
12 KiB
Markdown
|
|
# 高血压风险评估系统 - 2天详细测试计划
|
|||
|
|
|
|||
|
|
**版本:** v1.0
|
|||
|
|
**日期:** 2026-01-12
|
|||
|
|
**测试人员:** 成员A(云端)、成员B(边缘端)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📅 Day 1:组件测试日(并行执行)
|
|||
|
|
|
|||
|
|
### 09:30 - 10:00 | 启动会(两人一起)
|
|||
|
|
|
|||
|
|
**地点:** 会议室或线上会议
|
|||
|
|
**参与:** 成员A、成员B、项目负责人
|
|||
|
|
|
|||
|
|
**议程:**
|
|||
|
|
1. 明确测试范围(功能冒烟,不做性能与安全)
|
|||
|
|
2. 对齐device_id规则:
|
|||
|
|
- 成员A用:`test_edge_device_001`
|
|||
|
|
- 成员B用:`test_edge_device_002`
|
|||
|
|
- 联调用:`edge_rk3588_001`
|
|||
|
|
3. 确认日志输出目录:`artifacts/cloud/` 和 `artifacts/edge/`
|
|||
|
|
4. 同步沟通方式(钉钉/微信群即时响应)
|
|||
|
|
|
|||
|
|
**产出:** 两人都清楚自己的任务清单
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 10:00 - 12:00 | 上午:组件冒烟(并行)
|
|||
|
|
|
|||
|
|
#### 成员A:云端基础功能验证
|
|||
|
|
|
|||
|
|
**任务清单:**
|
|||
|
|
|
|||
|
|
✅ **Task 1.1:服务启动验证(15分钟)**
|
|||
|
|
```bash
|
|||
|
|
# 1. 启动云端
|
|||
|
|
python cloud_hypertension_system.py
|
|||
|
|
|
|||
|
|
# 2. 检查输出
|
|||
|
|
# 预期:
|
|||
|
|
# ✓ 数据库初始化成功
|
|||
|
|
# Running on http://127.0.0.1:5000
|
|||
|
|
```
|
|||
|
|
**记录:** 截图启动日志,保存为 `artifacts/cloud/startup.png`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
✅ **Task 1.2:健康检查API(10分钟)**
|
|||
|
|
```bash
|
|||
|
|
# 在新终端运行
|
|||
|
|
python scripts/check_health.py
|
|||
|
|
```
|
|||
|
|
**验收标准:**
|
|||
|
|
- 返回状态码200
|
|||
|
|
- 响应包含:`"status": "healthy"`
|
|||
|
|
|
|||
|
|
**记录:** 保存响应到 `artifacts/cloud/health.json`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
✅ **Task 1.3:正常上传测试(30分钟)**
|
|||
|
|
```bash
|
|||
|
|
python scripts/test_upload.py
|
|||
|
|
```
|
|||
|
|
**验收标准:**
|
|||
|
|
- 返回状态码200
|
|||
|
|
- 响应包含:`"status": "success"`
|
|||
|
|
- 云端控制台显示:`☁️ [API] 接收上传: 设备=test_edge_device_001`
|
|||
|
|
|
|||
|
|
**检查数据库:**
|
|||
|
|
```bash
|
|||
|
|
# 查看数据库是否有数据
|
|||
|
|
sqlite3 cloud_database.db "SELECT COUNT(*) FROM sensor_data;"
|
|||
|
|
# 应该返回:3(上传了3条事件)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**记录:**
|
|||
|
|
- 保存响应到 `artifacts/cloud/upload_response.json`
|
|||
|
|
- 保存云端日志到 `artifacts/cloud/upload.log`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
✅ **Task 1.4:报告生成测试(30分钟)**
|
|||
|
|
```bash
|
|||
|
|
python scripts/test_report.py
|
|||
|
|
```
|
|||
|
|
**验收标准:**
|
|||
|
|
- 返回状态码200
|
|||
|
|
- 生成报告文件:`./reports/report_test_edge_device_001_*.json`
|
|||
|
|
- 报告包含基本统计(虽然数据很少)
|
|||
|
|
|
|||
|
|
**记录:**
|
|||
|
|
- 复制生成的报告到 `artifacts/cloud/report_sample.json`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
✅ **Task 1.5:数据库检查(15分钟)**
|
|||
|
|
```bash
|
|||
|
|
# 检查各表记录数
|
|||
|
|
sqlite3 cloud_database.db <<EOF
|
|||
|
|
SELECT 'devices:', COUNT(*) FROM devices;
|
|||
|
|
SELECT 'sensor_data:', COUNT(*) FROM sensor_data;
|
|||
|
|
SELECT 'nightly_summary:', COUNT(*) FROM nightly_summary;
|
|||
|
|
EOF
|
|||
|
|
```
|
|||
|
|
**记录:** 保存查询结果到 `artifacts/cloud/db_check.txt`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 成员B:边缘端基础功能验证
|
|||
|
|
|
|||
|
|
**任务清单:**
|
|||
|
|
|
|||
|
|
✅ **Task 1.1:本地运行测试(45分钟)**
|
|||
|
|
```bash
|
|||
|
|
# 启动边缘端(模拟模式)
|
|||
|
|
python edge_hypertension_system.py > artifacts/edge/edge_45min.log 2>&1
|
|||
|
|
|
|||
|
|
# 让它运行45分钟,观察输出
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**验收标准(每30秒检查一次):**
|
|||
|
|
- ✅ 心率输出在合理范围(50-100 bpm)
|
|||
|
|
- ✅ 风险评分有数值(0-1之间)
|
|||
|
|
- ✅ 无Python异常/崩溃
|
|||
|
|
- ✅ 至少看到1次起夜事件(🚽)
|
|||
|
|
|
|||
|
|
**记录:**
|
|||
|
|
- 截图正常输出(3-5张)
|
|||
|
|
- 截图起夜事件
|
|||
|
|
- 保存完整日志:`artifacts/edge/edge_45min.log`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
✅ **Task 1.2:输出格式验证(15分钟)**
|
|||
|
|
|
|||
|
|
**检查输出是否包含:**
|
|||
|
|
- 时间戳
|
|||
|
|
- 生理指标(心率、RMSSD、SDNN)
|
|||
|
|
- 风险评分与等级
|
|||
|
|
- 系统性能(处理延迟)
|
|||
|
|
|
|||
|
|
**记录:** 在 `Test-Log.md` 中记录样例输出
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 12:00 - 13:30 | 午休
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 13:30 - 15:30 | 下午:深入测试(并行)
|
|||
|
|
|
|||
|
|
#### 成员A:云端异常场景与健壮性
|
|||
|
|
|
|||
|
|
✅ **Task 2.1:异常场景测试(60分钟)**
|
|||
|
|
```bash
|
|||
|
|
python scripts/test_negative.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**测试场景:**
|
|||
|
|
|
|||
|
|
1. **401 Unauthorized(错误API Key)**
|
|||
|
|
- 修改脚本中的API Key为错误值
|
|||
|
|
- 预期:返回401,错误信息清晰
|
|||
|
|
|
|||
|
|
2. **400 Bad Request(缺少字段)**
|
|||
|
|
- 使用 `test_data/sample_missing_field.json`
|
|||
|
|
- 预期:返回400,指出缺少哪个字段
|
|||
|
|
|
|||
|
|
3. **400 Bad Request(类型错误)**
|
|||
|
|
- 使用 `test_data/sample_wrong_type.json`
|
|||
|
|
- 预期:返回400,指出类型不匹配
|
|||
|
|
|
|||
|
|
**记录:** 每个场景保存:
|
|||
|
|
- 请求内容
|
|||
|
|
- 响应状态码
|
|||
|
|
- 错误信息
|
|||
|
|
- 云端日志
|
|||
|
|
|
|||
|
|
保存到:`artifacts/cloud/negative_tests.md`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
✅ **Task 2.2:重复上传测试(30分钟)**
|
|||
|
|
|
|||
|
|
**目标:** 验证重复上传的行为
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 连续上传同一份数据3次
|
|||
|
|
for i in range(3):
|
|||
|
|
response = requests.post(...)
|
|||
|
|
print(f"第{i+1}次上传:{response.status_code}")
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**检查数据库:**
|
|||
|
|
```bash
|
|||
|
|
sqlite3 cloud_database.db "SELECT COUNT(*) FROM sensor_data WHERE device_id='test_edge_device_001';"
|
|||
|
|
# 记录数量是3、9还是其他?
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**记录:**
|
|||
|
|
- 重复上传行为(是幂等/累加/拒绝?)
|
|||
|
|
- 如果不符合预期,记录为Bug
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 成员B:边缘端容错与上传
|
|||
|
|
|
|||
|
|
✅ **Task 2.1:上传功能测试(60分钟)**
|
|||
|
|
|
|||
|
|
**前提:** 确保云端正在运行(与成员A协调)
|
|||
|
|
|
|||
|
|
**步骤:**
|
|||
|
|
|
|||
|
|
1. **修改边缘端配置,启用上传:**
|
|||
|
|
```python
|
|||
|
|
# edge_hypertension_system.py 第75行
|
|||
|
|
'enable_upload': True,
|
|||
|
|
'upload_url': 'http://127.0.0.1:5000/api/upload',
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **运行边缘端,观察上传:**
|
|||
|
|
```bash
|
|||
|
|
python edge_hypertension_system.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **每5分钟应该看到:**
|
|||
|
|
```
|
|||
|
|
☁️ [Cloud Upload] Uploaded 24 events to cloud
|
|||
|
|
✅ 上传成功!
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**验收标准:**
|
|||
|
|
- 至少成功上传2次(10分钟内)
|
|||
|
|
- 云端控制台显示接收日志
|
|||
|
|
|
|||
|
|
**记录:**
|
|||
|
|
- 边缘端上传日志
|
|||
|
|
- 云端接收日志(找成员A要)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
✅ **Task 2.2:上传失败与重试(30分钟)**
|
|||
|
|
|
|||
|
|
**模拟场景1:云端不可达**
|
|||
|
|
|
|||
|
|
1. **停止云端服务**(找成员A协调)
|
|||
|
|
2. 观察边缘端输出:
|
|||
|
|
```
|
|||
|
|
☁️ [Cloud Upload] Failed: Connection refused
|
|||
|
|
```
|
|||
|
|
3. 边缘端应该继续本地处理(不崩溃)
|
|||
|
|
|
|||
|
|
**模拟场景2:云端恢复**
|
|||
|
|
|
|||
|
|
1. **重新启动云端**
|
|||
|
|
2. 观察边缘端下次上传是否成功
|
|||
|
|
|
|||
|
|
**记录:**
|
|||
|
|
- 失败日志:`artifacts/edge/upload_fail.log`
|
|||
|
|
- 恢复日志:`artifacts/edge/upload_recover.log`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 15:30 - 16:30 | 交叉复核
|
|||
|
|
|
|||
|
|
**目标:** 避免"只在我电脑上能跑"的问题
|
|||
|
|
|
|||
|
|
**步骤:**
|
|||
|
|
|
|||
|
|
1. **成员A 在自己电脑上复现 成员B的操作:**
|
|||
|
|
- 运行边缘端10分钟
|
|||
|
|
- 检查输出是否正常
|
|||
|
|
|
|||
|
|
2. **成员B 在自己电脑上复现 成员A的操作:**
|
|||
|
|
- 启动云端
|
|||
|
|
- 运行 `test_upload.py`
|
|||
|
|
- 检查是否成功
|
|||
|
|
|
|||
|
|
**记录:**
|
|||
|
|
- 如果复现失败,记录差异(系统版本、Python版本、依赖版本)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 16:30 - 17:00 | Day 1总结
|
|||
|
|
|
|||
|
|
**两人一起填写:**
|
|||
|
|
- Day 1完成情况(哪些通过,哪些失败)
|
|||
|
|
- 发现的问题清单
|
|||
|
|
- Day 2重点关注点
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📅 Day 2:联调测试日(协同执行)
|
|||
|
|
|
|||
|
|
### 09:30 - 11:00 | 端到端闭环测试
|
|||
|
|
|
|||
|
|
**目标:** 验证完整链路:边缘端 → 云端 → 报告
|
|||
|
|
|
|||
|
|
**前提:**
|
|||
|
|
- 两人在同一网络
|
|||
|
|
- 或者都连接到云端服务器
|
|||
|
|
|
|||
|
|
**步骤:**
|
|||
|
|
|
|||
|
|
✅ **Step 1:启动云端(成员A)**
|
|||
|
|
```bash
|
|||
|
|
python cloud_hypertension_system.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
✅ **Step 2:配置边缘端(成员B)**
|
|||
|
|
```python
|
|||
|
|
# 修改 device_id 为联调专用
|
|||
|
|
'device_id': 'edge_rk3588_001',
|
|||
|
|
'upload_url': 'http://127.0.0.1:5000/api/upload', # 或成员A的IP
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
✅ **Step 3:启动边缘端(成员B)**
|
|||
|
|
```bash
|
|||
|
|
python edge_hypertension_system.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
✅ **Step 4:等待15分钟**
|
|||
|
|
- 边缘端应该上传3次(每5分钟一次)
|
|||
|
|
- 云端应该接收到数据
|
|||
|
|
|
|||
|
|
✅ **Step 5:生成报告(成员A)**
|
|||
|
|
```bash
|
|||
|
|
python scripts/test_report.py
|
|||
|
|
# 或直接访问API:
|
|||
|
|
# GET http://127.0.0.1:5000/api/report/edge_rk3588_001
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
✅ **Step 6:验证结果**
|
|||
|
|
- 报告包含15分钟的数据
|
|||
|
|
- 数据量约:72条记录(15分钟 × 2次/分钟 × 240秒)
|
|||
|
|
|
|||
|
|
**记录:**
|
|||
|
|
- 边缘端日志:`artifacts/end2end/edge.log`
|
|||
|
|
- 云端日志:`artifacts/end2end/cloud.log`
|
|||
|
|
- 生成的报告:`artifacts/end2end/report.json`
|
|||
|
|
- 数据库文件:`artifacts/end2end/cloud_database.db`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 11:00 - 12:00 | 失败注入测试
|
|||
|
|
|
|||
|
|
**目标:** 验证系统容错与错误提示
|
|||
|
|
|
|||
|
|
✅ **Scenario 1:错误API Key(10分钟)**
|
|||
|
|
- 修改边缘端API Key为错误值
|
|||
|
|
- 预期:边缘端显示"401 Unauthorized"
|
|||
|
|
- 预期:边缘端继续本地处理
|
|||
|
|
|
|||
|
|
✅ **Scenario 2:云端不可达(15分钟)**
|
|||
|
|
- 停止云端
|
|||
|
|
- 预期:边缘端显示连接失败,但不崩溃
|
|||
|
|
- 重启云端
|
|||
|
|
- 预期:边缘端恢复上传
|
|||
|
|
|
|||
|
|
✅ **Scenario 3:数据格式错误(15分钟)**
|
|||
|
|
- 手动修改上传数据,制造格式错误
|
|||
|
|
- 预期:云端返回400错误,指出问题
|
|||
|
|
- 预期:边缘端记录错误但不崩溃
|
|||
|
|
|
|||
|
|
**记录:** 每个场景的日志和截图
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 12:00 - 13:30 | 午休
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 13:30 - 15:00 | 整理交付物
|
|||
|
|
|
|||
|
|
**任务分工:**
|
|||
|
|
|
|||
|
|
**成员A:整理云端产物**
|
|||
|
|
- [ ] 收集所有日志文件到 `artifacts/cloud/`
|
|||
|
|
- [ ] 导出数据库文件
|
|||
|
|
- [ ] 整理API测试结果
|
|||
|
|
- [ ] 填写 `Checklist-Cloud.md`
|
|||
|
|
|
|||
|
|
**成员B:整理边缘端产物**
|
|||
|
|
- [ ] 收集所有日志文件到 `artifacts/edge/`
|
|||
|
|
- [ ] 整理运行截图
|
|||
|
|
- [ ] 填写 `Checklist-Edge.md`
|
|||
|
|
|
|||
|
|
**两人一起:**
|
|||
|
|
- [ ] 填写 `Test-Log.md`(完整时间线)
|
|||
|
|
- [ ] 填写 `Bug-List.xlsx`(所有缺陷)
|
|||
|
|
- [ ] 撰写 `2-day-summary.md`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 15:00 - 16:00 | 测试总结会
|
|||
|
|
|
|||
|
|
**参与:** 成员A、成员B、项目负责人
|
|||
|
|
|
|||
|
|
**议程(只回答3个问题):**
|
|||
|
|
|
|||
|
|
1. **现在能否演示闭环?**
|
|||
|
|
- 能 / 不能
|
|||
|
|
- 如果不能,差哪一步?
|
|||
|
|
|
|||
|
|
2. **最大阻塞是什么?**
|
|||
|
|
- 列出Top 3问题
|
|||
|
|
- 每个问题的建议解决方案
|
|||
|
|
|
|||
|
|
3. **下一步(传感器接入)最先要修哪3个点?**
|
|||
|
|
- P0级问题优先
|
|||
|
|
- 给出修复优先级
|
|||
|
|
|
|||
|
|
**产出:**
|
|||
|
|
- 明确下一步行动计划
|
|||
|
|
- 分配Bug修复责任人
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📦 最终交付清单
|
|||
|
|
|
|||
|
|
**必须提交(打包成test-results-YYYYMMDD.zip):**
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
test-results-20260114/
|
|||
|
|
├── Test-Log.md ← 完整测试记录
|
|||
|
|
├── Bug-List.xlsx ← 缺陷清单(P0/P1/P2分级)
|
|||
|
|
├── 2-day-summary.md ← 一页纸总结
|
|||
|
|
├── Checklist-Cloud.md ← 云端检查表(已勾选)
|
|||
|
|
├── Checklist-Edge.md ← 边缘端检查表(已勾选)
|
|||
|
|
│
|
|||
|
|
└── artifacts/ ← 所有测试产物
|
|||
|
|
├── cloud/
|
|||
|
|
│ ├── startup.png
|
|||
|
|
│ ├── health.json
|
|||
|
|
│ ├── upload_response.json
|
|||
|
|
│ ├── report_sample.json
|
|||
|
|
│ ├── negative_tests.md
|
|||
|
|
│ ├── cloud_database.db ← 数据库快照
|
|||
|
|
│ └── *.log ← 所有日志
|
|||
|
|
│
|
|||
|
|
├── edge/
|
|||
|
|
│ ├── edge_45min.log
|
|||
|
|
│ ├── upload_fail.log
|
|||
|
|
│ ├── screenshots/ ← 截图目录
|
|||
|
|
│ └── *.log
|
|||
|
|
│
|
|||
|
|
└── end2end/
|
|||
|
|
├── edge.log
|
|||
|
|
├── cloud.log
|
|||
|
|
├── report.json
|
|||
|
|
└── cloud_database.db
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 验收标准(项目负责人用)
|
|||
|
|
|
|||
|
|
| 编号 | 测试项 | 责任人 | 必须通过 | 证据文件 |
|
|||
|
|
|-----|--------|--------|---------|---------|
|
|||
|
|
| C1 | 云端服务启动 | A | ✅ | artifacts/cloud/startup.png |
|
|||
|
|
| C2 | 健康检查API | A | ✅ | artifacts/cloud/health.json |
|
|||
|
|
| C3 | upload→report闭环 | A | ✅ | artifacts/cloud/upload_response.json + report_sample.json |
|
|||
|
|
| C4 | 错误码正确(401/400) | A | ✅ | artifacts/cloud/negative_tests.md |
|
|||
|
|
| C5 | 数据库落库正确 | A | ✅ | artifacts/cloud/db_check.txt |
|
|||
|
|
| E1 | 边缘端45分钟无崩溃 | B | ✅ | artifacts/edge/edge_45min.log |
|
|||
|
|
| E2 | 心率/风险评分正常 | B | ✅ | artifacts/edge/screenshots/ |
|
|||
|
|
| E3 | 上传成功 | B | ✅ | artifacts/edge/*.log |
|
|||
|
|
| E4 | 上传失败容错 | B | Nice | artifacts/edge/upload_fail.log |
|
|||
|
|
| I1 | 端到端闭环成功 | A+B | ✅ | artifacts/end2end/* |
|
|||
|
|
| I2 | 失败注入测试 | A+B | Nice | artifacts/end2end/failure_*.log |
|
|||
|
|
|
|||
|
|
**Must(必须通过):** C1-C5, E1-E3, I1
|
|||
|
|
**Nice(加分项):** E4, I2
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**测试愉快!有问题随时沟通。** 🚀
|