Files
ljwx-health/ljwx-boot/scripts/test-data-factory/E2E_FLOW_TEST_GUIDE.md
T
brunoandClaude Sonnet 4.5 011f05736f feat(device-binding): Phase 3 完成 - 体验优化 + E2E测试基础设施 ✅
## Phase 3 实施完成

### P3-1: 前端轮询优化 (ljwx-phone)
- ✅ 实现指数退避轮询器 (ExponentialBackoffPoller)
  - 初始间隔 2s,最大间隔 30s
  - 随机抖动 ±20% 避免惊群效应
  - 自动重置机制

### P3-2: SSE 实时推送 (ljwx-phone)
- ✅ 实现 SSE 客户端服务 (SseClient)
  - 自动重连机制 (指数退避)
  - 心跳检测 (30s 超时)
  - 事件类型路由

### P3-3: 批量审批确认机制
- ✅ 后端 confirmToken 机制
  - Redis 存储,5分钟过期
  - 防重放攻击
  - 批量操作原子性保证
- ✅ 前端确认弹窗 (BatchApprovalConfirmModal.vue)
  - 显示待审批设备列表
  - 二次确认交互

### P3-4: 设备绑定 V2 API (HMAC-SHA256 签名验证)
- ✅ DeviceBindEventController - SSE 事件推送
- ✅ DeviceSignatureService - HMAC-SHA256 签名验证
- ✅ DeviceKeyService - 设备密钥管理
- ✅ ChallengeVO, ConfirmTokenVO - V2 API 响应对象
- ✅ BindRequestStatus - 绑定请求状态枚举

## E2E 测试基础设施

### 测试脚本
- ✅ test_e2e_flow.py - 完整端到端测试
  - 租户/部门/员工创建
  - 设备注册与绑定
  - 健康数据上传与查询
  - 告警与消息生成
- ✅ test_device_binding_v2.py - 设备绑定 V2 API 测试
  - Challenge 获取
  - HMAC-SHA256 签名验证
  - 绑定请求提交
  - 审批流程测试

### 测试配置
- ✅ api-map.yaml - 新增 device_binding_v2 API 映射
  - 11 个 V2 API 端点完整定义
  - 请求/响应 schema 规范
- ✅ recipes/device_binding_v2_test.yaml - V2 测试场景配置

### 测试文档
- ✅ E2E_FLOW_TEST_GUIDE.md - E2E 测试指南
- ✅ DEVICE_BINDING_V2_TEST_GUIDE.md - V2 API 测试指南
- ✅ device-binding-phase3-implementation-report.md - Phase 3 实施报告

## 修复问题
- 🐛 修复 UserContext API 调用错误
  - getUserId() → getCurrentUserId()
  - getUserName() → getCurrentUserName()
- 🐛 修复 TDeviceUser 实体方法调用
  - setUpdatedAt() → setUpdateTime()
- 🐛 修复 BizException 构造函数签名
- 🐛 修复测试脚本 API 端点
  - /t_org/ → /sys_org_units/
  - /t_user/ → /sys_user/
- 🐛 修复认证头格式
  - satoken: <token> → Authorization: Bearer <token>

## 测试状态
- ✅ 编译通过,应用启动成功 (端口 9998)
- ✅ E2E 测试步骤 1-4 通过 (租户/部门/员工/设备注册)
- ⏳ 步骤 5-8 待完成 (需配置设备密钥)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-08 19:36:01 +08:00

9.9 KiB
Raw Blame History

端到端流程测试指南 (E2E Flow Test Guide)

创建时间: 2026-02-07 用途: 完整测试从租户创建到健康数据告警的全流程

📋 测试流程

本测试覆盖以下完整流程:

1. 创建租户 (Create Tenant)
   ↓
2. 创建部门 (Create Department)
   ↓
3. 创建员工 (Create Employee)
   ↓
4. 注册设备 (Register Device)
   ↓
5. 绑定设备 (Bind Device - V2 API with Signature)
   ↓
6. 审批绑定 (Approve Binding)
   ↓
7. 上传健康数据 (Upload Health Data)
   ↓
8. 查询健康数据 (Query Health Data)
   ↓
9. [自动] 生成告警 (Generate Alerts - via scheduled tasks)
   ↓
10. [自动] 发送消息 (Send Messages - via alert rules)

🚀 快速开始

前置条件

  1. ljwx-boot 运行中: http://localhost:9998
  2. 获取 SaToken: 通过登录接口获取
  3. Python 3.8+: 安装 requests 库

