当前位置: 首页 > news >正文

Pelco KBD300A 模拟器:TEST02.重构后键盘部分的测试操作一步一步详细指导

TEST02.重构后键盘部分的测试操作一步一步详细指导

在上一篇《重构后键盘部分的测试方案规划》中,我们从宏观角度梳理了测试的整体思路:为什么要测、测什么、覆盖率目标以及测试分类。那篇文章更像是一份蓝图,帮助我们建立测试体系的战略方向。

本篇《重构后键盘部分的测试操作一步一步详细指导》则承接前文,聚焦于具体的落地实践。我们将从环境准备开始,逐步讲解如何编写单元测试、集成测试、端到端测试,并补充手动验证环节。目标是让读者不仅理解测试的重要性,还能亲手跑通整个流程,获得可量化的覆盖率结果。预计耗时 2–4 小时,适合在 Windows 7 环境下完整演练。

前提:项目已克隆到本地,Python 3.7 环境激活,pyserial/PyQt5 已安装。Win7 注意:用管理员运行命令提示符,避免权限问题。


步骤1:环境准备(10–15 分钟)

  1. 安装测试依赖

    • 打开命令提示符(cmd.exe),导航到项目根目录。

    • 创建/激活 virtualenv(推荐,避免全局污染):

      python-mvenv venv venv\Scripts\activate
    • 安装依赖(requirements.txt 已含 PyQt5/pyserial,再加测试工具):

      pipinstallpytest==7.4.0 pytest-qt==4.4.0coverage==6.5.0

      (这些版本兼容 Python 3.7 和 Win7,无高版本依赖冲突。)

  2. 创建 tests/ 目录和测试文件

    • 在项目根新建tests/keyboard/

    • 添加示例测试文件(从规划复制,稍后详述)。初始结构如下:

      tests/ ├── keyboard/ │ ├── test_panel.py # 单元:按键 / LCD │ ├── test_integration.py # 集成:信号 + 串口 mock ├── analyze_coverage.py # 覆盖率分析脚本 ├── test_e2e.py # 端到端:全链路 └── conftest.py # 全局 fixtures(如 QApplication)

      简短的说明表格:

      文件/目录作用说明
      keyboard/键盘相关测试模块目录
      test_panel.py单元测试:按键输入、LCD 显示
      test_integration.py集成测试:信号与串口交互
      test_e2e.py端到端测试:完整链路验证
      analyze_coverage.py覆盖率分析辅助脚本
      conftest.py全局 pytest fixtures(QApplication 等)
  3. 添加 conftest.py(全局 fixture)

    # tests/conftest.py# 全局 fixture 配置importsysimportosimportpytestfromPyQt5.QtWidgetsimportQApplicationfromunittest.mockimportMagicMock# 添加项目根目录到 sys.path(tests/ 的上两级)project_root=os.path.abspath(os.path.join(os.path.dirname(__file__),'..'))ifproject_rootnotinsys.path:sys.path.insert(0,project_root)@pytest.fixture(scope="session")defqapp():""" 全局 QApplication fixture,整个测试会话只初始化一次。 """app=QApplication.instance()orQApplication([])yieldapp app.quit()@pytest.fixturedefapp_window(qapp):""" 提供一个完整的 AppWindow 实例,并在测试结束后自动关闭。 避免在各个测试文件中重复定义。 """fromui.main_windowimportAppWindow win=AppWindow()win.show()qapp.processEvents()yieldwin win.close()@pytest.fixturedefkeyboard_panel(qapp):""" 提供一个独立的 KeyboardPanel 实例,用于单元测试。 """fromui.keyboard.panelimportKeyboardPanel panel=KeyboardPanel()qapp.processEvents()yieldpanel panel.close()

    这样,所有测试文件都可以直接使用qappfixture,而无需重复初始化 QApplication。

  4. 添加 analyze_coverage.py(覆盖率分析辅助脚本)

    # tests/analyze_coverage.pyimportjsondefmain():withopen("coverage.json","r",encoding="utf-8")asf:data=json.load(f)totals=data["totals"]print(f"整体覆盖率:{totals['percent_covered_display']}%")forfilename,infoindata["files"].items():pct=info["summary"]["percent_covered_display"]ifint(pct)<50:print(f"{filename}: 覆盖率{pct}%")print("缺失行:",info["missing_lines"])if__name__=="__main__":main()

    运行python tests/analyze_coverage.py可以快速定位覆盖率薄弱的文件和缺失行,指导后续补充测试。

  5. 验证环境

    • 运行pytest --version,预期输出 pytest 7.4.0。

    • 运行项目:python app.py,检查 UI 正常(键盘显示)。

    • 检查pytest.ini配置:

      markers = keyboard: 测试键盘 UI 与交互 filterwarnings = ignore:.*sipPyTypeDict.*:DeprecationWarning

      这样运行时可以用pytest -m keyboard来跑所有键盘相关测试,并且不会刷屏显示 PyQt5 的弃用告警。


