Files
Feeding_control_system/tests/test_transmitter_controller.py
2025-09-29 09:19:30 +08:00

165 lines
6.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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