核心内容摘要
突破教育资源获取瓶颈:国家中小学智慧教育平台电子课本解析工具全攻略
第 19 篇集成测试serial protocol macro现在是时候从单元测试逐步过渡到集成测试阶段了。
我们已经完成了核心纯逻辑模块协议构建/解析、宏语法、模板渲染、日志发射、规则引擎、模拟器状态机等的单元测试覆盖率已经相当不错。
接下来需要验证这些模块组合在一起时是否能正确协作尤其是涉及串口 → 协议解析 → 命令分发 → 宏执行 → 协议构建 → 串口输出的完整链路。
以下是针对这个项目的集成测试规划建议重点放在 serial protocol macro 链路以及逐步实施路线。
集成测试目标优先级排序优先级测试目标涉及模块链路建议测试类型难度★★★★★
串口收发 → 协议解析 → 虚拟设备状态变化serial.worker protocol virtual_device模拟器集成中★★★★☆
宏命令 → 协议构建 → 串口发送macro.commands protocol serial.manager/workerMock串口发送中★★★★☆
完整宏脚本执行包含循环/条件/延时macro.engine parser commands protocol模拟器 Mock高★★★☆☆
报警规则触发 → 执行宏/动作alarm.rules macro.engine commands模拟器触发中★★★☆☆
键盘面板 → 宏/PTZ命令 → 协议 → 发送ui.keyboard.panel serial protocolUI Mock串口高★★☆☆☆
真实串口收发可选后期全链路 真实设备或两台电脑互连端到端很高推荐的集成测试技术栈与工具目的推荐工具/方式理由 / 优点模拟串口pytest-mockunittest.mock或pyfake-serial无需真实硬件最快、最干净、可控协议层 Mock直接 mockserial.Serial.write/read验证协议构建与解析是否匹配虚拟设备注入使用已有的VirtualDevice天然适合作为“下游”被测对象宏执行环境 MockmockMacroCommands的硬件方法如ptz_control隔离真实串口专注宏逻辑测试异步/线程pytest-asyncio或pytest-qtQTimer处理SerialWorker的定时读取、宏引擎的QThreadUI 集成测试可选后期pytest-qtqtbot可模拟按钮点击、摇杆拖动等但前期可先跳过逐步实施路线大概 4~6 周完成核心部分第 1 周搭建集成测试基础框架 模拟器闭环测试目标验证串口收到数据 → 解析 → VirtualDevice 状态变化 → 返回响应的完整链路# tests/integration/test_simulator_loop.pyimportpytestfromunittest.mockimportMagicMock,patchfromcore.serial.workerimportSerialWorkerfromcore.simulator.virtual_deviceimportVirtualDevicefromcore.protocolimportget_protocolpytest.fixturedefvirtual_device():returnVirtualDevice(cam_id
pytest.fixturedefmock_serial():withpatch(serial.Serial)asmock_ser:mock_ser_instancemock_ser.return_value mock_ser_instance.is_openTruemock_ser_instance.read.side_effectlambdasize:b# 默认空yieldmock_ser_instancedeftest_receive_ptz_command_updates_virtual_device(qtbot,mock_serial,virtual_device):# 准备 Pelco-D 绝对移动命令示例cmdbytes([0xFF,0x01,0x00,0x04,0x20,0x20,0x45])# pan 32, tilt 32# 模拟收到数据workerSerialWorker(portCOM3,baud9600,protocolD)worker._sermock_serial worker._bufferbytearray(cmd)# 注入虚拟设备处理逻辑实际项目中可通过 dependency injectionprotocolget_protocol(worker,D)protocol._virtual_devicevirtual_device# 假设支持注入# 触发一次读取处理worker._process_buffer()statusvirtual_device.get_status_dict()assertpaninstatusassertabs(float(status[pan][:-1])-
3
0*some_scale_factor)
0# 根据实际比例断言第 2~3 周宏命令 → 协议构建 → 串口发送 集成目标运行简单宏 → 验证是否正确调用serial_mgr.write()并发出正确协议字节# tests/integration/test_macro_to_serial.pyfromcore.macro.engineimportMacroEnginefromcore.macro.commandsimportMacroCommandsfromunittest.mockimportMagicMockpytest.fixturedefmock_serial_manager():mgrMagicMock()mgr.writeMagicMock()mgr.protocolDreturnmgrdeftest_macro_ptz_move_generates_correct_packet(mock_serial_manager):engineMacroEngine(mock_serial_manager)commandsMacroCommands(mock_serial_manager)script ptz(1, 50,
# 摄像机1pan 50, tilt 30 delay(
stop_ptz(
engine.set_script(script)engine.run()# 验证是否调用了 write 两次move stopassertmock_serial_manager.write.call_count2# 进一步断言发出的字节Pelco-D 格式first_callmock_serial_manager.write.call_args_list[0]packetfirst_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,
delay(
pattern_stop(1,
deviceVirtualDevice(
engineMacroEngine(mock_serial_manager_with_virtual_device)# 注入虚拟设备engine.commands._virtual_devicedevice engine.set_script(script)engine.run()# 等待宏执行完成可使用 qtbot.wait 信号# 断言 device.pattern_running False 等状态第 5 周报警规则 宏联动集成# tests/integration/test_alarm_macro_linkage.pydeftest_alarm_triggers_macro():rulesload_alarm_rules()# 模拟收到报警码 1002execute_alarm_action(app_window_mock,1002,rules)# 验证是否调用了 MacroEngine.run(emergency_shutdown.macro)
总结建议优先级最高先把模拟器闭环收 → 解析 → 虚拟设备状态 → 响应做通这是最有价值的集成验证点。
第二优先宏 → 协议构建 → Mock 串口发送验证协议正确性。
第三阶段完整宏脚本 虚拟设备状态断言最接近真实使用场景。
工具推荐pytestpytest-mockpytest-qt如果涉及 UI pytest-timeout防止死循环。
测试数据准备一套标准化的 Pelco-D/P 命令字节样本至少 20~30 种常见命令作为 fixture。
上一篇 按依赖顺序 复杂度由低到高逐步推进pytest单元测试总目录Python开发软键盘全程总览下一篇搭建pytest集成测试基础框架 模拟器闭环测试