步骤2:单元测试(隔离组件)

目标:测试单个文件(如 panel.py 的 _on_digit),不跑 GUI/串口。快速反馈。

  1. 编写/运行 test_panel.py

    -预期:所有 `@pytest.mark.keyboard` 的测试通过。-如果失败:检查import路径(fromui.keyboard.panelimportKeyboardPanel)。pytest tests/keyboard/test_panel.py-v-W ignore::DeprecationWarning# tests/keyboard/test_panel.pyimportpytestfromui.keyboard.panelimportKeyboardPanelfromunittest.mockimportMagicMock@pytest.fixturedefkeyboard(qapp):returnKeyboardPanel()@pytest.mark.keyboarddeftest_on_digit_limit(keyboard):foriinrange(5):# 输入5位keyboard._on_digit(1)assertlen(keyboard.input_buffer)==4# 限长4assertkeyboard.lcd.display.called# mock 检查调用@pytest.mark.keyboarddeftest_set_mode(keyboard):keyboard.mode_changed=MagicMock()keyboard.lcd.display_text=MagicMock()keyboard._set_mode("PRESET")assertkeyboard.mode=="PRESET"keyboard.mode_changed.emit.assert_called_with("PRESET")keyboard.lcd.display_text.assert_called_with("PRESET",...)
  2. 运行

    pytest-mkeyboard-v
    • 预期:所有 test_ 通过(e.g., 2 passed)。
    • 如果失败:检查 import 路径(from ui.keyboard.panel import KeyboardPanel)。
  3. 类似测试 LCD/indicator

    • test_lcd.py:mock theme,检查 display_text 的 setStyleSheet。
    • test_indicator.py:mock QTimer,检查 flash 后 off 调用。
  4. 覆盖率检查

    coverage run -m pytest tests/keyboard/ coverage report -m # 显示缺失行 coverage html # 生成 htmlcov/index.html 查看
    • 目标:ui/keyboard/ 覆盖 90%+。

步骤3:集成测试(模块交互)

目标:测试键盘与核心/mock 串口的交互(如按键 emit → 串口 write)。

  1. 编写 test_integration.py

    # tests/keyboard/test_integration.pyimportpytestfromunittest.mockimportpatch,MagicMockfromui.keyboard.panelimportKeyboardPanelfromcore.protocolimportptz_control@pytest.fixturedefkeyboard(qapp):kb=KeyboardPanel()kb.serial_mgr=MagicMock()# mock 串口returnkb@pytest.mark.keyboarddeftest_joystick_to_protocol(keyboard):withpatch('core.protocol.ptz_control')asmock_ptz:keyboard.joystick_moved.emit(10,-20)mock_ptz.assert_called_with(keyboard.serial_mgr,...,10,-20)@pytest.mark.keyboarddeftest_enter_error_indicator(keyboard):keyboard.input_buffer="invalid"keyboard.indicator_manager.on=MagicMock()keyboard._on_enter()keyboard.indicator_manager.on.assert_called_with("ERR")
  2. 运行

    pytest -m keyboard -v
    • 预期:通过,mock assert_called 检查交互。
  3. 协议集成测试

    • 新建 test_protocol_integration.py:mock build_pelco_d,检查 checksum。

步骤4:端到端测试(全链路)

目标:模拟用户操作,验证 UI → 核心 → 反馈。

  1. 安装 pytest-qt(如果未装):pip install pytest-qt==4.0.2

  2. 编写 test_e2e.py

    # tests/test_e2e.pyimportpytestfromPyQt5.QtTestimportQTestfromPyQt5.QtCoreimportQtfromui.main_windowimportAppWindow@pytest.mark.keyboarddeftest_full_keyboard_flow(qapp):window=AppWindow()window.show()# 显示窗口qapp.processEvents()# 模拟数字输入fordigitin"123":btn=window.keyboard.findChild(QtWidgets.QPushButton,digit)# 假设 text=digitQTest.mouseClick(btn,Qt.LeftButton)assertwindow.keyboard.lcd.value()==123# 检查 LCD# 模拟 ENTent_btn=window.keyboard.findChild(QtWidgets.QPushButton,"ENT")QTest.mouseClick(ent_btn,Qt.LeftButton)# 检查 TX 闪(indicator_manager.state("TX") 暂 True)# 异常:输入无效后 ENT,检查 ERR on
  3. 运行

    pytest -m keyboard -v
    • 预期:窗口短暂闪现,通过(Win7 可能慢,加 -s 显示输出)。
    • 注意:端到端慢,标记 @pytest.mark.slow。

