165 lines
6.0 KiB
Python
165 lines
6.0 KiB
Python
|
|
import unittest
|
|||
|
|
from unittest.mock import patch, MagicMock
|
|||
|
|
import sys
|
|||
|
|
import os
|
|||
|
|
|
|||
|
|
# 添加项目根目录到Python路径
|
|||
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
|||
|
|
|
|||
|
|
from hardware.transmitter import TransmitterController
|
|||
|
|
from pymodbus.exceptions import ModbusException
|
|||
|
|
|
|||
|
|
|
|||
|
|
class TestTransmitterController(unittest.TestCase):
|
|||
|
|
|
|||
|
|
def setUp(self):
|
|||
|
|
"""测试前的准备工作"""
|
|||
|
|
# 创建模拟的继电器控制器
|
|||
|
|
self.mock_relay = MagicMock()
|
|||
|
|
self.mock_relay.modbus_client = MagicMock()
|
|||
|
|
|
|||
|
|
# 创建变送器控制器实例
|
|||
|
|
self.transmitter = TransmitterController(relay_controller=self.mock_relay)
|
|||
|
|
|
|||
|
|
def test_transmitter_initialization(self):
|
|||
|
|
"""测试变送器控制器初始化"""
|
|||
|
|
self.assertEqual(self.transmitter.relay_controller, self.mock_relay)
|
|||
|
|
|
|||
|
|
# 检查配置
|
|||
|
|
self.assertIn(1, self.transmitter.config) # 上料斗
|
|||
|
|
self.assertIn(2, self.transmitter.config) # 下料斗
|
|||
|
|
|
|||
|
|
# 检查上料斗配置
|
|||
|
|
upper_config = self.transmitter.config[1]
|
|||
|
|
self.assertEqual(upper_config['slave_id'], 1)
|
|||
|
|
self.assertEqual(upper_config['weight_register'], 0x01)
|
|||
|
|
self.assertEqual(upper_config['register_count'], 2)
|
|||
|
|
|
|||
|
|
# 检查下料斗配置
|
|||
|
|
lower_config = self.transmitter.config[2]
|
|||
|
|
self.assertEqual(lower_config['slave_id'], 2)
|
|||
|
|
self.assertEqual(lower_config['weight_register'], 0x01)
|
|||
|
|
self.assertEqual(lower_config['register_count'], 2)
|
|||
|
|
|
|||
|
|
def test_read_data_valid_transmitter_id(self):
|
|||
|
|
"""测试读取有效变送器ID的数据"""
|
|||
|
|
# 配置模拟对象
|
|||
|
|
self.mock_relay.modbus_client.connect.return_value = True
|
|||
|
|
|
|||
|
|
# 模拟读取结果
|
|||
|
|
mock_result = MagicMock()
|
|||
|
|
mock_result.registers = [0, 1500] # 表示1500kg
|
|||
|
|
self.mock_relay.modbus_client.read_holding_registers.return_value = mock_result
|
|||
|
|
|
|||
|
|
# 读取上料斗数据
|
|||
|
|
weight = self.transmitter.read_data(1)
|
|||
|
|
|
|||
|
|
# 验证调用
|
|||
|
|
self.mock_relay.modbus_client.connect.assert_called_once()
|
|||
|
|
self.mock_relay.modbus_client.read_holding_registers.assert_called_once()
|
|||
|
|
self.assertEqual(weight, 1.5) # 1500kg / 1000 = 1.5kg
|
|||
|
|
|
|||
|
|
def test_read_data_invalid_transmitter_id(self):
|
|||
|
|
"""测试读取无效变送器ID的数据"""
|
|||
|
|
# 读取无效ID的数据
|
|||
|
|
weight = self.transmitter.read_data(99)
|
|||
|
|
|
|||
|
|
# 验证结果
|
|||
|
|
self.assertIsNone(weight)
|
|||
|
|
self.mock_relay.modbus_client.connect.assert_not_called()
|
|||
|
|
self.mock_relay.modbus_client.read_holding_registers.assert_not_called()
|
|||
|
|
|
|||
|
|
def test_read_data_connection_failed(self):
|
|||
|
|
"""测试读取数据时连接失败"""
|
|||
|
|
# 配置模拟对象
|
|||
|
|
self.mock_relay.modbus_client.connect.return_value = False
|
|||
|
|
|
|||
|
|
# 读取数据
|
|||
|
|
weight = self.transmitter.read_data(1)
|
|||
|
|
|
|||
|
|
# 验证结果
|
|||
|
|
self.assertIsNone(weight)
|
|||
|
|
self.mock_relay.modbus_client.connect.assert_called_once()
|
|||
|
|
self.mock_relay.modbus_client.read_holding_registers.assert_not_called()
|
|||
|
|
|
|||
|
|
def test_read_data_modbus_exception(self):
|
|||
|
|
"""测试读取数据时Modbus异常"""
|
|||
|
|
# 配置模拟对象
|
|||
|
|
self.mock_relay.modbus_client.connect.return_value = True
|
|||
|
|
self.mock_relay.modbus_client.read_holding_registers.side_effect = ModbusException("Modbus错误")
|
|||
|
|
|
|||
|
|
# 读取数据
|
|||
|
|
weight = self.transmitter.read_data(1)
|
|||
|
|
|
|||
|
|
# 验证结果
|
|||
|
|
self.assertIsNone(weight)
|
|||
|
|
|
|||
|
|
def test_read_data_register_count_2(self):
|
|||
|
|
"""测试读取2个寄存器的数据"""
|
|||
|
|
# 配置模拟对象
|
|||
|
|
self.mock_relay.modbus_client.connect.return_value = True
|
|||
|
|
|
|||
|
|
# 模拟读取结果 (高位寄存器=1,低位寄存器=0xE848,表示128000)
|
|||
|
|
mock_result = MagicMock()
|
|||
|
|
mock_result.registers = [1, 0xE848] # 1 * 65536 + 59464 = 125000
|
|||
|
|
self.mock_relay.modbus_client.read_holding_registers.return_value = mock_result
|
|||
|
|
|
|||
|
|
# 读取数据
|
|||
|
|
weight = self.transmitter.read_data(1)
|
|||
|
|
|
|||
|
|
# 验证结果 (125000 / 1000 = 125kg)
|
|||
|
|
self.assertEqual(weight, 125.0)
|
|||
|
|
|
|||
|
|
def test_read_data_register_count_1(self):
|
|||
|
|
"""测试读取1个寄存器的数据(模拟配置变更)"""
|
|||
|
|
# 临时修改配置以测试单寄存器读取
|
|||
|
|
self.transmitter.config[1]['register_count'] = 1
|
|||
|
|
|
|||
|
|
# 配置模拟对象
|
|||
|
|
self.mock_relay.modbus_client.connect.return_value = True
|
|||
|
|
|
|||
|
|
# 模拟读取结果
|
|||
|
|
mock_result = MagicMock()
|
|||
|
|
mock_result.registers = [1500] # 表示1500kg
|
|||
|
|
self.mock_relay.modbus_client.read_holding_registers.return_value = mock_result
|
|||
|
|
|
|||
|
|
# 读取数据
|
|||
|
|
weight = self.transmitter.read_data(1)
|
|||
|
|
|
|||
|
|
# 验证结果
|
|||
|
|
self.assertEqual(weight, 1500.0) # 1500kg
|
|||
|
|
|
|||
|
|
def test_read_data_invalid_register_count(self):
|
|||
|
|
"""测试不支持的寄存器数量"""
|
|||
|
|
# 临时修改配置以测试无效寄存器数量
|
|||
|
|
self.transmitter.config[1]['register_count'] = 3
|
|||
|
|
|
|||
|
|
# 配置模拟对象
|
|||
|
|
self.mock_relay.modbus_client.connect.return_value = True
|
|||
|
|
|
|||
|
|
# 模拟读取结果
|
|||
|
|
mock_result = MagicMock()
|
|||
|
|
mock_result.registers = [0, 0, 0]
|
|||
|
|
self.mock_relay.modbus_client.read_holding_registers.return_value = mock_result
|
|||
|
|
|
|||
|
|
# 读取数据
|
|||
|
|
weight = self.transmitter.read_data(1)
|
|||
|
|
|
|||
|
|
# 验证结果
|
|||
|
|
self.assertIsNone(weight)
|
|||
|
|
|
|||
|
|
def test_read_data_result_is_exception(self):
|
|||
|
|
"""测试读取结果为异常对象"""
|
|||
|
|
# 配置模拟对象
|
|||
|
|
self.mock_relay.modbus_client.connect.return_value = True
|
|||
|
|
self.mock_relay.modbus_client.read_holding_registers.return_value = Exception("读取错误")
|
|||
|
|
|
|||
|
|
# 读取数据
|
|||
|
|
weight = self.transmitter.read_data(1)
|
|||
|
|
|
|||
|
|
# 验证结果
|
|||
|
|
self.assertIsNone(weight)
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == '__main__':
|
|||
|
|
unittest.main()
|