2026/6/20 9:56:33
网站建设
项目流程
手机端网站需要多少钱,sns网站是什么,一级造价师准考证打印时间,wordpress主题dux3.0第16篇. 项目硬件相关测试的 Mock 技巧详解
本项目是一个 Pelco KBD300A 键盘模拟器 Pelco-D/Pelco-P 协议维护工具#xff0c;核心硬件交互集中在#xff1a;
串口通信#xff08;core/serial/ 模块#xff09;#xff1a;真实场景下使用 pySerial 操作 COM 端口。Pel…第16篇. 项目硬件相关测试的 Mock 技巧详解本项目是一个Pelco KBD300A 键盘模拟器 Pelco-D/Pelco-P 协议维护工具核心硬件交互集中在串口通信core/serial/模块真实场景下使用pySerial操作 COM 端口。Pelco 协议命令/响应core/protocol/、core/pelco_protocol.py发送控制命令接收设备反馈位置、报警、状态查询等。设备状态变化云台、镜头、预置位、轨迹、辅助开关、报警等。由于这些功能依赖真实硬件球机、矩阵、键盘在单元测试、CI/CD 或开发机上无法直接连接硬件因此必须使用Mock技术隔离硬件依赖。项目本身已经内置了非常完善的模拟设施core/simulator/virtual_device.py这大大降低了 Mock 难度。下面按场景详细介绍推荐的 Mock 技巧。1. 最推荐方式直接使用内置 VirtualDevice零侵入式 Mock项目核心已经实现了完整的虚拟摄像机状态机VirtualDevice它具备以下特性维护完整的设备状态pan/tilt/zoom/focus/iris/aux/alarm 等。process_command(data: bytes) - Optional[bytes]接收 Pelco 命令字节返回模拟响应字节完全符合真实设备行为。支持查询响应Sense 请求、报警触发、位置反馈等。完全独立于真实串口可在纯内存中运行。使用方式推荐在测试中直接注入fromcore.simulator.virtual_deviceimportVirtualDevicefromunittest.mockimportMagicMock,patchclassTestPTZControl:defsetup_method(self):# 创建虚拟设备模拟摄像机 ID1self.deviceVirtualDevice(cam_id1)# Mock SerialManager 的 write 方法让它把数据转发给 VirtualDeviceself.mock_serialMagicMock()deffake_write(data:bytes):responseself.device.process_command(data)ifresponse:# 模拟收到响应触发 parsed_received 等信号self.mock_serial.parsed_received.emit({raw:response,parsed:...})self.mock_serial.write.side_effectfake_write# 或者直接替换 SerialManager 中的 serial_mgr 为 mockself.serial_mgrSerialManager(...)# 正常创建self.serial_mgr._worker._serself.mock_serial# 替换底层 serialdeftest_ptz_move(self):fromcore.protocolimportptz_control# 发送 PTZ 移动命令ptz_control(self.serial_mgr,cam_id1,pan_speed50,tilt_speed30)# 断言设备状态已变化assertabs(self.device.pan-50*0.1)0.01# 模拟速度积分项目内部有时间步进assertabs(self.device.tilt-30*0.1)0.01# 断言产生了响应如果有查询assertself.mock_serial.write.called优点完全模拟真实设备行为包括报警、位置反馈、查询响应。无需额外库项目原生支持。可用于宏执行测试、协议测试、报警联动测试。2. Mock pySerial适用于测试 SerialWorker / SerialManager当需要测试串口读写线程、缓冲区管理、帧提取逻辑时可以完全 Mockserial.Serial。fromunittest.mockimportpatch,MagicMockimportserialpatch(serial.Serial)deftest_serial_worker_read(mock_serial_class):# Mock 串口实例mock_serMagicMock()mock_ser.is_openTruemock_ser.in_waiting10mock_ser.read.return_valuebytes([0xFF,0x01,0x00,0x07,0x20,0x40,0x68])# 一个完整的 Pelco-D 命令mock_serial_class.return_valuemock_ser# 创建 SerialWorker会使用 mock 的 SerialworkerSerialWorker(portCOM1,baud9600,...)# 触发一次读取worker._read_data()# 断言解析信号被发射worker.parsed_received.emit.assert_called()# 或检查日志关键点项目在worker.py中有try: import serial except: serial None所以在无 serial 环境下也能运行测试。使用patch(core.serial.worker.serial.Serial)精确控制导入位置。可模拟超时、断开、乱序数据等异常场景。3. Mock 协议工厂与协议实例测试协议切换项目使用工厂模式get_protocol(serial_mgr, protocol_type)返回 PelcoD/PelcoP 实例。patch(core.protocol.__init__.get_protocol)deftest_protocol_switch(mock_get_protocol):mock_protocolMagicMock()mock_get_protocol.return_valuemock_protocol# 执行切换协议操作serial_mgr.protocolP# 断言调用了正确的协议实例mock_get_protocol.assert_called_with(serial_mgr,P)# 测试命令发送serial_mgr.ptz_move(1,50,30)mock_protocol.ptz_control.assert_called()4. 集成测试Mock 整个 SerialManager 用于宏/模板执行宏执行引擎MacroEngine依赖SerialManager。测试宏时可注入 Mock 管理器deftest_macro_with_virtual_device():deviceVirtualDevice(cam_id1)mock_mgrMagicMock()defwrite_cmd(data):respdevice.process_command(data)ifresp:mock_mgr.data_received.emit(resp)# 模拟收到响应mock_mgr.write.side_effectwrite_cmd# 创建宏引擎engineMacroEngine(mock_mgr,cam_id1)script call_preset(1, 10) delay(100) ptz_move(1, 50, 30) delay(500) ptz_stop(1) engine.set_and_run(script)# 断言预置位被调用、PTZ 状态变化assertdevice.last_preset10assertdevice.pan05. 其他高级技巧时间加速VirtualDevice 的状态更新依赖time步进可 patchtime.sleep为瞬间返回加速长延时宏测试。报警测试调用device.simulate_alarm(0x01)触发报警验证execute_alarm_action被调用。响应注入在测试接收解析时直接调用worker._process_buffer(bytes_data)注入自定义帧。pytest fixture建议封装一个 fixture 返回预配置的VirtualDevice Mock SerialManager所有测试复用。总结推荐策略测试目标推荐 Mock 方式理由协议命令/响应VirtualDevice.process_command最真实、最完整宏/模板执行注入 Mock SerialManager VirtualDevice覆盖完整执行路径串口读写线程、缓冲区patch serial.Serial隔离底层 IO协议切换、工厂逻辑patch get_protocol验证切换逻辑报警联动、查询响应VirtualDevice.simulate_alarm / query直接触发状态变化项目对硬件依赖的解耦做得非常好VirtualDevice 工厂模式几乎所有硬件相关功能都可以通过内置模拟器进行无硬件的高保真测试。这是本项目测试友好性的最大亮点。上一篇总目录下一篇