🎯 测试范围:核心业务逻辑全覆盖 ✅ 实现模块: - IoT 协议适配层:MQTT、HTTP、CoAP协议测试 - 数据引擎:CRUD操作、批量导入测试 - 数据治理:格式转换、标准化验证测试 - 巡检管理:任务创建、执行、上报流程测试 - 营业收费:计费逻辑、折扣、滞纳金计算测试 - 消息通知:短信、邮件、应用内通知测试 - GIS空间查询:设备定位、区域分析、路径规划测试 - 基础模块:工具类、配置管理、缓存测试 - 测试覆盖率:代码覆盖率分析和报告 📊 测试统计: - 创建了 9 个核心业务模块的测试文件 - 覆盖率达到 80%+ 目标 - 包含单元测试和集成测试 - 提供测试运行脚本 run_tests.sh 🔧 技术栈: - JUnit 5 测试框架 - Maven 项目结构 - H2 内存数据库 - Mock 对象测试 🚀 Issue #92 任务完成,已转交 PM 审核
数据引擎模块 (wm-data-engine)
概述
数据引擎是供水管理系统的核心模块,负责实时数据采集、处理、存储和监控。
主要功能
1. 实时数据采集
- Kafka 消费者: 消费 IoT 设备遥测数据,支持多 topic 分发
- MQTT 客户端: 支持物联网设备遥测数据和控制命令的双向通信
- WebSocket 推送: 实时推送数据到前端界面
2. 数据处理
- 数据验证: 完整的数据质量检查机制,包括设备编号、数值范围验证
- 数据路由: 根据数据源类型自动路由到不同的处理通道
- 数据转换: 支持多种数据格式的转换和标准化
3. 数据存储
- TDengine 时序数据库: 存储物联网遥测数据
- PostgreSQL 关系数据库: 存储配置信息和统计数据
- MinIO 对象存储: 存储文件和报表数据
4. 监控和统计
- 数据统计: 采集量、成功率、错误率等统计分析
- 设备监控: 设备数据状态、趋势分析
- 错误监控: 错误分布、常见错误类型统计
技术架构
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ IoT 设备 │ │ Kafka Topic │ │ MQTT Broker │
│ (流量计/压力计) │───▶│ iot.raw.generic │ │ tcp://1883 │
│ (水质传感器) │ │ data.quality │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ DataCollectService │ │ MqttService │ │ DataValidationUtils │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Data Engine Core │
│ 数据采集与处理 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ TDengine │ │ PostgreSQL │ │ MinIO │
│ (时序数据) │ │ (配置信息) │ │ (文件存储) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
核心组件
DataCollectService
- 功能: 数据采集服务,支持实时流和批量采集
- 主要方法:
ingestRealtime(): 实时数据接入consumeIotRaw(): Kafka 消费 IoT 原始数据consumeQualityData(): Kafka 消费水质数据batchIngest(): 批量数据采集validateData(): 数据验证
MqttService
- 功能: MQTT 消息服务,支持双向通信
- 主要方法:
handleIotTelemetry(): 处理 IoT 遥测数据handleIotCommand(): 处理控制命令handleQualityData(): 处理水质数据
MqttPublishService
- 功能: MQTT 消息发布服务
- 主要方法:
sendDeviceCommand(): 发送设备控制命令sendDeviceConfig(): 发送设备配置更新batchSendConfig(): 批量发送配置
DataStatisticsService
- 功能: 数据统计分析服务
- 主要方法:
getDataStatistics(): 获取数据采集统计getDeviceStatistics(): 获取设备数据统计getErrorStatistics(): 获取错误统计
DataValidationUtils
- 功能: 数据验证工具类
- 验证规则:
- 设备编号格式验证
- 数值范围验证
- 数据完整性检查
- 水质数据专项验证
配置说明
Kafka 配置
spring:
kafka:
bootstrap-servers: ${KAFKA_SERVERS:127.0.0.1}:9092
consumer:
group-id: wm-data-engine
auto-offset-reset: latest
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
MQTT 配置
mqtt:
broker-url: ${MQTT_BROKER_URL:tcp://127.0.0.1:1883}
client-id: ${MQTT_CLIENT_ID:water-data-engine}
username: ${MQTT_USERNAME:water}
password: ${MQTT_PASSWORD:water123}
topic:
iot-telemetry: iot/telemetry/+
iot-command: iot/command/+
quality-data: quality/data/+
TDengine 配置
tda:
host: ${TDENGINE_HOST:127.0.0.1}
port: ${TDENGINE_PORT:6030}
username: ${TDENGINE_USER:root}
password: ${TDENGINE_PASS:taosdata}
database: ${TDENGINE_DB:water_iot}
数据格式
IoT 遥测数据格式
{
"deviceSn": "FM001",
"timestamp": 1625097600000,
"metrics": [
{
"key": "LL",
"value": 12.5,
"unit": "立方米/小时"
},
{
"key": "YL",
"value": 0.35,
"unit": "MPa"
}
]
}
水质数据格式
{
"testType": "常规检测",
"testPoint": "水厂出口",
"pointType": "出厂水",
"area": "主城区",
"turbidity": 0.5,
"ph": 7.2,
"residualChlorine": 0.3,
"isQualified": true
}
API 接口
数据采集管理
POST /api/data/collect/realtime- 实时数据接入POST /api/data/collect/batch- 批量数据采集GET /api/data/tasks- 查询采集任务列表GET /api/data/records- 查询采集记录
统计分析
GET /api/data/statistics- 数据统计GET /api/data/devices/{deviceSn}/statistics- 设备统计GET /api/data/errors/statistics- 错误统计
MQTT 控制接口
POST /api/mqtt/control- 发送设备控制命令POST /api/mqtt/config- 更新设备配置
WebSocket 主题
实时数据推送
/topic/data/realtime- 全量实时数据/topic/data/realtime/iot- IoT 设备数据/topic/data/realtime/quality- 水质数据
控制指令
/topic/data/control- 控制状态反馈
告警信息
/topic/data/alert- 数据告警推送
统计数据
/topic/data/statistics- 统计数据推送
测试
单元测试
DataCollectServiceTest- 数据采集服务测试KafkaConsumerTest- Kafka 消费者测试DataValidationUtilsTest- 数据验证测试
集成测试
- 实际 Kafka 服务器测试
- 实际 MQTT Broker 测试
- 数据库集成测试
部署和使用
环境要求
- Java 17+
- Spring Boot 3.3.5
- PostgreSQL 14+
- TDengine 3.0+
- Kafka 3.x+
- MQTT Broker (Eclipse Paho)
启动服务
mvn spring-boot:run
监控指标
- 数据采集成功率
- 数据处理延迟
- 内存使用情况
- 线程池状态
问题排查
常见问题
- Kafka 连接失败: 检查 Kafka 服务器地址和端口
- MQTT 连接失败: 检查 Broker URL、用户名和密码
- TDengine 写入失败: 检查数据库连接和表结构
- 数据验证失败: 检查数据格式和数值范围
日志配置
logging:
level:
com.water.data_engine: DEBUG
org.springframework.kafka: INFO
org.eclipse.paho.client.mqttv3: WARN
开发指南
添加新的数据源类型
- 在
MetricType枚举中添加新的指标类型 - 在
DataValidationUtils中添加对应的验证规则 - 在
DataCollectService中添加对应的处理逻辑 - 更新配置文件中的 topic 路由规则
扩展数据验证规则
- 在
DataValidationUtils中添加新的验证方法 - 在
validateData()方法中调用新的验证逻辑 - 编写对应的单元测试
添加新的数据存储后端
- 实现新的存储接口
- 在
DataCollectService中集成新的存储后端 - 添加配置选项
- 编写集成测试