news 2026/5/6 18:48:46

Pelco KBD300A 模拟器:18. 按依赖顺序 + 复杂度由低到高逐步推进pytest单元测试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Pelco KBD300A 模拟器:18. 按依赖顺序 + 复杂度由低到高逐步推进pytest单元测试

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

我们采用“依赖顺序 + 复杂度由低到高”的策略组织单元测试,确保底层模块先通过测试,上层模块再依赖可靠的基础。测试优先覆盖纯函数、无外部依赖的模块,再逐步扩展到涉及线程、信号、文件 I/O、模拟器等复杂模块。

测试模块顺序(依赖与复杂度递增)

  1. core/protocol/pelco_protocol.py—— 最基础纯函数,无外部依赖
  2. core/macro/standard.py—— CommandValidator、范围校验
  3. core/alarm/rules.py—— load/save/execute
  4. core/macro/parser.py—— lexer/parser
  5. core/template/renderer.py—— 模板渲染
  6. core/utils/log_emitter.py—— 信号、缓冲区
  7. core/macro/commands.py—— 命令执行核心
  8. core/macro/engine.py—— 宏执行引擎
  9. core/serial/protocol.py—— 帧提取与解析
  10. core/serial/manager.py + worker.py—— 串口管理与线程
  11. core/template/library.py—— 模板文件管理
  12. core/simulator/virtual_device.py—— 模拟器状态机

18.1 core/protocol/pelco_protocol.py 单元测试

测试文件tests/unit/test_pelco_protocol.py
覆盖要点

  • build_pelco_d / build_pelco_p(不同参数组合)
  • parse_pelco_packet(D/P 协议自动识别、PTZ、预置位、AUX、校验和错误、未知命令)
  • 9 字节变体兼容性(若启用)
  • 边界值与非法帧处理

运行命令

pytest tests/unit/test_pelco_protocol.py -v --tb=short

预期:所有测试用例通过,显示具体参数化测试名称及 PASS。

18.2 core/macro/standard.py 单元测试

测试文件tests/unit/test_standard.py
覆盖要点

  • 常量、枚举完整性
  • COMMAND_SPECS 结构校验
  • validate_command:正常、未知命令、参数数量/类型/范围错误(E001~E004)
  • 可选参数处理(cam_id 默认值)
  • 静态方法:get_command_spec、list_all_commands、get_commands_by_category
  • 边界值(speed ±100、preset 1~255、aux 1~8)

运行命令

pytest tests/unit/test_standard.py -v --tb=short

预期:约 20+ 个测试全部通过。

18.3 core/alarm/rules.py 单元测试

测试文件tests/unit/test_alarm_rules.py
覆盖要点

  • load_alarm_rules / save_alarm_rules(文件读写、空文件、异常处理)
  • execute_alarm_action(不同 action 类型:run_macro、load_template、notify、ack 等)
  • 规则过滤(enabled、alarm_code 匹配)
  • 最后触发时间更新

运行命令

pytest tests/unit/test_alarm_rules.py -v --tb=short

预期:全部通过(含 mock 文件 I/O 和动作执行)。

18.4 core/macro/parser.py 单元测试

测试文件tests/unit/test_parser.py
覆盖要点

  • Lexer:token 识别(数字、ID、字符串、注释、符号)
  • Parser:简单命令、字符串、变量、loop、for、if/else、嵌套结构
  • 语法错误恢复(不崩溃,返回部分 AST)
  • 位置信息(line/column)准确性

运行命令

pytest tests/unit/test_parser.py -v --tb=short

18.5 core/template/renderer.py 单元测试

测试文件tests/unit/test_renderer.py
覆盖要点

  • {{{name}}} → 原始值替换
  • {{name}} → 类型转换(int/float → 数字字符串、bool → “true”/“false”、str → 加引号)
  • 缺少参数 → ValueError + 日志
  • 空参数字典 → 返回原始脚本

运行命令

pytest tests/unit/test_renderer.py -v --tb=short

18.6 core/utils/log_emitter.py 单元测试

测试文件tests/unit/test_log_emitter.py
覆盖要点

  • 单例模式(get_log_emitter 返回同一实例)
  • 各日志方法(info、warning、error、send、receive、simulator、alarm)信号发射
  • 缓冲区机制(use_buffer=True 时进入缓冲,flush 后触发 logs_batch)
  • error 触发 error_occurred 信号
  • 非法日志类型自动转为 info

运行命令

pytest tests/unit/test_log_emitter.py -v --tb=short

18.7 core/macro/commands.py 单元测试

测试文件tests/unit/test_commands.py
覆盖要点

  • 各 cmd_xxx 方法(ptz_control、zoom、focus、iris、preset、aux、pattern 等)
  • 参数验证(CommandValidator)
  • 默认 cam_id 处理
  • 执行日志记录
  • 异常情况(未知命令、无效参数)

运行命令

pytest tests/unit/test_commands.py -v --cov=core/macro/commands --cov-report=term-missing

