news 2026/5/10 12:21:16

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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开发软键盘全程总览
    👉下一篇
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 2:06:19

【挑选合适的开源前端项目是商城系统开发的重要一步】

挑选合适的开源前端项目是商城系统开发的重要一步。下面我为你梳理了主流的技术方案和具体的开源项目,并提供选型建议,希望能帮你快速定位适合的方案。 🛠️ 主流技术栈与框架 当前商城前端开发主要围绕以下两种跨端框架展开,它们…

作者头像 李华
网站建设 2026/5/7 19:18:46

中屹指纹浏览器底层技术解析:内核级Hook改造与多维度特征校验实现

2026 年主流平台的风控体系已完成从表层参数检测到底层逻辑校验的技术升级,传统依靠 JS 注入实现指纹篡改的方案,因存在调用栈异常、渲染逻辑矛盾、参数关联性缺失等问题,被风控系统识别的概率大幅提升。中屹指纹浏览器基于 Chromium 125 内核…

作者头像 李华
网站建设 2026/5/7 9:14:59

大模型本地部署:Windows PC上从零开始部署ChatGML-6B-int4量化模型

ChatGLM-6B是清华大学知识工程和数据挖掘小组(Knowledge Engineering Group (KEG) & Data Mining at Tsinghua University)发布的一个开源的对话机器人。6B表示这是ChatGLM模型的60亿参数的小规模版本,约60亿参数。 ChatGML-6B-int4量化…

作者头像 李华
网站建设 2026/5/10 3:02:00

资深AI技术专家20年总结,零AI基础掌握大模型、扩散模型、多模态模型

今天给大家系统地介绍了一本AIGC的各方面内容的书—《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》,这本书从基础知识到应用实践,从基本原理到案例分析,力求通过简洁明了的语言、清晰生动的例子,引导读…

作者头像 李华
网站建设 2026/5/5 19:48:52

Nginx:如何安装Nginx详细教程(总结一)

一、Nginx简介 1. 什么是Nginx Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗却非常低&…

作者头像 李华
网站建设 2026/5/3 7:07:55

零基础入门 Spring Boot:从‘Hello World’到可上线的 Web 应用

零基础入门 Spring Boot:从‘Hello World’到可上线的 Web 应用 💡 适合谁? 完全没写过 Java Web 的新手,会安装软件、能看懂基础代码(如 System.out.println),想快速上手一个真实可用的后端框架…

作者头像 李华