Files
Feeding_control_system/tests/test_transmitter_controller.py

165 lines
6.0 KiB
Python
Raw Permalink Normal View History

2025-09-29 09:19:30 +08:00
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()