18.8 core/macro/engine.py 单元测试

测试文件tests/unit/test_macro_engine.py
覆盖要点

  • 生命周期(init、set_script、run、stop、pause/resume)
  • AST 执行(命令、loop、for、if)
  • 信号(started、stopped、error、progress、command_executed)
  • 进度计算、检查点、缓存
  • 异常安全与日志

运行命令

pytest tests/unit/test_macro_engine.py -v --tb=short

18.9 core/serial/protocol.py 单元测试

测试文件tests/unit/test_serial_protocol.py
覆盖要点

  • detect_protocol(D/P/未知)
  • extract_frame(完整帧、不完整、校验失败)
  • parse_frame(PTZ、zoom、preset、query、错误帧、Pelco-P 未知命令)
  • 校验和验证

运行命令

pytest tests/unit/test_serial_protocol.py -v --tb=short

18.10 core/serial/manager.py + worker.py 单元测试

测试文件tests/unit/test_serial_manager_worker.py
覆盖要点

  • open/close/write/is_open
  • 信号转发(opened、closed、error、data_received、parsed_received)
  • 默认 cam_id 同步到控制方法

运行命令

pytest tests/unit/test_serial_manager_worker.py -v --tb=short

18.11 core/template/library.py 单元测试

测试文件tests/unit/test_template_library.py
覆盖要点

  • load/save(JSON 读写、异常处理)
  • find(存在/不存在)
  • _validate_template(合法/非法结构)
  • _create_default_templates
  • 缓存机制(首次加载后复用)

运行命令

pytest tests/unit/test_template_library.py -v --tb=short

18.12 core/simulator/virtual_device.py 单元测试

测试文件tests/unit/test_virtual_device.py
覆盖要点

  • process_command(ACK、查询响应、错误响应)
  • update_from_command(PTZ、zoom、focus、iris、aux)
  • generate_response(各查询类型)
  • 状态范围限制(pan/tilt/zoom)

运行命令

pytest tests/unit/test_virtual_device.py -v --tb=short

测试执行建议

  • 按顺序运行上述测试文件,确保底层模块先通过。
  • 使用--cov生成覆盖率报告,关注未覆盖分支。
  • 所有测试均使用 mock 避免真实串口/文件依赖,保证快速稳定。
  • 通过后可继续集成测试(serial + protocol + macro)。

下一阶段:完成以上单元测试后,我们进入集成测试阶段。

👉上一篇 :按照pytest自动化测试方案规划建立测试基础框架
👉总目录:Python开发软键盘全程总览
👉下一篇

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

计算机毕业设计springboot汝瓷博物馆在线预约系统 基于SpringBoot框架的汝瓷文化数字展馆预约管理平台 汝窑陶瓷博物馆智慧票务与参观预约系统

计算机毕业设计springboot汝瓷博物馆在线预约系统d6sz474j (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着数字技术与传统文化产业的深度融合,博物馆正加速向智…

作者头像 李华
网站建设 2026/5/1 17:26:31

AI Agent智能体技术发展报告:技术突破、产业落地与未来趋势

摘要:本报告基于全球行业数据与中美实践案例,揭秘AI Agent从“自动化工具”到“自主智能体”的核心演进逻辑——2025年作为元年,基座大模型升级、多智能体协同成主流,金融、工业、客服等多行业落地提速,为开发者、企业…

作者头像 李华
网站建设 2026/5/3 4:57:08

2026年美股API测评:如何选择合适的数据接口?

随着金融技术的迅速发展,API已经成为开发者和金融分析师不可或缺的工具,特别是在进行量化交易、股票分析或开发金融应用时。稳定、实时的数据接口在这些应用中起着至关重要的作用。选择一个合适的美股数据API,不仅能确保数据的实时性&#xf…

作者头像 李华
网站建设 2026/4/30 18:40:13

Git MCP

在TRAE国际版中集成并使用Git MCP,核心是将其视为一个智能的、能理解你项目上下文的自动化助手。它负责处理与版本控制相关的常规操作,让你更专注于代码逻辑和创意本身。可以把Git MCP想象成一个熟练的图书管理员。你只需要告诉他你的意图(比…

作者头像 李华
网站建设 2026/5/6 11:44:16

Blender MCP

要让Blender和TRAE里的AI对话,关键在于Blender MCP。它相当于一个“翻译官”,把你用文字描述的想法(比如“建一个小屋”)转换成Blender软件能听懂的指令。 配置Blender MCP 整个过程需要两端准备:Blender软件和TRAE编…

作者头像 李华
网站建设 2026/5/4 17:04:48

困在系统里的酒店,你不知道的携程垄断练成史

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / 卷圈 监制 / 姝琦 封面 / 姝琦 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 我们从携程最近的反垄断风波切入,深扒了这家中国OTA巨头二十多年的发家史。从最初的“携程四君子”在饭馆儿凑出…

作者头像 李华