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

Pelco KBD300A 模拟器:17.按照pytest自动化测试方案规划建立测试基础框架

17 按照pytest自动化测试方案规划建立测试基础框架**

测试目录结构:

tests/ ├── pytest.ini ├── conftest.py ├── unit/ # 单元测试(优先:protocol、macro、alarm) ├── integration/ # 集成测试(serial + protocol + macro) ├── ui/ # UI 测试(keyboard、macro_editor、log_panel) ├── e2e/ # 端到端测试(完整用户流程) └── performance/ # 性能测试(宏大循环、日志吞吐)

1. pytest.ini

1.1 指定测试文件的位置和命名规则:你可以通过配置项来改变pytest默认的测试文件查找规则。例如,你可以指定测试文件所在的目录、测试文件的命名模式等。

1.2 配置测试搜索路径:可以添加额外的目录到测试搜索路径中。

1.3 添加命令行默认选项:你可以在pytest.ini中设置一些默认的命令行选项,这样每次运行pytest时都会自动使用这些选项,而不需要每次都手动输入。例如,你可以设置默认使用详细输出(-v)或者自动识别并运行测试(–tb=short)等。

1.4 注册标记(marks):pytest允许你使用标记来分类测试,但是为了避免标记名拼写错误,你可以在pytest.ini中注册标记,这样pytest会检查标记名是否有效。注册标记时还可以提供标记的描述信息。

1.5 配置测试报告:可以配置测试报告的格式,例如使用JUnit XML格式输出测试结果,以便于持续集成工具(如Jenkins)读取。

1.6 配置插件:可以启用或禁用pytest插件,也可以配置插件的参数。

1.7 环境变量设置:可以在pytest.ini中设置环境变量,这些环境变量将在测试运行时生效。

1.8 配置测试运行的行为:例如,可以配置测试超时时间、并发执行测试的进程数(如果使用了pytest-xdist插件)等。

# tests/pytest.ini [pytest] testpaths = tests python_files = test_*.py *_test.py python_classes = Test* *Test python_functions = test_* *_test addopts = -ra --tb=short --strict-markers --maxfail=5 -p no:warnings --cov=core --cov-report=term-missing --cov-report=html:coverage_html --cov-report=xml:coverage.xml markers = unit: 单元测试(隔离依赖) integration: 集成测试(模块交互) ui: UI 测试(pytest-qt) e2e: 端到端测试(完整流程) performance: 性能测试(cProfile) slow: 慢测试(可跳过) serial: 需要真实或mock串口 macro: 宏相关测试 filterwarnings = ignore::DeprecationWarning ignore::PendingDeprecationWarning # 超时保护 timeout = 30 timeout_method = thread

2. conftest.py

conftest.py 是 pytest 的一个特殊文件,它用于存放 pytest 的夹具(fixtures)和插件配置,这些夹具可以在该文件所在的目录以及所有子目录中的测试文件中使用。
主要作用:

  1. 共享夹具(fixtures)
    可以在多个测试文件中共享夹具,避免重复代码。
    夹具可以用于设置测试环境、准备测试数据、初始化资源等。
  2. 钩子函数(hooks)
    可以自定义 pytest 的行为,例如添加自定义的启动和清理逻辑、修改测试报告等。
  3. 插件配置
    可以加载和配置 pytest 插件。
  4. 自定义命令行选项
    可以通过钩子函数添加自定义命令行选项,并在夹具或测试中使用。

使用特点:
自动发现:pytest 会自动发现 conftest.py 文件,无需导入。
作用域:
conftest.py 文件可以放在任何目录中,其作用域为该目录及其所有子目录。
可以在不同的目录中放置多个 conftest.py 文件,子目录中的 conftest.py 会覆盖父目录中的同名夹具或钩子。
不可导入:测试文件不需要导入 conftest.py 中的夹具,pytest 会自动注入。
共享夹具:可以用于跨测试文件共享夹具,特别是当多个测试文件需要相同的设置时。

