161 lines
5.8 KiB
Python
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()
|