当前位置: 首页 > 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.jsqmd.com/news/316749/

相关文章:

  • 说说河南宏九机械动物油设备靠谱吗,口碑怎么样
  • 大模型Agent的核心还是prompt?
  • 互联网大厂Java求职面试实录:核心技术栈与AI大数据应用深度解析
  • 学Simulink--控制执行场景实例:基于Simulink的智能车辆电子稳定控制(ESC)仿真
  • 为什么写java的都用jdk8?
  • 仅凭ai真的能做好复杂项目吗?
  • 有哪些搭建agent的框架是必须掌握的?
  • DirectX SDK最新版下载,2010版官方获取指南
  • Nodejs+vue安卓的驾校练车考试预约管理系统小程序
  • 想要学习Agent开发,听说有LangGraph框架,那还要学习LangChain吗?
  • Nodejs+vueAndroid的垃圾分类系统小程序
  • 听说现在JDBC已经过时了,还需要学吗?
  • Nodejs+vueAndroid的旅游景点酒店预订管理系统 小程序
  • Oracle 19c入门学习教程,从入门到精通,Oracle 数据备份与恢复 — 语法知识点与使用方法详解(17)
  • Nodejs+vueAndroid的理发店美容店预约管理系统 小程序
  • Nodejs+vueAndroid的课程教学互动系统小程序
  • 竖向柱状图
  • 别瞎用!这才是FastAPI异步(async)与多线程的正确打开方式
  • 计算机组成原理(8):各种码的作用详解 - 教程
  • 指纹浏览器怎样设置ip?选择哪个IP好用?哪个IP价格便宜?
  • 京东e卡回收哪里最划算?四大渠道深度解析
  • 2026年四川成都麻将机/机麻定制厂家竞争格局深度分析报告
  • 2026年热门婚礼酒店,日照哪些品牌婚礼酒店服务靠谱又好用?
  • 婚恋服务机构哪家可靠,上海绿洲婚介所实力护航幸福
  • 2026年北京口碑好的擅长辩护诈骗国家补贴案件律师推荐
  • 2026高压单相接触器商家口碑排名,专业生产企业全梳理
  • 2026年天水地区PLC培训学校性价比排名及选择指南
  • SELECT * FROM orders WHERE id > 1000000 ORDER BY id LIMIT 10;的庖丁解牛
  • 2026年深圳口碑好的AI办公鼠标企业推荐,选购攻略来啦
  • 用 Claude Code 重新定义编程效率:一次真实开发实践