步骤 1: 获取 SaToken

# 登录获取 token (密码已 SHA256 加密)
curl -X POST http://localhost:9998/auth/user_name \
  -H "Content-Type: application/json" \
  -d '{
    "userName": "admin",
    "password": "80a3d119ee1501354755dfc3c4638d74c67c801689efbed4f25f06cb4b1cd776"
  }' \
  -v 2>&1 | grep -i satoken

# 输出示例:
# < satoken: your_token_here

步骤 2: 运行端到端测试

cd ljwx-boot/scripts/test-data-factory

# 运行完整流程测试
python test_e2e_flow.py \
  --base-url http://localhost:9998 \
  --token <your_satoken>

预期输出

============================================================
🚀 Starting End-to-End Flow Test
============================================================

============================================================
📍 Step 1: 创建租户 (Create Tenant)
============================================================
ℹ️  Creating tenant: E2E_Test_Tenant_1707318000
✅ Tenant created: ID=123

============================================================
📍 Step 2: 创建部门 (Create Department)
============================================================
ℹ️  Creating organization: E2E Test Department
✅ Organization created: ID=456

============================================================
📍 Step 3: 创建员工 (Create Employee)
============================================================
ℹ️  Creating user: e2e_user_1707318000
✅ User created: ID=789

============================================================
📍 Step 4: 注册设备 (Register Device)
============================================================
ℹ️  Registering device: E2E_TEST_1707318000
✅ Device registered successfully

============================================================
📍 Step 5: 绑定设备 (Bind Device - V2 API)
============================================================
ℹ️  Binding device E2E_TEST_1707318000 to user 789
ℹ️  Challenge received: a1b2c3d4e5f6g7h8i9j0...
ℹ️  Signature calculated: 9f8e7d6c5b4a3f2e1d0c...
✅ Binding requested: approvalId=abc-123

============================================================
📍 Step 6: 审批绑定 (Approve Binding)
============================================================
ℹ️  Approving binding: abc-123
✅ Binding approved successfully

============================================================
📍 Step 7: 上传健康数据 (Upload Health Data)
============================================================
ℹ️  Uploading health data for user 789
✅ Health data uploaded: 3 records

============================================================
📍 Step 8: 查询健康数据 (Query Health Data)
============================================================
ℹ️  Querying health data for user 789
✅ Health data queried: 3 records found

============================================================
✅ End-to-End Flow Test COMPLETED SUCCESSFULLY
============================================================

📊 Test Context:
{
  "tenant_id": 123,
  "org_id": 456,
  "user_id": 789,
  "device_sn": "E2E_TEST_1707318000",
  "device_secret": "e2e_test_secret_001",
  "approval_id": "abc-123"
}

💡 Next Steps:
  - Check alerts in database: SELECT * FROM t_alert WHERE user_id = 789
  - Check messages: SELECT * FROM t_message WHERE user_id = 789
  - View in BigScreen: http://localhost:5225
  - View in Admin: http://localhost:3333

🔍 验证结果

1. 数据库验证

-- 查看创建的租户
SELECT * FROM t_customer_config WHERE customer_name LIKE 'E2E_Test_Tenant_%';

-- 查看创建的部门
SELECT * FROM t_org WHERE org_name = 'E2E Test Department';

-- 查看创建的用户
SELECT * FROM t_user WHERE user_name LIKE 'e2e_user_%';

-- 查看设备注册
SELECT * FROM t_device_info WHERE device_sn LIKE 'E2E_TEST_%';

-- 查看设备绑定
SELECT * FROM t_device_user WHERE device_sn LIKE 'E2E_TEST_%';

-- 查看健康数据
SELECT * FROM t_user_health_data
WHERE user_id = <your_user_id>
ORDER BY event_time DESC
LIMIT 10;

-- 查看告警 (需要等待定时任务执行)
SELECT * FROM t_alert
WHERE user_id = <your_user_id>
ORDER BY created_at DESC;

-- 查看消息
SELECT * FROM t_message
WHERE user_id = <your_user_id>
ORDER BY created_at DESC;

2. API 验证

# 查询用户健康数据
curl -X GET "http://localhost:9998/api/health/data/query?customerId=123&userId=789&pageNum=1&pageSize=10" \
  -H "satoken: <your_token>"

# 查询用户告警
curl -X GET "http://localhost:9998/api/alert/list?userId=789&pageNum=1&pageSize=10" \
  -H "satoken: <your_token>"

