智慧水务管理系统 - 精河县供水工程综合管理平台

test_iot_protocol.py 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. """
  2. IoT 协议适配层单元测试
  3. 覆盖MQTT、HTTP、CoAP协议设备接入和数据解析功能
  4. """
  5. import unittest
  6. from unittest.mock import Mock, patch
  7. import json
  8. from src.iot.mqtt_adapter import MQTTAdapter
  9. from src.iot.http_adapter import HTTPAdapter
  10. from src.iot.coap_adapter import CoAPAdapter
  11. class TestMQTTAdapter(unittest.TestCase):
  12. """MQTT协议适配器测试"""
  13. def setUp(self):
  14. self.mqtt_adapter = MQTTAdapter("localhost", 1883, "test_client")
  15. def test_device_registration(self):
  16. """测试设备注册功能"""
  17. device_data = {
  18. "device_id": "test_device_001",
  19. "type": "sensor",
  20. "location": "building_a",
  21. "capabilities": ["temperature", "humidity"]
  22. }
  23. result = self.mqtt_adapter.register_device(device_data)
  24. self.assertTrue(result["success"])
  25. self.assertEqual(result["device_id"], device_data["device_id"])
  26. def test_data_parsing(self):
  27. """测试数据解析功能"""
  28. mqtt_message = {
  29. "topic": "devices/temperature/data",
  30. "payload": json.dumps({
  31. "device_id": "temp_sensor_01",
  32. "timestamp": "2026-06-16T12:00:00Z",
  33. "temperature": 25.5,
  34. "humidity": 60.2
  35. })
  36. }
  37. parsed_data = self.mqtt_adapter.parse_message(mqtt_message)
  38. self.assertEqual(parsed_data["device_id"], "temp_sensor_01")
  39. self.assertEqual(parsed_data["temperature"], 25.5)
  40. @patch('src.iot.mqtt_adapter.paho.mqtt.client')
  41. def test_connection_mqtt(self, mock_mqtt):
  42. """测试MQTT连接"""
  43. mock_client = Mock()
  44. mock_mqtt.Client.return_value = mock_client
  45. result = self.mqtt_adapter.connect()
  46. self.assertTrue(result["connected"])
  47. mock_client.connect.assert_called_once_with("localhost", 1883, 60)
  48. class TestHTTPAdapter(unittest.TestCase):
  49. """HTTP协议适配器测试"""
  50. def setUp(self):
  51. self.http_adapter = HTTPAdapter("http://localhost:8080")
  52. def test_device_api_endpoint(self):
  53. """测试设备API端点"""
  54. device_data = {
  55. "device_id": "http_device_001",
  56. "model": "HTTP Sensor",
  57. "ip_address": "192.168.1.100"
  58. }
  59. # 模拟HTTP请求
  60. with patch('requests.post') as mock_post:
  61. mock_post.return_value.status_code = 200
  62. mock_post.return_value.json.return_value = {
  63. "success": True,
  64. "device_id": device_data["device_id"]
  65. }
  66. result = self.http_adapter.register_device(device_data)
  67. self.assertTrue(result["success"])
  68. def test_batch_data_upload(self):
  69. """测试批量数据上传"""
  70. batch_data = [
  71. {"device_id": "dev001", "temperature": 25.0, "timestamp": "2026-06-16T12:00:00Z"},
  72. {"device_id": "dev002", "temperature": 26.1, "timestamp": "2026-06-16T12:01:00Z"}
  73. ]
  74. with patch('requests.post') as mock_post:
  75. mock_post.return_value.status_code = 200
  76. mock_post.return_value.json.return_value = {"success": True, "uploaded": 2}
  77. result = self.http_adapter.upload_batch_data(batch_data)
  78. self.assertEqual(result["uploaded"], 2)
  79. class TestCoAPAdapter(unittest.TestCase):
  80. """CoAP协议适配器测试"""
  81. def setUp(self):
  82. self.coap_adapter = CoAPAdapter("localhost", 5683)
  83. @patch('src.iot.coap_adapter.coap')
  84. def test_coap_discovery(self, mock_coap):
  85. """测试CoAP设备发现"""
  86. mock_response = Mock()
  87. mock_response.code = "2.05"
  88. mock_response.payload = json.dumps({
  89. "devices": ["coap_sensor_01", "coap_sensor_02"]
  90. }).encode()
  91. mock_coap.client.Client.return_value.get.return_value = mock_response
  92. devices = self.coap_adapter.discover_devices()
  93. self.assertEqual(len(devices), 2)
  94. def test_coap_data_collection(self):
  95. """测试CoAP数据收集"""
  96. device_resources = [
  97. "sensors/temperature",
  98. "sensors/humidity",
  99. "sensors/battery"
  100. ]
  101. with patch('src.iot.coap_adapter.coap') as mock_coap:
  102. mock_response = Mock()
  103. mock_response.code = "2.05"
  104. mock_response.payload = json.dumps({"value": 25.5}).encode()
  105. mock_client = Mock()
  106. mock_client.get.return_value = mock_response
  107. mock_coap.client.Client.return_value = mock_client
  108. result = self.coap_adapter.collect_data("device_01", device_resources)
  109. self.assertIn("temperature", result)
  110. if __name__ == '__main__':
  111. unittest.main()