高血压评估
This commit is contained in:
commit
06e3143283
49
0112-2026 - Test_Package/1- scripts/check_health.py
Normal file
49
0112-2026 - Test_Package/1- scripts/check_health.py
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
"""快速健康检查脚本 - 验证云端服务是否在运行"""
|
||||||
|
|
||||||
|
import requests
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def check_server(url="http://127.0.0.1:5000"):
|
||||||
|
"""检查云端服务器状态"""
|
||||||
|
print("="*60)
|
||||||
|
print("🔍 云端服务器健康检查")
|
||||||
|
print("="*60)
|
||||||
|
print(f"地址: {url}")
|
||||||
|
print("-" * 60)
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = requests.get(f"{url}/api/health", timeout=3)
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
data = response.json()
|
||||||
|
print("✅ 服务器正在运行!\n")
|
||||||
|
print(f"状态: {data.get('status')}")
|
||||||
|
print(f"版本: {data.get('version')}")
|
||||||
|
print(f"时间: {data.get('timestamp')}")
|
||||||
|
print("\n" + "="*60)
|
||||||
|
print("✅ 可以继续执行测试脚本")
|
||||||
|
print("="*60)
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
print(f"⚠️ 服务器响应异常: {response.status_code}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
except requests.exceptions.ConnectionError:
|
||||||
|
print("❌ 无法连接到服务器!\n")
|
||||||
|
print("可能的原因:")
|
||||||
|
print(" 1. 云端服务器没有启动")
|
||||||
|
print(" 2. 端口5000被占用")
|
||||||
|
print(" 3. 防火墙阻止了连接\n")
|
||||||
|
print("解决方法:")
|
||||||
|
print(" 请在独立的命令行窗口中运行:")
|
||||||
|
print(" → python cloud_hypertension_system.py\n")
|
||||||
|
print("="*60)
|
||||||
|
return False
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"❌ 检查失败: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
is_running = check_server()
|
||||||
|
sys.exit(0 if is_running else 1)
|
||||||
113
0112-2026 - Test_Package/1- scripts/test_negative.py
Normal file
113
0112-2026 - Test_Package/1- scripts/test_negative.py
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
"""异常场景测试脚本"""
|
||||||
|
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
|
||||||
|
CLOUD_URL = "http://127.0.0.1:5000/api/upload"
|
||||||
|
|
||||||
|
def test_scenario(name, url, data, headers, expected_status):
|
||||||
|
"""测试单个异常场景"""
|
||||||
|
print(f"\n{'='*60}")
|
||||||
|
print(f"测试场景: {name}")
|
||||||
|
print('='*60)
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = requests.post(url, json=data, headers=headers, timeout=5)
|
||||||
|
|
||||||
|
print(f"状态码: {response.status_code}")
|
||||||
|
print(f"响应: {json.dumps(response.json(), indent=2, ensure_ascii=False)}")
|
||||||
|
|
||||||
|
if response.status_code == expected_status:
|
||||||
|
print(f"✅ 通过(符合预期 {expected_status})")
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
print(f"❌ 失败(预期 {expected_status},实际 {response.status_code})")
|
||||||
|
return False
|
||||||
|
except Exception as e:
|
||||||
|
print(f"❌ 异常: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""运行所有异常场景测试"""
|
||||||
|
print("="*60)
|
||||||
|
print("🧪 云端异常场景测试")
|
||||||
|
print("="*60)
|
||||||
|
|
||||||
|
results = []
|
||||||
|
current_time = time.time()
|
||||||
|
|
||||||
|
# 场景1: 错误的API Key (401)
|
||||||
|
results.append(test_scenario(
|
||||||
|
"错误的API Key",
|
||||||
|
CLOUD_URL,
|
||||||
|
{
|
||||||
|
"device_id": "test_device",
|
||||||
|
"upload_time": "2026-01-12T10:00:00",
|
||||||
|
"events": [{"timestamp": current_time, "heart_rate": 72}],
|
||||||
|
"summary": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Authorization": "Bearer wrong_api_key_123456",
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
},
|
||||||
|
401
|
||||||
|
))
|
||||||
|
|
||||||
|
# 场景2: 缺少必填字段 (400)
|
||||||
|
results.append(test_scenario(
|
||||||
|
"缺少必填字段 (events)",
|
||||||
|
CLOUD_URL,
|
||||||
|
{
|
||||||
|
"device_id": "test_device",
|
||||||
|
"upload_time": "2026-01-12T10:00:00",
|
||||||
|
# 故意缺少 events
|
||||||
|
"summary": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Authorization": "Bearer edge_device_key_001",
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
},
|
||||||
|
400
|
||||||
|
))
|
||||||
|
|
||||||
|
# 场景3: 字段类型错误 (400)
|
||||||
|
results.append(test_scenario(
|
||||||
|
"字段类型错误 (heart_rate为字符串)",
|
||||||
|
CLOUD_URL,
|
||||||
|
{
|
||||||
|
"device_id": "test_device",
|
||||||
|
"upload_time": "2026-01-12T10:00:00",
|
||||||
|
"events": [{
|
||||||
|
"timestamp": current_time,
|
||||||
|
"heart_rate": "not_a_number", # 故意用字符串
|
||||||
|
"rmssd": 30,
|
||||||
|
"sdnn": 45
|
||||||
|
}],
|
||||||
|
"summary": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Authorization": "Bearer edge_device_key_001",
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
},
|
||||||
|
400
|
||||||
|
))
|
||||||
|
|
||||||
|
# 总结
|
||||||
|
print("\n" + "="*60)
|
||||||
|
print("📊 测试总结")
|
||||||
|
print("="*60)
|
||||||
|
print(f"总共测试: {len(results)} 个场景")
|
||||||
|
print(f"通过: {sum(results)} 个")
|
||||||
|
print(f"失败: {len(results) - sum(results)} 个")
|
||||||
|
|
||||||
|
if all(results):
|
||||||
|
print("\n✅ 所有异常场景测试通过!")
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
print("\n⚠️ 部分测试未通过,请查看详细日志")
|
||||||
|
return False
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
success = main()
|
||||||
|
exit(0 if success else 1)
|
||||||
68
0112-2026 - Test_Package/1- scripts/test_report.py
Normal file
68
0112-2026 - Test_Package/1- scripts/test_report.py
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
"""报告获取测试脚本"""
|
||||||
|
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
|
|
||||||
|
# 配置
|
||||||
|
CLOUD_URL = "http://127.0.0.1:5000/api/report"
|
||||||
|
API_KEY = "edge_device_key_001"
|
||||||
|
DEVICE_ID = "test_edge_device_001"
|
||||||
|
|
||||||
|
def test_report():
|
||||||
|
"""测试报告获取"""
|
||||||
|
print("="*60)
|
||||||
|
print("📊 云端报告获取测试")
|
||||||
|
print("="*60)
|
||||||
|
|
||||||
|
url = f"{CLOUD_URL}/{DEVICE_ID}"
|
||||||
|
headers = {"Authorization": f"Bearer {API_KEY}"}
|
||||||
|
|
||||||
|
print(f"URL: {url}")
|
||||||
|
print(f"设备ID: {DEVICE_ID}")
|
||||||
|
print("-" * 60)
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = requests.get(url, headers=headers, timeout=30)
|
||||||
|
|
||||||
|
print(f"\n状态码: {response.status_code}")
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
report = response.json()
|
||||||
|
|
||||||
|
print("\n📄 报告摘要:")
|
||||||
|
print(f" 设备ID: {report.get('device_id')}")
|
||||||
|
|
||||||
|
period = report.get('period', {})
|
||||||
|
print(f" 分析周期: {period.get('start')} ~ {period.get('end')}")
|
||||||
|
print(f" 数据天数: {period.get('days')}")
|
||||||
|
|
||||||
|
print(f" 最新风险评分: {report.get('latest_risk_score', 0):.3f}")
|
||||||
|
print(f" 风险等级: {report.get('risk_level')}")
|
||||||
|
|
||||||
|
if 'medical_advice' in report and report['medical_advice']:
|
||||||
|
print(f"\n 医学建议:")
|
||||||
|
for advice in report['medical_advice']:
|
||||||
|
print(f" - {advice}")
|
||||||
|
|
||||||
|
print("\n✅ 报告获取成功!")
|
||||||
|
print(f"\n完整报告路径: {report.get('report_path')}")
|
||||||
|
|
||||||
|
# 保存到本地
|
||||||
|
local_path = f"artifacts/cloud/report_{DEVICE_ID}.json"
|
||||||
|
with open(local_path, "w", encoding='utf-8') as f:
|
||||||
|
json.dump(report, f, indent=2, ensure_ascii=False)
|
||||||
|
print(f"本地副本: {local_path}")
|
||||||
|
|
||||||
|
print("="*60)
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
print(f"\n❌ 获取失败: {response.json().get('error')}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"\n❌ 请求失败: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
success = test_report()
|
||||||
|
exit(0 if success else 1)
|
||||||
119
0112-2026 - Test_Package/1- scripts/test_upload.py
Normal file
119
0112-2026 - Test_Package/1- scripts/test_upload.py
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
"""上传测试脚本 - 测试正常数据上传"""
|
||||||
|
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
# 配置
|
||||||
|
CLOUD_URL = "http://127.0.0.1:5000/api/upload"
|
||||||
|
API_KEY = "edge_device_key_001"
|
||||||
|
DEVICE_ID = "test_edge_device_001"
|
||||||
|
|
||||||
|
def test_upload():
|
||||||
|
"""测试正常上传"""
|
||||||
|
print("="*60)
|
||||||
|
print("📤 云端数据上传测试")
|
||||||
|
print("="*60)
|
||||||
|
|
||||||
|
# 当前Unix时间戳
|
||||||
|
current_time = time.time()
|
||||||
|
|
||||||
|
# 构造测试数据
|
||||||
|
test_data = {
|
||||||
|
"device_id": DEVICE_ID,
|
||||||
|
"upload_time": datetime.now().isoformat(),
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"timestamp": current_time,
|
||||||
|
"heart_rate": 72.5,
|
||||||
|
"rmssd": 32.8,
|
||||||
|
"sdnn": 45.2,
|
||||||
|
"pnn50": 0.125,
|
||||||
|
"signal_quality": 0.87,
|
||||||
|
"risk_score": 0.285,
|
||||||
|
"risk_level": "LOW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": current_time + 30,
|
||||||
|
"heart_rate": 74.2,
|
||||||
|
"rmssd": 30.5,
|
||||||
|
"sdnn": 42.8,
|
||||||
|
"pnn50": 0.115,
|
||||||
|
"signal_quality": 0.82,
|
||||||
|
"risk_score": 0.312,
|
||||||
|
"risk_level": "LOW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": current_time + 60,
|
||||||
|
"heart_rate": 71.8,
|
||||||
|
"rmssd": 34.2,
|
||||||
|
"sdnn": 46.5,
|
||||||
|
"pnn50": 0.135,
|
||||||
|
"signal_quality": 0.89,
|
||||||
|
"risk_score": 0.265,
|
||||||
|
"risk_level": "LOW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"bathroom_events": [
|
||||||
|
{
|
||||||
|
"start_time": current_time + 300,
|
||||||
|
"end_time": current_time + 375,
|
||||||
|
"duration": 75
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"summary": {
|
||||||
|
"avg_hr": 72.8,
|
||||||
|
"avg_rmssd": 32.5,
|
||||||
|
"avg_risk_score": 0.287,
|
||||||
|
"total_alerts": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
"Authorization": f"Bearer {API_KEY}",
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
}
|
||||||
|
|
||||||
|
print(f"URL: {CLOUD_URL}")
|
||||||
|
print(f"设备ID: {DEVICE_ID}")
|
||||||
|
print(f"事件数: {len(test_data['events'])}")
|
||||||
|
print(f"起夜事件: {len(test_data['bathroom_events'])}")
|
||||||
|
print("-" * 60)
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = requests.post(CLOUD_URL, json=test_data, headers=headers, timeout=10)
|
||||||
|
|
||||||
|
print(f"\n状态码: {response.status_code}")
|
||||||
|
print(f"响应内容:")
|
||||||
|
print(json.dumps(response.json(), indent=2, ensure_ascii=False))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
print("\n" + "="*60)
|
||||||
|
print("✅ 上传成功!")
|
||||||
|
print("="*60)
|
||||||
|
print("\n💡 提示:可以查看云端控制台,应该能看到接收日志")
|
||||||
|
|
||||||
|
# 保存响应到文件
|
||||||
|
with open('artifacts/cloud/upload_response.json', 'w', encoding='utf-8') as f:
|
||||||
|
json.dump(response.json(), f, indent=2, ensure_ascii=False)
|
||||||
|
print(f"✓ 响应已保存: artifacts/cloud/upload_response.json")
|
||||||
|
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
print("\n" + "="*60)
|
||||||
|
print(f"❌ 上传失败: {response.json().get('error', '未知错误')}")
|
||||||
|
print("="*60)
|
||||||
|
return False
|
||||||
|
|
||||||
|
except requests.exceptions.ConnectionError:
|
||||||
|
print("\n❌ 连接失败: 无法连接到云端服务器")
|
||||||
|
print("请先运行: python scripts/check_health.py")
|
||||||
|
return False
|
||||||
|
except Exception as e:
|
||||||
|
print(f"\n❌ 请求失败: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
success = test_upload()
|
||||||
|
exit(0 if success else 1)
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"device_id": "test_edge_device_001",
|
||||||
|
"upload_time": "2026-01-12T10:00:00",
|
||||||
|
"_comment": "故意缺少 events 字段来测试错误处理",
|
||||||
|
"summary": {
|
||||||
|
"avg_hr": 72.0
|
||||||
|
}
|
||||||
|
}
|
||||||
39
0112-2026 - Test_Package/2-test_data/sample_normal.json
Normal file
39
0112-2026 - Test_Package/2-test_data/sample_normal.json
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"device_id": "test_edge_device_001",
|
||||||
|
"upload_time": "2026-01-12T10:00:00",
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"timestamp": 1704841234.0,
|
||||||
|
"heart_rate": 72.5,
|
||||||
|
"rmssd": 32.8,
|
||||||
|
"sdnn": 45.2,
|
||||||
|
"pnn50": 0.125,
|
||||||
|
"signal_quality": 0.87,
|
||||||
|
"risk_score": 0.285,
|
||||||
|
"risk_level": "LOW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1704841264.0,
|
||||||
|
"heart_rate": 74.2,
|
||||||
|
"rmssd": 30.5,
|
||||||
|
"sdnn": 42.8,
|
||||||
|
"pnn50": 0.115,
|
||||||
|
"signal_quality": 0.82,
|
||||||
|
"risk_score": 0.312,
|
||||||
|
"risk_level": "LOW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"bathroom_events": [
|
||||||
|
{
|
||||||
|
"start_time": 1704841534.0,
|
||||||
|
"end_time": 1704841609.0,
|
||||||
|
"duration": 75
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"summary": {
|
||||||
|
"avg_hr": 73.4,
|
||||||
|
"avg_rmssd": 31.7,
|
||||||
|
"avg_risk_score": 0.299,
|
||||||
|
"total_alerts": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
14
0112-2026 - Test_Package/2-test_data/sample_wrong_type.json
Normal file
14
0112-2026 - Test_Package/2-test_data/sample_wrong_type.json
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"device_id": "test_edge_device_001",
|
||||||
|
"upload_time": "2026-01-12T10:00:00",
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"timestamp": 1704841234.0,
|
||||||
|
"heart_rate": "seventy_two",
|
||||||
|
"_comment": "heart_rate应该是数字,这里故意用字符串",
|
||||||
|
"rmssd": 32.8,
|
||||||
|
"sdnn": 45.2
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"summary": {}
|
||||||
|
}
|
||||||
141
0112-2026 - Test_Package/3-docs/2-day-summary-template.md
Normal file
141
0112-2026 - Test_Package/3-docs/2-day-summary-template.md
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
# 测试总结报告
|
||||||
|
|
||||||
|
**项目名称:** 高血压风险评估系统
|
||||||
|
**测试周期:** 2026-01-13 ~ 2026-01-15
|
||||||
|
**测试人员:** 成员A(云端)、成员B(边缘端)
|
||||||
|
**报告日期:** 2026-01-15
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 执行概况
|
||||||
|
|
||||||
|
| 维度 | 计划 | 实际 | 完成率 |
|
||||||
|
|------|------|------|--------|
|
||||||
|
| 测试用例总数 | XX | XX | XX% |
|
||||||
|
| 通过用例 | - | XX | - |
|
||||||
|
| 失败用例 | - | XX | - |
|
||||||
|
| 阻塞用例 | - | XX | - |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 核心问题:能否演示闭环?
|
||||||
|
|
||||||
|
### 回答(选一个)
|
||||||
|
|
||||||
|
- [ ] ✅ **能** - 可以演示完整的边缘端→云端→报告闭环
|
||||||
|
- [ ] ⚠️ **部分能** - 主要功能可用,但有XX个问题
|
||||||
|
- [ ] ❌ **不能** - 存在阻塞性问题,无法演示
|
||||||
|
|
||||||
|
### 演示路径描述
|
||||||
|
|
||||||
|
[如果能演示,简要描述演示步骤;如果不能,说明缺失哪一环]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 最大阻塞问题 Top 3
|
||||||
|
|
||||||
|
### 问题 #1(P0)
|
||||||
|
|
||||||
|
**问题描述:** [一句话]
|
||||||
|
|
||||||
|
**影响范围:** 云端 / 边缘端 / 联调
|
||||||
|
|
||||||
|
**阻塞原因:** [为什么这个问题会阻塞测试]
|
||||||
|
|
||||||
|
**建议方案:** [如何修复]
|
||||||
|
|
||||||
|
**预计修复时间:** X小时/天
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题 #2(P0/P1)
|
||||||
|
|
||||||
|
[同上格式]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题 #3(P0/P1)
|
||||||
|
|
||||||
|
[同上格式]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 下一步行动(传感器接入前最先修的3个点)
|
||||||
|
|
||||||
|
### 优先级 P0(必须修)
|
||||||
|
|
||||||
|
1. **[问题标题]** - Bug #XXX
|
||||||
|
- 为什么必须修:[说明]
|
||||||
|
- 责任人:[谁来修]
|
||||||
|
- 完成时间:[预计]
|
||||||
|
|
||||||
|
2. ...
|
||||||
|
|
||||||
|
### 优先级 P1(建议修)
|
||||||
|
|
||||||
|
1. **[问题标题]** - Bug #XXX
|
||||||
|
- 为什么建议修:[说明]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 测试覆盖情况
|
||||||
|
|
||||||
|
### 云端模块
|
||||||
|
|
||||||
|
| 功能模块 | 测试情况 | 结果 |
|
||||||
|
|---------|---------|------|
|
||||||
|
| 服务启动 | ✅ 已测试 | 通过 |
|
||||||
|
| 健康检查API | ✅ 已测试 | 通过 |
|
||||||
|
| 数据上传API | ✅ 已测试 | 通过/失败 |
|
||||||
|
| 报告生成API | ✅ 已测试 | 通过/失败 |
|
||||||
|
| 异常场景 | ✅ 已测试 | 部分通过 |
|
||||||
|
| 数据库落库 | ✅ 已测试 | 通过 |
|
||||||
|
|
||||||
|
### 边缘端模块
|
||||||
|
|
||||||
|
| 功能模块 | 测试情况 | 结果 |
|
||||||
|
|---------|---------|------|
|
||||||
|
| 本地运行稳定性 | ✅ 已测试 | 通过 |
|
||||||
|
| 生理指标计算 | ✅ 已测试 | 通过 |
|
||||||
|
| 风险评估 | ✅ 已测试 | 通过 |
|
||||||
|
| 起夜检测 | ✅ 已测试 | 通过 |
|
||||||
|
| 云端上传 | ✅ 已测试 | 通过/失败 |
|
||||||
|
| 容错处理 | ✅ 已测试 | 部分通过 |
|
||||||
|
|
||||||
|
### 端到端测试
|
||||||
|
|
||||||
|
| 测试场景 | 测试情况 | 结果 |
|
||||||
|
|---------|---------|------|
|
||||||
|
| 完整闭环 | ✅ 已测试 | 通过/失败 |
|
||||||
|
| 失败注入 | ✅ 已测试 | 部分通过 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 团队协作评价
|
||||||
|
|
||||||
|
**沟通效率:** ⭐⭐⭐⭐⭐ / 5
|
||||||
|
**任务分工:** 清晰 / 一般 / 不清晰
|
||||||
|
**进度把控:** 按时 / 延期
|
||||||
|
|
||||||
|
**改进建议:**
|
||||||
|
- [如果有的话]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 附件清单
|
||||||
|
|
||||||
|
- [ ] Test-Log.md(完整测试记录)
|
||||||
|
- [ ] Bug-List.xlsx(缺陷清单)
|
||||||
|
- [ ] Checklist-Cloud.md(云端检查表)
|
||||||
|
- [ ] Checklist-Edge.md(边缘端检查表)
|
||||||
|
- [ ] artifacts/目录(所有日志、截图、数据库文件)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
测试人员签字
|
||||||
|
|
||||||
|
**成员叶(云端):** _________ 日期:_________
|
||||||
|
|
||||||
|
**成员吕(边缘端):** _________ 日期:_________
|
||||||
|
|
||||||
|
|
||||||
202
0112-2026 - Test_Package/3-docs/Bug-Report-Template.md
Normal file
202
0112-2026 - Test_Package/3-docs/Bug-Report-Template.md
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
# Bug报告模板
|
||||||
|
|
||||||
|
**使用说明:** 每发现一个Bug,复制下面的模板填写
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bug #[编号]
|
||||||
|
|
||||||
|
**标题:** [一句话描述问题]
|
||||||
|
|
||||||
|
**严重程度:**
|
||||||
|
- [ ] P0 - 阻塞性(系统崩溃/无法启动/核心功能不可用)
|
||||||
|
- [ ] P1 - 严重(主要功能异常/数据错误)
|
||||||
|
- [ ] P2 - 一般(界面问题/提示不清晰/性能问题)
|
||||||
|
- [ ] P3 - 建议(优化建议/文档问题)
|
||||||
|
|
||||||
|
**发现时间:** 2026-01-XX XX:XX
|
||||||
|
|
||||||
|
**发现人:** [你的名字]
|
||||||
|
|
||||||
|
**影响范围:**
|
||||||
|
- [ ] 云端
|
||||||
|
- [ ] 边缘端
|
||||||
|
- [ ] 端到端联调
|
||||||
|
- [ ] 其他:__________
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题描述
|
||||||
|
|
||||||
|
[清晰描述问题是什么,用户会看到什么]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 复现步骤
|
||||||
|
|
||||||
|
**前置条件:**
|
||||||
|
- [例如:云端服务正在运行]
|
||||||
|
- [例如:已安装所有依赖]
|
||||||
|
|
||||||
|
**复现步骤:**
|
||||||
|
1. [第一步]
|
||||||
|
2. [第二步]
|
||||||
|
3. [第三步]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 预期结果
|
||||||
|
|
||||||
|
[应该发生什么]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 实际结果
|
||||||
|
|
||||||
|
[实际发生了什么]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 环境信息
|
||||||
|
|
||||||
|
**操作系统:** Windows 10 / macOS XX / Linux
|
||||||
|
**Python版本:** 3.x.x
|
||||||
|
**关键依赖版本:**
|
||||||
|
- Flask: x.x.x
|
||||||
|
- numpy: x.x.x
|
||||||
|
|
||||||
|
**配置信息:**
|
||||||
|
- device_id: xxxx
|
||||||
|
- API Key: xxxx(前4位)
|
||||||
|
- 云端地址: xxxx
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 日志与截图
|
||||||
|
|
||||||
|
**错误日志:**
|
||||||
|
```
|
||||||
|
[粘贴关键错误日志,至少前后20行]
|
||||||
|
```
|
||||||
|
|
||||||
|
**完整日志文件:**
|
||||||
|
- `artifacts/xxx/error.log`
|
||||||
|
|
||||||
|
**截图:**
|
||||||
|
- `artifacts/xxx/screenshot.png`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 建议解决方案
|
||||||
|
|
||||||
|
[如果你有想法,写下来;没有也可以留空]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 状态跟踪
|
||||||
|
|
||||||
|
- [ ] 已报告
|
||||||
|
- [ ] 开发中
|
||||||
|
- [ ] 已修复
|
||||||
|
- [ ] 已验证
|
||||||
|
- [ ] 已关闭
|
||||||
|
|
||||||
|
**修复责任人:** __________
|
||||||
|
**预计修复时间:** __________
|
||||||
|
|
||||||
|
---
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bug示例(参考)
|
||||||
|
|
||||||
|
### Bug #001
|
||||||
|
|
||||||
|
**标题:** 云端启动时数据库连接失败
|
||||||
|
|
||||||
|
**严重程度:** P0 - 阻塞性
|
||||||
|
|
||||||
|
**发现时间:** 2026-01-12 10:15
|
||||||
|
|
||||||
|
**发现人:** 测试成员A
|
||||||
|
|
||||||
|
**影响范围:** ✅ 云端
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题描述
|
||||||
|
|
||||||
|
运行 `python cloud_hypertension_system.py` 后,系统报错退出,提示数据库连接失败。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 复现步骤
|
||||||
|
|
||||||
|
**前置条件:**
|
||||||
|
- Python 3.8已安装
|
||||||
|
- 已执行 `pip install -r requirements.txt`
|
||||||
|
|
||||||
|
**复现步骤:**
|
||||||
|
1. 打开PowerShell
|
||||||
|
2. 导航到项目目录
|
||||||
|
3. 执行 `python cloud_hypertension_system.py`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 预期结果
|
||||||
|
|
||||||
|
云端服务正常启动,显示:
|
||||||
|
```
|
||||||
|
✓ 数据库初始化成功
|
||||||
|
Running on http://127.0.0.1:5000
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 实际结果
|
||||||
|
|
||||||
|
程序报错退出:
|
||||||
|
```
|
||||||
|
sqlite3.OperationalError: unable to open database file
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 环境信息
|
||||||
|
|
||||||
|
**操作系统:** Windows 10
|
||||||
|
**Python版本:** 3.9.7
|
||||||
|
**SQLite版本:** 3.35.5
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 日志与截图
|
||||||
|
|
||||||
|
**错误日志:**
|
||||||
|
```
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "cloud_hypertension_system.py", line 850, in init_database
|
||||||
|
self.db_manager = DatabaseManager(self.config.database_config)
|
||||||
|
File "cloud_hypertension_system.py", line 125, in __init__
|
||||||
|
self.engine = create_engine(...)
|
||||||
|
sqlite3.OperationalError: unable to open database file
|
||||||
|
```
|
||||||
|
|
||||||
|
**完整日志:** `artifacts/cloud/startup_error.log`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 建议解决方案
|
||||||
|
|
||||||
|
检查数据库文件路径是否存在写权限。可能需要:
|
||||||
|
1. 手动创建数据库目录
|
||||||
|
2. 或者修改数据库路径到用户目录
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 状态跟踪
|
||||||
|
|
||||||
|
- [x] 已报告(2026-01-12)
|
||||||
|
- [ ] 开发中
|
||||||
|
- [ ] 已修复
|
||||||
|
- [ ] 已验证
|
||||||
|
- [ ] 已关闭
|
||||||
170
0112-2026 - Test_Package/3-docs/Checklist-Cloud.md
Normal file
170
0112-2026 - Test_Package/3-docs/Checklist-Cloud.md
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
# 云端测试检查表 - Checklist (Cloud)
|
||||||
|
|
||||||
|
**测试人员:** ___________
|
||||||
|
**测试日期:** 2026-01-XX
|
||||||
|
**系统版本:** v1.0
|
||||||
|
|
||||||
|
**使用说明:** 完成一项勾选一项,全部完成后签字
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 环境准备
|
||||||
|
|
||||||
|
- [ ] Python 3.8+已安装
|
||||||
|
- [ ] 依赖已安装(`pip install -r requirements.txt`)
|
||||||
|
- [ ] 项目目录结构完整
|
||||||
|
- [ ] 有独立的测试目录(避免污染生产数据)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 基础功能测试
|
||||||
|
|
||||||
|
### 服务启动
|
||||||
|
|
||||||
|
- [ ] 能成功启动云端服务
|
||||||
|
- [ ] 启动日志无错误
|
||||||
|
- [ ] 数据库初始化成功
|
||||||
|
- [ ] API端点注册成功
|
||||||
|
- [ ] 监听在正确端口(5000)
|
||||||
|
|
||||||
|
**证据文件:** `artifacts/cloud/startup.png`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### API测试
|
||||||
|
|
||||||
|
#### `/api/health` - 健康检查
|
||||||
|
|
||||||
|
- [ ] 返回状态码200
|
||||||
|
- [ ] 响应包含 `"status": "healthy"`
|
||||||
|
- [ ] 响应包含版本号
|
||||||
|
- [ ] 响应包含时间戳
|
||||||
|
|
||||||
|
**证据文件:** `artifacts/cloud/health.json`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `POST /api/upload` - 数据上传
|
||||||
|
|
||||||
|
##### 正常场景
|
||||||
|
|
||||||
|
- [ ] 使用正确API Key能上传成功
|
||||||
|
- [ ] 返回状态码200
|
||||||
|
- [ ] 响应包含 `"status": "success"`
|
||||||
|
- [ ] 响应包含接收的记录数
|
||||||
|
- [ ] 云端控制台显示接收日志
|
||||||
|
|
||||||
|
**证据文件:** `artifacts/cloud/upload_response.json`
|
||||||
|
|
||||||
|
##### 异常场景
|
||||||
|
|
||||||
|
- [ ] 错误API Key返回401
|
||||||
|
- [ ] 缺少必填字段返回400
|
||||||
|
- [ ] 字段类型错误返回400
|
||||||
|
- [ ] 错误信息清晰可操作
|
||||||
|
- [ ] 所有异常都有适当的HTTP状态码(不是500)
|
||||||
|
|
||||||
|
**证据文件:** `artifacts/cloud/negative_tests.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `GET /api/report/<device>` - 获取报告
|
||||||
|
|
||||||
|
- [ ] 有数据时能成功生成报告
|
||||||
|
- [ ] 返回状态码200
|
||||||
|
- [ ] 报告包含基础统计
|
||||||
|
- [ ] 报告包含时间范围
|
||||||
|
- [ ] 报告包含设备ID
|
||||||
|
- [ ] 报告文件已保存到 `./reports/` 目录
|
||||||
|
|
||||||
|
**证据文件:** `artifacts/cloud/report_sample.json`
|
||||||
|
|
||||||
|
##### 边界情况
|
||||||
|
|
||||||
|
- [ ] 无数据时返回友好提示
|
||||||
|
- [ ] 不存在的设备返回404或提示信息
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 数据库功能
|
||||||
|
|
||||||
|
- [ ] 能成功创建数据库文件
|
||||||
|
- [ ] 数据表结构正确
|
||||||
|
- [ ] 上传数据能正确落库
|
||||||
|
- [ ] 记录数与上传数一致
|
||||||
|
- [ ] 时间戳格式正确
|
||||||
|
- [ ] 能查询已存数据
|
||||||
|
|
||||||
|
**证据文件:** `artifacts/cloud/db_check.txt`
|
||||||
|
|
||||||
|
##### 数据完整性
|
||||||
|
|
||||||
|
- [ ] 重复上传行为符合预期(幂等/累加/拒绝)
|
||||||
|
- [ ] 数据类型正确(int/float/str)
|
||||||
|
- [ ] 外键关系正确
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 稳定性测试
|
||||||
|
|
||||||
|
- [ ] 连续运行2小时无崩溃
|
||||||
|
- [ ] 内存使用稳定(无泄漏)
|
||||||
|
- [ ] CPU占用合理(<50%)
|
||||||
|
- [ ] 多次上传后性能无明显下降
|
||||||
|
|
||||||
|
**证据文件:** `artifacts/cloud/stability.log`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 日志与监控
|
||||||
|
|
||||||
|
- [ ] 关键操作有日志记录
|
||||||
|
- [ ] 日志时间戳正确
|
||||||
|
- [ ] 错误日志包含堆栈信息
|
||||||
|
- [ ] 日志格式统一
|
||||||
|
- [ ] 敏感信息已脱敏(API Key等)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 配置与部署
|
||||||
|
|
||||||
|
- [ ] 配置文件结构清晰
|
||||||
|
- [ ] 可以修改端口
|
||||||
|
- [ ] 可以修改数据库路径
|
||||||
|
- [ ] 可以添加/删除API Key
|
||||||
|
- [ ] 配置变更后能生效
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 文档完整性
|
||||||
|
|
||||||
|
- [ ] README说明清晰
|
||||||
|
- [ ] API文档存在且准确
|
||||||
|
- [ ] 错误码说明完整
|
||||||
|
- [ ] 有使用示例
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 总结
|
||||||
|
|
||||||
|
### 统计
|
||||||
|
|
||||||
|
- 总测试项:XX
|
||||||
|
- 通过:XX
|
||||||
|
- 失败:XX
|
||||||
|
- 阻塞:XX
|
||||||
|
|
||||||
|
### P0问题(必须修复)
|
||||||
|
|
||||||
|
1. [问题描述 + Bug编号]
|
||||||
|
2. ...
|
||||||
|
|
||||||
|
### 验收结论
|
||||||
|
|
||||||
|
- [ ] ✅ 云端基本功能可用,可以进入联调
|
||||||
|
- [ ] ⚠️ 有问题但不阻塞联调,可以带问题联调
|
||||||
|
- [ ] ❌ 存在阻塞问题,必须先修复
|
||||||
|
|
||||||
|
**签字:**
|
||||||
|
测试人员:_________ 日期:_________
|
||||||
|
复核人员:_________ 日期:_________
|
||||||
181
0112-2026 - Test_Package/3-docs/Checklist-Edge.md
Normal file
181
0112-2026 - Test_Package/3-docs/Checklist-Edge.md
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
# 边缘端测试检查表 - Checklist (Edge)
|
||||||
|
|
||||||
|
**测试人员:** ___________
|
||||||
|
**测试日期:** 2026-01-XX
|
||||||
|
**系统版本:** v1.0
|
||||||
|
|
||||||
|
**使用说明:** 完成一项勾选一项,全部完成后签字
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 环境准备
|
||||||
|
|
||||||
|
- [ ] Python 3.8+已安装
|
||||||
|
- [ ] 依赖已安装(`pip install numpy scipy`)
|
||||||
|
- [ ] 项目目录结构完整
|
||||||
|
- [ ] 配置文件可访问
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 基础功能测试
|
||||||
|
|
||||||
|
### 本地运行(模拟模式)
|
||||||
|
|
||||||
|
- [ ] 能成功启动边缘端
|
||||||
|
- [ ] 启动日志无错误
|
||||||
|
- [ ] 显示初始化成功信息
|
||||||
|
- [ ] 进入实时处理循环
|
||||||
|
|
||||||
|
**证据文件:** `artifacts/edge/startup.png`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 数据生成与处理
|
||||||
|
|
||||||
|
#### 生理指标输出
|
||||||
|
|
||||||
|
- [ ] 每30秒输出一次实时状态
|
||||||
|
- [ ] 心率在合理范围(50-100 bpm)
|
||||||
|
- [ ] RMSSD有数值(>0)
|
||||||
|
- [ ] SDNN有数值(>0)
|
||||||
|
- [ ] pNN50有数值(0-1之间)
|
||||||
|
- [ ] 信号质量有数值(0-1之间)
|
||||||
|
|
||||||
|
**证据文件:** `artifacts/edge/screenshots/normal_output.png`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### 风险评估
|
||||||
|
|
||||||
|
- [ ] 风险评分在0-1范围内
|
||||||
|
- [ ] 风险等级显示(LOW/MEDIUM/HIGH)
|
||||||
|
- [ ] 风险评分随指标变化
|
||||||
|
- [ ] 高风险时能触发告警(模拟)
|
||||||
|
|
||||||
|
**证据文件:** `artifacts/edge/screenshots/risk_alert.png`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### 起夜检测
|
||||||
|
|
||||||
|
- [ ] 能检测到起夜事件(🚽)
|
||||||
|
- [ ] 记录起夜时长
|
||||||
|
- [ ] 记录起夜次数(今晚累计)
|
||||||
|
- [ ] 起夜时BCG质量下降
|
||||||
|
- [ ] 起夜结束后BCG质量恢复
|
||||||
|
|
||||||
|
**证据文件:** `artifacts/edge/screenshots/bathroom_event.png`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 系统性能
|
||||||
|
|
||||||
|
- [ ] 处理延迟 <500ms(大部分时间)
|
||||||
|
- [ ] CPU占用 <30%
|
||||||
|
- [ ] 内存占用 <500MB
|
||||||
|
- [ ] 无内存泄漏(长时间运行)
|
||||||
|
|
||||||
|
**证据文件:** `artifacts/edge/performance.log`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 稳定性测试
|
||||||
|
|
||||||
|
- [ ] 连续运行1小时无崩溃
|
||||||
|
- [ ] 至少看到1次起夜事件
|
||||||
|
- [ ] 至少看到120次实时状态输出(1小时)
|
||||||
|
- [ ] 无Python异常
|
||||||
|
- [ ] 无数据异常(NaN, Inf等)
|
||||||
|
|
||||||
|
**证据文件:** `artifacts/edge/edge_1hour.log`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 上传功能测试
|
||||||
|
|
||||||
|
### 云端连接(与成员A协同)
|
||||||
|
|
||||||
|
- [ ] 能连接到云端(与成员A确认云端在运行)
|
||||||
|
- [ ] 配置正确(URL, API Key, device_id)
|
||||||
|
- [ ] 能成功上传数据
|
||||||
|
- [ ] 云端控制台显示接收日志
|
||||||
|
- [ ] 上传频率正确(每5分钟)
|
||||||
|
|
||||||
|
**证据文件:** `artifacts/edge/upload_success.log`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 上传容错
|
||||||
|
|
||||||
|
#### 云端不可达
|
||||||
|
|
||||||
|
- [ ] 云端关闭时,边缘端显示连接失败
|
||||||
|
- [ ] 边缘端继续本地处理(不崩溃)
|
||||||
|
- [ ] 错误信息清晰
|
||||||
|
- [ ] 云端恢复后能继续上传
|
||||||
|
|
||||||
|
**证据文件:** `artifacts/edge/upload_fail.log`
|
||||||
|
|
||||||
|
#### API认证失败
|
||||||
|
|
||||||
|
- [ ] 错误API Key时显示401错误
|
||||||
|
- [ ] 错误信息包含"Unauthorized"
|
||||||
|
- [ ] 边缘端继续本地处理
|
||||||
|
|
||||||
|
**证据文件:** `artifacts/edge/auth_fail.log`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 数据质量
|
||||||
|
|
||||||
|
- [ ] 心率数据合理(无异常跳变)
|
||||||
|
- [ ] HRV数据合理(符合生理范围)
|
||||||
|
- [ ] 时间戳单调递增
|
||||||
|
- [ ] 无数据重复
|
||||||
|
- [ ] 信号质量评估合理
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 配置与可调性
|
||||||
|
|
||||||
|
- [ ] 可以修改device_id
|
||||||
|
- [ ] 可以修改云端URL
|
||||||
|
- [ ] 可以修改上传间隔
|
||||||
|
- [ ] 可以开关云端上传
|
||||||
|
- [ ] 配置变更后能生效
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 日志可读性
|
||||||
|
|
||||||
|
- [ ] 日志输出清晰
|
||||||
|
- [ ] 关键事件有日志(启动、起夜、上传、告警)
|
||||||
|
- [ ] 日志时间戳正确
|
||||||
|
- [ ] 错误日志包含详细信息
|
||||||
|
- [ ] 日志格式统一
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 总结
|
||||||
|
|
||||||
|
### 统计
|
||||||
|
|
||||||
|
- 总测试项:XX
|
||||||
|
- 通过:XX
|
||||||
|
- 失败:XX
|
||||||
|
- 阻塞:XX
|
||||||
|
|
||||||
|
### P0问题(必须修复)
|
||||||
|
|
||||||
|
1. [问题描述 + Bug编号]
|
||||||
|
2. ...
|
||||||
|
|
||||||
|
### 验收结论
|
||||||
|
|
||||||
|
- [ ] ✅ 边缘端基本功能可用,可以进入联调
|
||||||
|
- [ ] ⚠️ 有问题但不阻塞联调,可以带问题联调
|
||||||
|
- [ ] ❌ 存在阻塞问题,必须先修复
|
||||||
|
|
||||||
|
**签字:**
|
||||||
|
测试人员:_________ 日期:_________
|
||||||
|
复核人员:_________ 日期:_________
|
||||||
110
0112-2026 - Test_Package/3-docs/Test-Log-Template.md
Normal file
110
0112-2026 - Test_Package/3-docs/Test-Log-Template.md
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
# 测试记录 - Test Log
|
||||||
|
|
||||||
|
**测试人员:** [你的名字]
|
||||||
|
**测试日期:** 2026-01-XX
|
||||||
|
**系统版本:** v1.0
|
||||||
|
**测试环境:** Windows 10 / macOS / Linux + Python 3.x
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Day 1 - [日期]
|
||||||
|
|
||||||
|
### 09:30 - 10:00 | 环境准备
|
||||||
|
|
||||||
|
**操作:**
|
||||||
|
- [ ] 安装依赖:`pip install -r requirements.txt`
|
||||||
|
- [ ] 验证Python版本:`python --version`
|
||||||
|
|
||||||
|
**结果:**
|
||||||
|
```
|
||||||
|
[粘贴命令输出]
|
||||||
|
```
|
||||||
|
|
||||||
|
**问题:**
|
||||||
|
- 无 / [描述遇到的问题]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 10:00 - 12:00 | 上午测试
|
||||||
|
|
||||||
|
#### Test 1.1:[测试名称]
|
||||||
|
|
||||||
|
**时间:** 10:05 - 10:20
|
||||||
|
**目标:** [本次测试要验证什么]
|
||||||
|
|
||||||
|
**操作步骤:**
|
||||||
|
1. [步骤1]
|
||||||
|
2. [步骤2]
|
||||||
|
3. [步骤3]
|
||||||
|
|
||||||
|
**预期结果:**
|
||||||
|
- [预期1]
|
||||||
|
- [预期2]
|
||||||
|
|
||||||
|
**实际结果:**
|
||||||
|
- [实际1]
|
||||||
|
- [实际2]
|
||||||
|
|
||||||
|
**状态:** ✅ 通过 / ❌ 失败 / ⚠️ 部分通过
|
||||||
|
|
||||||
|
**证据文件:**
|
||||||
|
- `artifacts/xxx/xxx.log`
|
||||||
|
- `artifacts/xxx/screenshot.png`
|
||||||
|
|
||||||
|
**备注:**
|
||||||
|
[任何额外的观察或注释]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Test 1.2:[下一个测试]
|
||||||
|
|
||||||
|
**时间:** 10:25 - 10:40
|
||||||
|
...(重复上面的格式)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 13:30 - 15:30 | 下午测试
|
||||||
|
|
||||||
|
[继续按同样格式记录]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Day 2 - [日期]
|
||||||
|
|
||||||
|
[继续记录Day 2的测试]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 测试总结
|
||||||
|
|
||||||
|
### 统计
|
||||||
|
|
||||||
|
| 类别 | 总数 | 通过 | 失败 | 部分通过 |
|
||||||
|
|------|------|------|------|---------|
|
||||||
|
| 云端测试 | X | X | X | X |
|
||||||
|
| 边缘端测试 | X | X | X | X |
|
||||||
|
| 联调测试 | X | X | X | X |
|
||||||
|
| **合计** | **X** | **X** | **X** | **X** |
|
||||||
|
|
||||||
|
### 主要发现
|
||||||
|
|
||||||
|
**关键问题(P0):**
|
||||||
|
1. [问题描述 + Bug编号]
|
||||||
|
2. ...
|
||||||
|
|
||||||
|
**一般问题(P1):**
|
||||||
|
1. ...
|
||||||
|
|
||||||
|
**建议改进(P2):**
|
||||||
|
1. ...
|
||||||
|
|
||||||
|
### 验收结论
|
||||||
|
|
||||||
|
- [ ] 云端基本功能可用
|
||||||
|
- [ ] 边缘端基本功能可用
|
||||||
|
- [ ] 端到端闭环通过
|
||||||
|
- [ ] 可以进入下一阶段(传感器接入)
|
||||||
|
|
||||||
|
**签字:**
|
||||||
|
测试人员:_________ 日期:_________
|
||||||
|
复核人员:_________ 日期:_________
|
||||||
1243
0112-2026 - Test_Package/cloud_hypertension_system-云端代码.py
Normal file
1243
0112-2026 - Test_Package/cloud_hypertension_system-云端代码.py
Normal file
File diff suppressed because it is too large
Load Diff
1255
0112-2026 - Test_Package/edge_hypertension_system- 边缘端代码.py
Normal file
1255
0112-2026 - Test_Package/edge_hypertension_system- 边缘端代码.py
Normal file
File diff suppressed because it is too large
Load Diff
8
0112-2026 - Test_Package/requirements-依赖清单.txt
Normal file
8
0112-2026 - Test_Package/requirements-依赖清单.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
flask>=2.3.0
|
||||||
|
numpy>=1.24.0
|
||||||
|
scipy>=1.10.0
|
||||||
|
pandas>=2.0.0
|
||||||
|
torch>=2.0.0
|
||||||
|
matplotlib>=3.7.0
|
||||||
|
sqlalchemy>=2.0.0
|
||||||
|
requests>=2.31.0
|
||||||
231
0112-2026 - Test_Package/主指南(必读)-README_TEST.md
Normal file
231
0112-2026 - Test_Package/主指南(必读)-README_TEST.md
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
# 高血压风险评估系统 - 2天测试指南
|
||||||
|
|
||||||
|
**测试周期:2天(Day 1组件测试 + Day 2联调测试)**
|
||||||
|
**测试人员:成员A(云端负责人)+ 成员B(边缘端负责人)**
|
||||||
|
**测试目标:验证云端/边缘端基本功能可用,完成最小端到端闭环**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 测试包内容
|
||||||
|
|
||||||
|
```
|
||||||
|
test_package/
|
||||||
|
├── README_TEST.md ← 你正在看的文件(测试总指南)
|
||||||
|
├── TestPlan-2Days.md ← 详细2天测试计划(按小时排)
|
||||||
|
├── requirements.txt ← Python依赖清单
|
||||||
|
│
|
||||||
|
├── docs/ ← 测试文档模板
|
||||||
|
│ ├── Test-Log-Template.md ← 测试记录模板(复制后填写)
|
||||||
|
│ ├── Bug-Report-Template.md ← 缺陷报告模板
|
||||||
|
│ └── Checklist-Cloud.md ← 云端测试检查表
|
||||||
|
│ └── Checklist-Edge.md ← 边缘端测试检查表
|
||||||
|
│
|
||||||
|
├── scripts/ ← 测试脚本
|
||||||
|
│ ├── check_health.py ← 快速健康检查
|
||||||
|
│ ├── test_upload.py ← 上传测试(正常场景)
|
||||||
|
│ ├── test_report.py ← 报告获取测试
|
||||||
|
│ ├── test_negative.py ← 异常场景测试
|
||||||
|
│ └── start_cloud_bg.py ← 后台启动云端(可选)
|
||||||
|
│
|
||||||
|
├── test_data/ ← 测试样例数据
|
||||||
|
│ ├── sample_normal.json ← 正常上传样例
|
||||||
|
│ ├── sample_missing_field.json ← 缺字段样例
|
||||||
|
│ └── sample_wrong_type.json ← 错误类型样例
|
||||||
|
│
|
||||||
|
├── artifacts/ ← 测试结果输出目录(自动生成)
|
||||||
|
│ ├── cloud/ ← 云端测试产物
|
||||||
|
│ └── edge/ ← 边缘端测试产物
|
||||||
|
│
|
||||||
|
└── [代码文件]
|
||||||
|
├── cloud_hypertension_system.py ← 云端主程序
|
||||||
|
└── edge_hypertension_system.py ← 边缘端主程序
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚡ 5分钟快速启动(必读)
|
||||||
|
|
||||||
|
### 环境准备(两人都做)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 安装依赖
|
||||||
|
pip install -r requirements.txt
|
||||||
|
|
||||||
|
# 2. 验证Python版本(需要3.8+)
|
||||||
|
python --version
|
||||||
|
|
||||||
|
# 3. 快速测试:检查云端健康
|
||||||
|
python scripts/check_health.py
|
||||||
|
# 如果看到"❌ 无法连接"是正常的(此时云端还没启动)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 成员A:云端快速测试(5分钟)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 第1步:在PowerShell/终端1中启动云端
|
||||||
|
python cloud_hypertension_system.py
|
||||||
|
|
||||||
|
# 看到这个就对了:
|
||||||
|
# ✓ 数据库初始化成功
|
||||||
|
# Running on http://127.0.0.1:5000
|
||||||
|
|
||||||
|
# 保持这个窗口运行!
|
||||||
|
|
||||||
|
# 第2步:打开新终端2,测试健康检查
|
||||||
|
python scripts/check_health.py
|
||||||
|
# 应该看到:✅ 服务器正在运行
|
||||||
|
|
||||||
|
# 第3步:测试上传
|
||||||
|
python scripts/test_upload.py
|
||||||
|
# 应该看到:✅ 上传成功!
|
||||||
|
|
||||||
|
# ✅ 如果以上3步都成功 → 云端基本可用
|
||||||
|
```
|
||||||
|
|
||||||
|
### 成员B:边缘端快速测试(5分钟)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 第1步:直接运行边缘端(模拟模式)
|
||||||
|
python edge_hypertension_system.py
|
||||||
|
|
||||||
|
# 应该看到每30秒输出:
|
||||||
|
# 📊 实时状态更新
|
||||||
|
# 心率: 72.3 bpm
|
||||||
|
# 风险评分: 0.285 (LOW)
|
||||||
|
|
||||||
|
# 第2步:运行10分钟,观察:
|
||||||
|
# - 有起夜事件(🚽)
|
||||||
|
# - 有风险预警(⚠️,可能出现)
|
||||||
|
# - 无崩溃、无异常
|
||||||
|
|
||||||
|
# ✅ 如果能稳定运行10分钟 → 边缘端基本可用
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 关键配置说明
|
||||||
|
|
||||||
|
### 云端配置(cloud_hypertension_system.py)
|
||||||
|
|
||||||
|
```python
|
||||||
|
# 第23-28行:API配置
|
||||||
|
'port': 5000, # 监听端口
|
||||||
|
'api_keys': [ # 鉴权密钥(测试用)
|
||||||
|
'edge_device_key_001',
|
||||||
|
'edge_device_key_002'
|
||||||
|
]
|
||||||
|
|
||||||
|
# 第44行:数据库配置
|
||||||
|
'type': 'sqlite', # 使用SQLite(测试用)
|
||||||
|
'sqlite_path': './cloud_database.db'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 边缘端配置(edge_hypertension_system.py)
|
||||||
|
|
||||||
|
```python
|
||||||
|
# 第75-78行:云端上传配置
|
||||||
|
'enable_upload': True, # 是否上传到云端
|
||||||
|
'upload_url': 'http://127.0.0.1:5000/api/upload', # 云端地址
|
||||||
|
'upload_interval': 300, # 上传间隔(秒)
|
||||||
|
'api_key': 'edge_device_key_001'
|
||||||
|
|
||||||
|
# 第68-70行:设备ID
|
||||||
|
'device_id': 'edge_rk3588_001' # 测试设备ID
|
||||||
|
```
|
||||||
|
|
||||||
|
**⚠️ 重要:两人测试时使用不同的device_id!**
|
||||||
|
- 成员A测试时用:`test_edge_device_001`
|
||||||
|
- 成员B测试时用:`test_edge_device_002`
|
||||||
|
- 联调时用:`edge_rk3588_001`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 测试执行流程(详细版见TestPlan-2Days.md)
|
||||||
|
|
||||||
|
### Day 1:组件测试(并行)
|
||||||
|
|
||||||
|
**上午(09:30-12:00)**
|
||||||
|
- ✅ 成员A:云端冒烟(health、upload、report)
|
||||||
|
- ✅ 成员B:边缘端本地运行稳定性
|
||||||
|
|
||||||
|
**下午(13:30-16:30)**
|
||||||
|
- ✅ 成员A:云端异常场景(401、400、重复上传)
|
||||||
|
- ✅ 成员B:边缘端上传容错(断网重连)
|
||||||
|
- ✅ 交叉复核(各自在对方机器上复现)
|
||||||
|
|
||||||
|
### Day 2:联调测试(协同)
|
||||||
|
|
||||||
|
**上午(09:30-12:00)**
|
||||||
|
- ✅ 端到端闭环:边缘端 → 上传 → 云端落库 → 报告生成
|
||||||
|
|
||||||
|
**下午(13:30-16:00)**
|
||||||
|
- ✅ 失败注入测试
|
||||||
|
- ✅ 整理交付物
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 验收标准(必须通过)
|
||||||
|
|
||||||
|
| 项目 | 成员A | 成员B | 证据文件 |
|
||||||
|
|------|------|------|---------|
|
||||||
|
| 云端健康检查 | ✅ | - | artifacts/cloud/health.json |
|
||||||
|
| upload→report闭环 | ✅ | - | artifacts/cloud/upload_response.json |
|
||||||
|
| 错误码正确(401/400) | ✅ | - | artifacts/cloud/negative_tests.log |
|
||||||
|
| 边缘端10分钟无崩溃 | - | ✅ | artifacts/edge/edge_10min.log |
|
||||||
|
| 联调成功 | ✅ | ✅ | artifacts/end2end/combined.log |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🐛 常见问题速查
|
||||||
|
|
||||||
|
### Q1: 云端启动后,测试脚本报"连接拒绝"?
|
||||||
|
**A:** 检查云端是否真的在运行:
|
||||||
|
```bash
|
||||||
|
python scripts/check_health.py
|
||||||
|
# 如果显示"❌ 无法连接" → 云端没启动或崩溃了
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q2: 测试脚本报"500错误"?
|
||||||
|
**A:** 查看云端窗口的错误日志,通常是:
|
||||||
|
- 时间戳格式错误(应该是数字,不是字符串)
|
||||||
|
- 数据库锁定(关闭其他访问数据库的程序)
|
||||||
|
|
||||||
|
### Q3: 边缘端上传失败?
|
||||||
|
**A:** 检查:
|
||||||
|
1. 云端是否启动?(check_health.py)
|
||||||
|
2. URL配置是否正确?(第77行)
|
||||||
|
3. API Key是否匹配?(第78行)
|
||||||
|
|
||||||
|
### Q4: 端口5000被占用?
|
||||||
|
**A:** 查找并杀死占用进程:
|
||||||
|
```bash
|
||||||
|
# Windows
|
||||||
|
netstat -ano | findstr :5000
|
||||||
|
taskkill /PID <PID> /F
|
||||||
|
|
||||||
|
# 或者修改云端端口为5001
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📞 支持与反馈
|
||||||
|
|
||||||
|
- **技术问题**:立即在测试记录中标注,并截图+日志
|
||||||
|
- **阻塞问题**:第一时间同步给项目负责人
|
||||||
|
- **测试进度**:每天下班前提交当天Test-Log.md
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎉 测试完成后交付
|
||||||
|
|
||||||
|
**必须提交(2个人一起):**
|
||||||
|
1. `Test-Log.md`(按模板填写,带时间线)
|
||||||
|
2. `Bug-List.xlsx`(所有缺陷,P0/P1/P2分级)
|
||||||
|
3. `artifacts/`目录(所有日志、截图、数据库文件)
|
||||||
|
4. `2-day-summary.md`(一页纸结论)
|
||||||
|
|
||||||
|
**提交方式:**
|
||||||
|
- 打包成 `test-results-YYYYMMDD.zip`
|
||||||
|
- 发送给项目负责人
|
||||||
|
|
||||||
|
---
|
||||||
479
0112-2026 - Test_Package/详细计划-TestPlan-2Days.md
Normal file
479
0112-2026 - Test_Package/详细计划-TestPlan-2Days.md
Normal file
@ -0,0 +1,479 @@
|
|||||||
|
# 高血压风险评估系统 - 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
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**测试愉快!有问题随时沟通。** 🚀
|
||||||
Loading…
x
Reference in New Issue
Block a user