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

161 lines
5.8 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.inverter import InverterController
from pymodbus.exceptions import ModbusException
class TestInverterController(unittest.TestCase):
def setUp(self):
"""测试前的准备工作"""
# 创建模拟的继电器控制器
self.mock_relay = MagicMock()
self.mock_relay.modbus_client = MagicMock()
# 创建变频器控制器实例
self.inverter = InverterController(relay_controller=self.mock_relay)
def test_inverter_initialization(self):
"""测试变频器控制器初始化"""
self.assertEqual(self.inverter.relay_controller, self.mock_relay)
self.assertEqual(self.inverter.max_frequency, 400.0)
# 检查配置
self.assertIn('slave_id', self.inverter.config)
self.assertIn('frequency_register', self.inverter.config)
self.assertIn('start_register', self.inverter.config)
self.assertIn('stop_register', self.inverter.config)
self.assertIn('start_command', self.inverter.config)
self.assertIn('stop_command', self.inverter.config)
def test_set_frequency_success(self):
"""测试设置频率成功"""
# 配置模拟对象
self.mock_relay.modbus_client.connect.return_value = True
mock_result = MagicMock()
self.mock_relay.modbus_client.write_register.return_value = mock_result
# 设置频率
result = self.inverter.set_frequency(200.0)
# 验证调用
self.mock_relay.modbus_client.connect.assert_called_once()
self.mock_relay.modbus_client.write_register.assert_called_once()
self.assertTrue(result)
def test_set_frequency_connection_failed(self):
"""测试设置频率时连接失败"""
# 配置模拟对象
self.mock_relay.modbus_client.connect.return_value = False
# 设置频率
result = self.inverter.set_frequency(200.0)
# 验证结果
self.assertFalse(result)
self.mock_relay.modbus_client.connect.assert_called_once()
self.mock_relay.modbus_client.write_register.assert_not_called()
def test_set_frequency_modbus_exception(self):
"""测试设置频率时Modbus异常"""
# 配置模拟对象
self.mock_relay.modbus_client.connect.return_value = True
self.mock_relay.modbus_client.write_register.side_effect = ModbusException("Modbus错误")
# 设置频率
result = self.inverter.set_frequency(200.0)
# 验证结果
self.assertFalse(result)
def test_set_frequency_value_clamping(self):
"""测试频率值限制"""
# 配置模拟对象
self.mock_relay.modbus_client.connect.return_value = True
mock_result = MagicMock()
self.mock_relay.modbus_client.write_register.return_value = mock_result
# 测试超过最大值的频率
result = self.inverter.set_frequency(500.0) # 超过400.0最大值
# 验证调用
self.assertTrue(result)
self.mock_relay.modbus_client.write_register.assert_called_once()
def test_control_start_success(self):
"""测试启动变频器成功"""
# 配置模拟对象
self.mock_relay.modbus_client.connect.return_value = True
mock_result = MagicMock()
self.mock_relay.modbus_client.write_register.return_value = mock_result
# 启动变频器
result = self.inverter.control('start')
# 验证调用
self.assertTrue(result)
self.mock_relay.modbus_client.connect.assert_called_once()
self.mock_relay.modbus_client.write_register.assert_called_once()
def test_control_stop_success(self):
"""测试停止变频器成功"""
# 配置模拟对象
self.mock_relay.modbus_client.connect.return_value = True
mock_result = MagicMock()
self.mock_relay.modbus_client.write_register.return_value = mock_result
# 停止变频器
result = self.inverter.control('stop')
# 验证调用
self.assertTrue(result)
self.mock_relay.modbus_client.connect.assert_called_once()
self.mock_relay.modbus_client.write_register.assert_called_once()
def test_control_invalid_action(self):
"""测试无效的控制动作"""
# 配置模拟对象
self.mock_relay.modbus_client.connect.return_value = True
# 使用无效动作
result = self.inverter.control('invalid_action')
# 验证结果
self.assertFalse(result)
self.mock_relay.modbus_client.connect.assert_not_called()
self.mock_relay.modbus_client.write_register.assert_not_called()
def test_control_connection_failed(self):
"""测试控制时连接失败"""
# 配置模拟对象
self.mock_relay.modbus_client.connect.return_value = False
# 启动变频器
result = self.inverter.control('start')
# 验证结果
self.assertFalse(result)
self.mock_relay.modbus_client.connect.assert_called_once()
self.mock_relay.modbus_client.write_register.assert_not_called()
def test_control_modbus_exception(self):
"""测试控制时Modbus异常"""
# 配置模拟对象
self.mock_relay.modbus_client.connect.return_value = True
self.mock_relay.modbus_client.write_register.side_effect = ModbusException("Modbus错误")
# 启动变频器
result = self.inverter.control('start')
# 验证结果
self.assertFalse(result)
if __name__ == '__main__':
unittest.main()