# 查询用户消息
curl -X GET "http://localhost:9998/api/message/list?userId=789&pageNum=1&pageSize=10" \
  -H "satoken: <your_token>"

3. 前端验证

管理后台 (ljwx-admin):

  • 访问: http://localhost:3333
  • 登录: admin / kt123456
  • 查看: 租户管理 → 组织管理 → 用户管理 → 设备管理

大屏监控 (ljwx-bigscreen):


🔧 告警和消息生成

自动生成机制

告警和消息由后台定时任务自动生成,无需手动触发:

1. 告警规则引擎 (Alert Rule Engine)

触发条件:

  • 健康数据超出阈值(心率、血氧、体温等)
  • 设备离线超时
  • 数据质量异常

执行频率: 每分钟检查一次

查看日志:

tail -f ljwx-boot/logs/ljwx-boot-admin_*.log | grep "AlertRuleEngine"

2. 消息推送服务 (Message Publisher)

触发条件:

  • 告警生成后自动推送
  • 设备绑定状态变更
  • 系统通知

推送渠道:

  • 企业微信
  • 短信
  • 邮件
  • Webhook

查看日志:

tail -f ljwx-boot/logs/ljwx-boot-admin_*.log | grep "UnifiedMessagePublisher"

手动触发告警 (测试用)

如果需要立即生成告警进行测试:

# 上传异常健康数据 (心率过高)
curl -X POST http://localhost:9998/api/health/data/batch \
  -H "Content-Type: application/json" \
  -H "satoken: <your_token>" \
  -d '[{
    "customerId": 123,
    "userId": 789,
    "deviceSn": "E2E_TEST_1707318000",
    "metricType": "heart_rate",
    "metricValue": 180.0,
    "unit": "bpm",
    "eventTime": "2026-02-07 22:00:00",
    "metadata": "{\"source\":\"manual_test\"}"
  }]'

# 等待 1-2 分钟,告警规则引擎会自动检测并生成告警

📊 性能基准

步骤 预期耗时 说明
创建租户 < 200ms 数据库写入
创建部门 < 150ms 数据库写入
创建员工 < 200ms 密码加密 + 写入
注册设备 < 150ms 数据库写入
绑定设备 < 300ms 签名验证 + 写入
审批绑定 < 200ms CAS 更新
上传健康数据 < 500ms 批量写入 (3条)
查询健康数据 < 200ms 索引查询
总耗时 < 2秒 不含等待时间

🐛 故障排查

问题 1: "Failed to create tenant"

原因: 权限不足或租户名重复

解决:

  1. 确认使用 admin 账号登录
  2. 检查租户名是否已存在
  3. 查看后端日志: tail -f ljwx-boot/logs/ljwx-boot-admin_*.log

问题 2: "Signature verification failed"

原因: 设备密钥不匹配或签名计算错误

解决:

  1. 确认设备密钥已在系统中配置
  2. 检查签名计算: message = challenge + deviceSn
  3. 使用 HMAC-SHA256 算法

问题 3: "Health data upload failed"

原因: 设备未绑定或数据格式错误

解决:

  1. 确认设备绑定已审批通过
  2. 检查 metricType 是否支持
  3. 检查数据格式是否正确

问题 4: "No alerts generated"

原因: 数据未触发告警规则或定时任务未执行

解决:

  1. 检查告警规则配置: SELECT * FROM t_alert_rule WHERE status = '1'
  2. 查看定时任务日志: grep "AlertRuleEngine" ljwx-boot/logs/*.log
  3. 手动上传异常数据触发告警

📚 相关文档


💡 扩展测试

测试多用户场景

# 运行 3 次创建 3 个用户
for i in {1..3}; do
  python test_e2e_flow.py \
    --base-url http://localhost:9998 \
    --token <your_token>
  sleep 2
done

测试批量数据上传

修改 test_e2e_flow.py 中的 upload_health_data 方法,增加数据量:

# 生成 100 条健康数据
for i in range(100):
    event_time = (now - timedelta(minutes=i*5)).strftime("%Y-%m-%d %H:%M:%S")
    health_data.append({
        "customerId": customer_id,
        "userId": user_id,
        "deviceSn": device_sn,
        "metricType": "heart_rate",
        "metricValue": 70 + (i % 20),
        "unit": "bpm",
        "eventTime": event_time
    })

测试告警规则

  1. 创建自定义告警规则
  2. 上传触发告警的数据
  3. 验证告警生成和消息推送

最后更新: 2026-02-07