| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- """
- IoT 协议适配层单元测试
- 覆盖MQTT、HTTP、CoAP协议设备接入和数据解析功能
- """
- import unittest
- from unittest.mock import Mock, patch
- import json
- from src.iot.mqtt_adapter import MQTTAdapter
- from src.iot.http_adapter import HTTPAdapter
- from src.iot.coap_adapter import CoAPAdapter
-
-
- class TestMQTTAdapter(unittest.TestCase):
- """MQTT协议适配器测试"""
-
- def setUp(self):
- self.mqtt_adapter = MQTTAdapter("localhost", 1883, "test_client")
-
- def test_device_registration(self):
- """测试设备注册功能"""
- device_data = {
- "device_id": "test_device_001",
- "type": "sensor",
- "location": "building_a",
- "capabilities": ["temperature", "humidity"]
- }
- result = self.mqtt_adapter.register_device(device_data)
- self.assertTrue(result["success"])
- self.assertEqual(result["device_id"], device_data["device_id"])
-
- def test_data_parsing(self):
- """测试数据解析功能"""
- mqtt_message = {
- "topic": "devices/temperature/data",
- "payload": json.dumps({
- "device_id": "temp_sensor_01",
- "timestamp": "2026-06-16T12:00:00Z",
- "temperature": 25.5,
- "humidity": 60.2
- })
- }
- parsed_data = self.mqtt_adapter.parse_message(mqtt_message)
- self.assertEqual(parsed_data["device_id"], "temp_sensor_01")
- self.assertEqual(parsed_data["temperature"], 25.5)
-
- @patch('src.iot.mqtt_adapter.paho.mqtt.client')
- def test_connection_mqtt(self, mock_mqtt):
- """测试MQTT连接"""
- mock_client = Mock()
- mock_mqtt.Client.return_value = mock_client
-
- result = self.mqtt_adapter.connect()
- self.assertTrue(result["connected"])
- mock_client.connect.assert_called_once_with("localhost", 1883, 60)
-
-
- class TestHTTPAdapter(unittest.TestCase):
- """HTTP协议适配器测试"""
-
- def setUp(self):
- self.http_adapter = HTTPAdapter("http://localhost:8080")
-
- def test_device_api_endpoint(self):
- """测试设备API端点"""
- device_data = {
- "device_id": "http_device_001",
- "model": "HTTP Sensor",
- "ip_address": "192.168.1.100"
- }
- # 模拟HTTP请求
- with patch('requests.post') as mock_post:
- mock_post.return_value.status_code = 200
- mock_post.return_value.json.return_value = {
- "success": True,
- "device_id": device_data["device_id"]
- }
-
- result = self.http_adapter.register_device(device_data)
- self.assertTrue(result["success"])
-
- def test_batch_data_upload(self):
- """测试批量数据上传"""
- batch_data = [
- {"device_id": "dev001", "temperature": 25.0, "timestamp": "2026-06-16T12:00:00Z"},
- {"device_id": "dev002", "temperature": 26.1, "timestamp": "2026-06-16T12:01:00Z"}
- ]
-
- with patch('requests.post') as mock_post:
- mock_post.return_value.status_code = 200
- mock_post.return_value.json.return_value = {"success": True, "uploaded": 2}
-
- result = self.http_adapter.upload_batch_data(batch_data)
- self.assertEqual(result["uploaded"], 2)
-
-
- class TestCoAPAdapter(unittest.TestCase):
- """CoAP协议适配器测试"""
-
- def setUp(self):
- self.coap_adapter = CoAPAdapter("localhost", 5683)
-
- @patch('src.iot.coap_adapter.coap')
- def test_coap_discovery(self, mock_coap):
- """测试CoAP设备发现"""
- mock_response = Mock()
- mock_response.code = "2.05"
- mock_response.payload = json.dumps({
- "devices": ["coap_sensor_01", "coap_sensor_02"]
- }).encode()
- mock_coap.client.Client.return_value.get.return_value = mock_response
-
- devices = self.coap_adapter.discover_devices()
- self.assertEqual(len(devices), 2)
-
- def test_coap_data_collection(self):
- """测试CoAP数据收集"""
- device_resources = [
- "sensors/temperature",
- "sensors/humidity",
- "sensors/battery"
- ]
-
- with patch('src.iot.coap_adapter.coap') as mock_coap:
- mock_response = Mock()
- mock_response.code = "2.05"
- mock_response.payload = json.dumps({"value": 25.5}).encode()
-
- mock_client = Mock()
- mock_client.get.return_value = mock_response
- mock_coap.client.Client.return_value = mock_client
-
- result = self.coap_adapter.collect_data("device_01", device_resources)
- self.assertIn("temperature", result)
-
-
- if __name__ == '__main__':
- unittest.main()
|