""" 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()