# tests/conftest.pyimportpytestimporttempfileimportosimportjsonfromunittest.mockimportMock,patchfromPyQt5importQtWidgetsfromPyQt5.QtCoreimportQTimerimportserial# 用于mockfromcore.utils.log_emitterimportget_log_emitter# ----------------------------- 全局 fixture -----------------------------@pytest.fixture(scope="session")defqt_app():"""QApplication 单例 fixture"""app=QtWidgets.QApplication.instance()ifappisNone:app=QtWidgets.QApplication([])yieldapp# 避免退出时崩溃ifapp:app.quit()@pytest.fixturedefqtbot(qt_app,qtbot):"""pytest-qt 的 qtbot,自动使用 qt_app"""returnqtbot@pytest.fixturedefmock_serial(mocker):"""Mock pyserial.Serial"""mock_ser=mocker.patch("serial.Serial")mock_ser.return_value.is_open=Truemock_ser.return_value.in_waiting=0mock_ser.return_value.read.return_value=b""mock_ser.return_value.write.return_value=Nonereturnmock_ser@pytest.fixturedefmock_log_emitter(mocker):"""Mock LogEmitter 单例"""emitter=get_log_emitter()mocker.patch.object(emitter,"info")mocker.patch.object(emitter,"warning")mocker.patch.object(emitter,"error")mocker.patch.object(emitter,"debug")mocker.patch.object(emitter,"send")mocker.patch.object(emitter,"receive")mocker.patch.object(emitter,"alarm")returnemitter@pytest.fixturedeftemp_settings():"""临时 settings.json"""withtempfile.NamedTemporaryFile(mode="w",suffix=".json",delete=False)asf:config={"serial_config":{"port":"COM99","baud":9600,"protocol":"D","parity":"None","kbd_address":1,"default_cam_id":1}}json.dump(config,f)path=f.nameyieldpath os.unlink(path)@pytest.fixturedeftemp_macro_dir(tmp_path):"""临时宏目录"""macro_dir=tmp_path/"resources"/"macros"macro_dir.mkdir(parents=True,exist_ok=True)yieldstr(macro_dir)# ----------------------------- 常用 mock -----------------------------@pytest.fixturedefmock_virtual_device(mocker):"""Mock VirtualDevice"""device=mocker.MagicMock()device.process_command.return_value=b"ACK"device.get_status_dict.return_value={"pan":0.0,"tilt":0.0}returndevice# ----------------------------- 参数化数据 -----------------------------@pytest.fixture(params=[b"\xff\x01\x00\x02\x20\x20\x43",b"\xa0\x01\x00\x00\x00\x00\x00\xaf"])defsample_frame(request):"""D 和 P 协议示例帧"""returnrequest.param# ----------------------------- 清理 -----------------------------@pytest.fixture(autouse=True)defcleanup():yield# 可在此清理临时文件、停止定时器等

两者对比:

特性conftest.pypytest.ini
格式Python 代码INI 配置文件
主要用途夹具、钩子、插件配置选项、参数
位置可在多级目录通常只在根目录
内容动态代码逻辑静态配置
加载顺序多个文件层级加载单个文件

下一步安排

  • 单元测试优先模块:先写tests/unit/test_protocol.py(build/parse 函数)
  • 集成测试tests/integration/test_serial_protocol.py
  • UI 测试tests/ui/test_keyboard_joystick.py(需要 pytest-qt)
  • 端到端tests/e2e/test_macro_flow.py(键盘 → 宏 → 协议 → 模拟器)
    👉上一篇 :项目硬件相关测试的 Mock 技巧详解
    👉总目录:Python开发软键盘全程总览
    👉下一篇
http://www.cnnetsun.cn/news/860320.html

相关文章:

  • 听说现在JDBC已经过时了,还需要学吗?
  • 开题报告被批 “无逻辑、缺创新”?虎贲等考 AI 一键解锁 “过审密码”
  • Nodejs+vueAndroid的垃圾分类系统小程序
  • 我的区块链运维日记 · 第 12 日:消失的服务器 —— 也就是我们如何被 IPFS 逼疯的
  • nginx和openresty和apisix区别
  • 用 Claude Code 重新定义编程效率:一次真实开发实践
  • 宋慧乔喜欢玩Switch吗?明星同款游戏机解读
  • 计算机毕业设计之jsp连锁花店管理平台
  • 微信聊天记录恢复全攻略(2026实测版)—— 从应急到终极方案
  • SEW变频器MCS41A0300-203-4-00 08273103
  • 绘图焦虑退散!虎贲等考 AI:10 分钟搞定顶刊级图表,手残党也能当学术可视化大神
  • Nodejs+vue高校实验室签到预约开放管理平台小程序
  • Nodejs+vue微信小程序的健康饮食美食商城系统
  • Nodejs+vue微信小程序的奶茶甜品网上商城系统
  • 一键部署Llama2大模型到本地,无需联网,无需GPU,支持图片内容识别
  • 桥梁裂纹“无处遁形”:DIC技术精准捕捉铁路箱梁弯曲破坏全过程
  • 谷歌Gemma 大模型 部署搭建本地详细教程
  • Eplan许可证申请被拒原因分析解决
  • C++异常处理与错误管理:构建稳定可靠的程序
  • Linux Socket编程核心:深入解析sockaddr数据结构
  • springbot宠物领养管理系统设计开发实现
  • python基于新高考改革下的志愿填报服务系统
  • 计算机毕业设计之springboot校服订购系统
  • NodeJS:安装
  • 书匠策AI:教育论文数据分析的“未来实验室”,让数据开口说故事的魔法师
  • 书匠策AI:让教育论文数据“开口说话”的魔法画笔——零代码、跨学科、动态可视化,重新定义学术数据分析
  • 2026 OpenAI技术全景:GPT-5.2领衔的AI革命与DMXAPI无缝替代方案
  • 【三端毕设源码分享】基于springboot+小程序+Java的商城系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 书匠策AI:教育论文数据分析的“时空折叠器”,让研究突破次元壁
  • 2026高职大数据专业应届生就业方向与实战指南