步骤5:手动测试与验证

目标:覆盖自动化难测(如视觉/手感)。

  1. 运行项目python app.py

  2. Checklist 操作

    • 输入 1234 → LCD 显示 1234,超限不增。
    • 按 PRESET → LCD “PRESET” + 颜色变(themes.py)。
    • 摇杆拖拽 → TX 闪(模拟发送)。
    • 切换主题(右上按钮) → LCD/灯颜色变。
    • resize 窗口 → 布局不崩(stretch 生效)。
    • 模拟错误(断串口) → ERR 灯 + 弹窗。
    • Win7 特定:多分辨率(1024x768)测试;旧 COM 端口连接真实设备验证。
  3. 最终覆盖率

    coverage run -m pytest -m keyboard coverage report -m coverage html
    • ui/keyboard/覆盖率 90%+。

步骤6:常见问题与调试

  • 失败:ImportError → 检查 PYTHONPATH(sys.path.append(“…”) 在 test)。
  • Win7 卡顿:减 QTimer 间隔;关防病毒。
  • CI:GitHub Actions 加 Win7 runner(自建或第三方)。
  • 扩展:加 @pytest.mark.parametrize 参数化(e.g., 多模式测试)。

通过本文的详细操作,你已经能够在本地环境中完成键盘部分的测试:从单元到集成,再到端到端和手动验证,覆盖率报告也能直观呈现测试成果。与上一篇的规划篇形成呼应,本篇提供了实操指南,真正把测试方案落地。

至此,键盘模块的测试体系已经基本完善。下一篇我们将进入宏系统的开发与测试,继续扩展整个项目的可靠性与可维护性。这样,一个完整的测试闭环就逐步建立起来,为后续功能迭代打下坚实基础。

上一篇总目录下一篇

http://www.jsqmd.com/news/197753/

相关文章:

  • Slack工作流自动化:通过IndexTTS 2.0播报通知消息
  • remap_json.py
  • Wireshark抓包实操:ModbusTCP报文格式说明新手教程
  • 2025年课程顾问AI陪练系统推荐:课程顾问智能体哪家专业? - myqiye
  • 2025年轻骨料混凝土制造企业交货期/源头厂家信誉度/售后服务排名推荐 - mypinpai
  • 2025年智能运维品牌供应商推荐:服务不错的智能运维品牌商有哪些? - 工业设备
  • 2026年靠谱的透明四方袋/铝塑复合四方袋厂家推荐及选择指南 - 品牌宣传支持者
  • 2026年知名的钙粉选粉机/组合式选粉机厂家推荐及采购指南 - 品牌宣传支持者
  • 2025专项财税服务TOP5权威推荐:专业专项财税服务找哪家? - 工业品牌热点
  • Git commit规范写作技巧,搭配IndexTTS 2.0生成代码注释语音
  • 2025年重庆热门茶馆推荐:苗品记隐茶馆口碑如何? - myqiye
  • Meta新发布Voicebox不及预期?IndexTTS 2.0已落地实用
  • 频率响应奈奎斯特图:MATLAB实战案例解析
  • Web端集成IndexTTS 2.0:打造在线语音生成平台全流程
  • 【多元统计分析进阶之路】:基于R语言的PCA实战案例精讲
  • R语言随机森林模型精度提升7步法:数据预处理到超参数调优全流程
  • 如何用R语言打造期刊主编青睐的图表?揭秘高影响力论文配色密码
  • 用自然语言描述控制情绪:“愤怒地质问”也能精准合成?
  • 2025年天津短视频拍摄公司排名:靠谱、售后好、案例多的企业推荐全解析 - mypinpai
  • 数字人交互语音新选择:IndexTTS 2.0提升语音清晰度与稳定性
  • 新手必看:Allegro导出Gerber文件入门教程
  • 2025年靠谱隧道风筒布加工厂/制造厂/服务商排名 - 工业设备
  • confidence.py
  • 分类精度上不去?R语言随机森林5个常被忽略的性能陷阱,90%的人都踩过
  • 什么是IP专线
  • 2026年比较好的高定衣柜灯/护墙灯衣柜灯TOP实力厂家推荐榜 - 品牌宣传支持者
  • ChromeDriver下载地址汇总?先了解它在自动化测试中的作用
  • 你真的会用R做系统发育信号检测吗:trait数据建模常见误区与纠正
  • Mathtype公式编辑太复杂?其实你可以这样结合AI语音讲解
  • 新手教程:数字电路中触发器的基础应用详解