news 2026/4/17 2:57:22

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/4/9 21:55:41

机械制造WebUploader如何在局域网处理大文件断点续传?

《一个码农的奇幻外包漂流记》 需求分析会:当甲方爸爸说出"简单"二字时… 各位老铁们好!我是辽宁沈阳一名"资深"前端码农(资深头发少)。刚接到个外包需求,看完后我直接表演了个东北式懵逼&#…

作者头像 李华
网站建设 2026/4/14 19:39:03

刚刚,谷歌DeepMind登Nature封面!人类40亿年生命代码「开源」了

今天Nature封面,属于谷歌DeepMind!生命,是一场长达40亿年代码迭代。现在,AlphaGenome破解98%基因暗物质,开启了人类「删除」疾病代码的上帝模式。今天,谷歌AlphaGenome登上了Nature封面!去年5月…

作者头像 李华
网站建设 2026/4/13 15:23:17

图片处理神器!一键漂白去底超好用

下载链接 https://pan.freedw.com/s/OjJHWM 今天发现个超好用的图片处理工具ImgTool,完全免费还没广告,再也不用为图片处理发愁了! 软件不用安装,双击就能直接用。最实用的就是裁剪功能,手机拍歪的图片拉一下四个角就…

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

计算机毕业设计springboot牙科诊所预约管理系统 基于SpringBoot的口腔门诊在线预约服务平台 基于SpringBoot的齿科诊疗预约与病历档案管理系统

计算机毕业设计springboot牙科诊所预约管理系统221734fg (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着现代生活节奏的加快,公众对口腔健康的重视程度日益提升&…

作者头像 李华
网站建设 2026/4/16 2:09:33

计算机毕业设计springboot花店管理系统 基于SpringBoot的鲜花零售管理平台 全链路鲜花库存与订单一体化系统

计算机毕业设计springboot花店管理系统4kj74(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 当线下花店遇上“即买即送”的消费节奏,传统手写单据、电话订花、人工盘…

作者头像 李华