news 2026/8/16 11:56:10

Pelco KBD300A 模拟器:19.pytest集成测试(serial + protocol + macro)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Pelco KBD300A 模拟器:19.pytest集成测试(serial + protocol + macro)

第 19 篇:集成测试(serial + protocol + macro)

现在是时候从单元测试逐步过渡到集成测试阶段了。

我们已经完成了核心纯逻辑模块(协议构建/解析、宏语法、模板渲染、日志发射、规则引擎、模拟器状态机等)的单元测试,覆盖率已经相当不错。接下来需要验证这些模块组合在一起时是否能正确协作,尤其是涉及串口 → 协议解析 → 命令分发 → 宏执行 → 协议构建 → 串口输出的完整链路。

以下是针对这个项目的集成测试规划建议(重点放在 serial + protocol + macro 链路),以及逐步实施路线。

集成测试目标(优先级排序)
优先级测试目标涉及模块链路建议测试类型难度
★★★★★1. 串口收发 → 协议解析 → 虚拟设备状态变化serial.worker + protocol + virtual_device模拟器集成
★★★★☆2. 宏命令 → 协议构建 → 串口发送macro.commands + protocol + serial.manager/workerMock串口发送
★★★★☆3. 完整宏脚本执行(包含循环/条件/延时)macro.engine + parser + commands + protocol模拟器 + Mock
★★★☆☆4. 报警规则触发 → 执行宏/动作alarm.rules + macro.engine + commands模拟器触发
★★★☆☆5. 键盘面板 → 宏/PTZ命令 → 协议 → 发送ui.keyboard.panel + serial + protocolUI + Mock串口
★★☆☆☆6. 真实串口收发(可选,后期)全链路 + 真实设备或两台电脑互连端到端很高
推荐的集成测试技术栈与工具
目的推荐工具/方式理由 / 优点
模拟串口pytest-mock+unittest.mockpyfake-serial无需真实硬件,最快、最干净、可控
协议层 Mock直接 mockserial.Serial.write/read验证协议构建与解析是否匹配
虚拟设备注入使用已有的VirtualDevice天然适合作为“下游”被测对象
宏执行环境 MockmockMacroCommands的硬件方法(如ptz_control隔离真实串口,专注宏逻辑
测试异步/线程pytest-asynciopytest-qt+QTimer处理SerialWorker的定时读取、宏引擎的QThread
UI 集成测试(可选后期)pytest-qt+qtbot可模拟按钮点击、摇杆拖动等,但前期可先跳过
逐步实施路线(大概 4~6 周完成核心部分)
第 1 周:搭建集成测试基础框架 + 模拟器闭环测试

目标:验证串口收到数据 → 解析 → VirtualDevice 状态变化 → 返回响应的完整链路

# tests/integration/test_simulator_loop.pyimportpytestfromunittest.mockimportMagicMock,patchfromcore.serial.workerimportSerialWorkerfromcore.simulator.virtual_deviceimportVirtualDevicefromcore.protocolimportget_protocol@pytest.fixturedefvirtual_device():returnVirtualDevice(cam_id=1)@pytest.fixturedefmock_serial():withpatch("serial.Serial")asmock_ser:mock_ser_instance=mock_ser.return_value mock_ser_instance.is_open=Truemock_ser_instance.read.side_effect=lambdasize:b""# 默认空yieldmock_ser_instancedeftest_receive_ptz_command_updates_virtual_device(qtbot,mock_serial,virtual_device):# 准备 Pelco-D 绝对移动命令(示例)cmd=bytes([0xFF,0x01,0x00,0x04,0x20,0x20,0x45])# pan 32, tilt 32# 模拟收到数据worker=SerialWorker(port="COM3",baud=9600,protocol="D")worker._ser=mock_serial worker._buffer=bytearray(cmd)# 注入虚拟设备处理逻辑(实际项目中可通过 dependency injection)protocol=get_protocol(worker,"D")protocol._virtual_device=virtual_device# 假设支持注入# 触发一次读取处理worker._process_buffer()status=virtual_device.get_status_dict()assert"pan"instatusassertabs(float(status["pan"][:-1])-32.0*some_scale_factor)<1.0# 根据实际比例断言
第 2~3 周:宏命令 → 协议构建 → 串口发送 集成

目标:运行简单宏 → 验证是否正确调用serial_mgr.write()并发出正确协议字节

# tests/integration/test_macro_to_serial.pyfromcore.macro.engineimportMacroEnginefromcore.macro.commandsimportMacroCommandsfromunittest.mockimportMagicMock@pytest.fixturedefmock_serial_manager():mgr=MagicMock()mgr.write=MagicMock()mgr.protocol="D"returnmgrdeftest_macro_ptz_move_generates_correct_packet(mock_serial_manager):engine=MacroEngine(mock_serial_manager)commands=MacroCommands(mock_serial_manager)script=""" ptz(1, 50, 30) # 摄像机1,pan 50, tilt 30 delay(100) stop_ptz(1) """engine.set_script(script)engine.run()# 验证是否调用了 write 两次(move + stop)assertmock_serial_manager.write.call_count>=2# 进一步断言发出的字节(Pelco-D 格式)first_call=mock_serial_manager.write.call_args_list[0]packet=first_call[0][0]assertpacket.startswith(b'\xFF')assertlen(packet)==7# ... 校验 checksum、cmd1/cmd2 等
第 4 周:完整宏脚本 + 虚拟设备闭环

目标:运行带循环/延时的宏脚本,验证虚拟设备状态最终是否符合预期

deftest_pattern_run_macro_updates_virtual_state():# 准备带 pattern_run 的脚本script=""" pattern_run(1, 2) delay(5000) pattern_stop(1, 2) """device=VirtualDevice(1)engine=MacroEngine(mock_serial_manager_with_virtual_device)# 注入虚拟设备engine.commands._virtual_device=device engine.set_script(script)engine.run()# 等待宏执行完成(可使用 qtbot.wait + 信号)# 断言 device.pattern_running == False 等状态
第 5 周:报警规则 + 宏联动集成
# tests/integration/test_alarm_macro_linkage.pydeftest_alarm_triggers_macro():rules=load_alarm_rules()# 模拟收到报警码 1002execute_alarm_action(app_window_mock,1002,rules)# 验证是否调用了 MacroEngine.run("emergency_shutdown.macro")
总结建议
  1. 优先级最高:先把模拟器闭环(收 → 解析 → 虚拟设备状态 → 响应)做通,这是最有价值的集成验证点。
  2. 第二优先:宏 → 协议构建 → Mock 串口发送(验证协议正确性)。
  3. 第三阶段:完整宏脚本 + 虚拟设备状态断言(最接近真实使用场景)。
  4. 工具推荐pytest+pytest-mock+pytest-qt(如果涉及 UI) +pytest-timeout(防止死循环)。
  5. 测试数据:准备一套标准化的 Pelco-D/P 命令字节样本(至少 20~30 种常见命令)作为 fixture。

👉上一篇 :按依赖顺序 + 复杂度由低到高逐步推进pytest单元测试

👉总目录:Python开发软键盘全程总览

👉下一篇:搭建pytest集成测试基础框架 + 模拟器闭环测试

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/16 13:37:56

1 篇看懂:以太网多参量传感器为什么能适配所有工业场景?

在工业智能化转型中&#xff0c;环境与设备监测的核心痛点是 “场景差异大、需求碎片化”—— 化工车间要防有毒气体泄漏&#xff0c;数据中心需稳控温湿度&#xff0c;仓储库房要适配多品类存储环境&#xff0c;传统单一功能传感器难以兼顾。而以太网多参量传感器凭借 “全功能…

作者头像 李华
网站建设 2026/8/16 7:44:19

不只是替代谷歌:为你带来新视角的11个搜索引擎与核心价值解析

如果你正在寻找一个替代谷歌的搜索引擎&#xff0c;你来对地方了。 读完本指南后&#xff0c;你将知道哪些是最佳的替代搜索引擎。以及为什么每个搜索引擎都可能更适合你。 我们开始吧。 1. Bing 如果你想要类似谷歌的搜索体验&#xff0c;并借助OpenAI驱动的AI结果&#xff0c…

作者头像 李华
网站建设 2026/8/9 7:24:08

springboot演唱会售票管理系统设计实现

背景分析 演唱会售票管理系统源于传统票务管理的低效与痛点。线下售票存在排队拥堵、黄牛倒票、数据统计滞后等问题&#xff1b;线上分散平台导致信息不透明、跨平台购票体验差。SpringBoot框架的成熟技术栈为系统开发提供了高效解决方案&#xff0c;其模块化设计、自动化配置…

作者头像 李华
网站建设 2026/8/14 1:15:41

基于springboot的水务管理系统设计实现

背景分析水务管理系统是智慧城市建设的重要组成部分&#xff0c;传统水务管理依赖人工记录和纸质档案&#xff0c;存在效率低、数据易丢失、响应滞后等问题。随着城市化进程加快&#xff0c;水资源供需矛盾加剧&#xff0c;亟需通过信息化手段提升水务管理能力。SpringBoot框架…

作者头像 李华
网站建设 2026/8/16 3:14:27

Canoga Perkins将突破型专用5G技术引入墨西哥克雷塔罗BLOQUE创新中心

作为全球领先的专用5G网络连接解决方案提供商&#xff0c;Canoga Perkins宣布在墨西哥克雷塔罗BLOQUE创新中心正式设立其首个海外专用5G客户体验中心。2026年1月16日&#xff0c;公司在“Experiencing SyncMetra”活动期间&#xff0c;现场演示了SyncMetra 100产品以及完整的端…

作者头像 李华
网站建设 2026/8/9 13:42:37

超声波深度测量仪设计与实现

超声波深度测量仪设计与实现 一、设计背景与意义 超声波深度测量在水文监测、工业液位控制、水产养殖、污水处理等领域具有不可替代的作用。传统深度测量方法&#xff08;如浮标法、机械探测法&#xff09;存在操作复杂、测量滞后、易受环境干扰等问题&#xff0c;现有超声波…

作者头像 李华