Qt Quick Test模块功能及架构
Qt Quick Test 是专门为测试 QML 应用程序设计的模块,在 Qt 6.0 中得到了显著增强。
一、主要功能/使用方法
核心功能概述
-
QML 单元测试框架
-
提供完整的 QML 测试环境
-
支持测试用例组织和执行
-
包含 QML 断言函数和测试结果收集
-
-
测试类型支持
-
组件功能测试
-
用户界面行为测试
-
信号和属性绑定测试
-
可视化项渲染测试
-
基本使用方法
1. 创建测试文件
// tst_example.qml
import QtQuick 2.15
import QtTest 1.15TestCase {name: "ExampleTests"function test_math() {compare(1 + 1, 2, "Basic math")}function test_property() {var obj = createTemporaryObject(component, parent)verify(obj !== null, "Object created")compare(obj.width, 100, "Default width")}
}
2. 主测试文件
// tst_main.qml
import QtQuick 2.15
import QtQuick.Window 2.15
import QtTest 1.15Window {visible: truewidth: 400height: 300TestCase {id: mainTestname: "MainTests"when: windowShownfunction test_window() {compare(window.width, 400, "Window width")compare(window.height, 300, "Window height")}}
}
关键测试元素
-
TestCase
-
基础测试容器
-
提供测试函数和断言方法
-
支持异步测试
-
-
SignalSpy
-
监听信号发射
-
记录信号发射次数和参数
-
-
TestEvent
-
模拟鼠标和键盘输入
-
支持触摸事件模拟
-
主要断言方法
方法 | 描述 |
---|---|
compare(actual, expected, message) | 比较实际值和期望值 |
verify(condition, message) | 验证条件为真 |
tryCompare(obj, prop, expected, timeout, message) | 异步比较属性值 |
fail(message) | 强制测试失败 |
skip(message) | 跳过当前测试 |
高级功能
1. 异步测试
function test_async() {var obj = createTemporaryObject(component, parent)obj.signal.connect(function() {// 信号处理})tryCompare(obj, "status", "ready", 1000, "Object should become ready")
}
2. 信号监测
function test_signal() {var obj = createTemporaryObject(component, parent)var spy = createTemporaryObject(signalSpyComponent, null, {target: obj, signalName: "clicked"})mouseClick(obj)compare(spy.count, 1, "Signal should be emitted once")
}
3. 事件模拟
function test_events() {var obj = createTemporaryObject(buttonComponent, parent)mouseClick(obj, 10, 10, Qt.LeftButton)keyClick(Qt.Key_Enter)
}
Qt 6.0 新特性
-
改进的组件创建
-
createTemporaryObject()
更可靠 -
更好的内存管理
-
-
增强的事件模拟
-
支持多点触控
-
更精确的鼠标移动模拟
-
-
更好的调试支持
-
详细的错误信息
-
测试失败时的堆栈跟踪
-
-
与 C++ 测试集成
-
可以在 C++ 测试中嵌入 QML 测试
-
共享测试基础设施
-
测试执行
-
命令行执行
qmltestrunner -input tst_example.qml
-
输出选项
-
-o file,xml
XML 格式输出 -
-o file,txt
文本格式输出 -
-o file,lightxml
轻量级 XML 输出
-
-
测试选择
-
按名称筛选测试用例
-
支持通配符匹配
-
最佳实践
-
测试组织
-
按功能模块分组测试
-
使用有意义的测试名称
-
-
测试数据
-
使用 JSON 文件存储测试数据
-
考虑使用数据驱动测试
-
-
测试稳定性
-
避免依赖绝对时间
-
使用
tryCompare
处理异步操作
-
-
CI/CD 集成
-
生成 JUnit 格式报告
-
与 CMake 测试集成
-
二、架构解析
整体架构层次
1. QML 测试接口层
-
测试用例声明:通过
TestCase
QML 类型定义测试 -
断言系统:提供
compare()
,verify()
等 QML 可调用方法 -
测试控制:管理测试执行顺序和生命周期
2. C++ 核心引擎层
-
测试运行器:
QQmlTestRunner
类负责调度测试执行 -
QML 引擎集成:与
QQmlEngine
深度集成,支持组件实例化 -
事件系统:
QQuickTestEvent
及相关类处理输入模拟
3. 底层适配层
-
与 Qt Test 集成:共享基础测试设施和报告系统
-
平台抽象:处理不同平台的输入事件差异
核心组件设计
1. TestCase 类型系统
TestCase {// 测试元数据name: "MyTests"when: windowShown// 测试资源管理function initTestCase() {}function cleanupTestCase() {}// 测试函数function test_example() {compare(1+1, 2)}
}
2. 测试执行流程
-
解析阶段:加载 QML 测试文件,识别测试用例
-
初始化阶段:调用
initTestCase()
-
执行阶段:按顺序运行测试函数
-
清理阶段:调用
cleanupTestCase()
-
报告阶段:生成测试结果输出
3. 关键类关系
QQmlTestRunner
├── QQmlEngine
├── QQuickTestCase
│ ├── QQuickTestEvent
│ └── QQuickTestResult
└── QTestLogger
三、事件系统架构
1. 输入事件模拟
-
鼠标事件:
mouseClick()
,mouseMove()
-
键盘事件:
keyClick()
,keyPress()
-
触摸事件:
touchEvent()
2. 事件处理流程
测试代码调用事件方法
→ QQuickTestEvent 创建平台事件
→ QQuickWindow 事件分发
→ 目标 Item 处理事件
→ 测试验证结果
信号监测系统
1. SignalSpy 实现
SignalSpy {target: testObjectsignalName: "statusChanged"
}
2. 工作原理
-
使用 Qt 元对象系统动态连接信号
-
通过槽函数记录信号触发信息
-
提供
count
和signalArguments
属性
Qt 6.0 架构改进
-
QML 引擎优化
-
更快的组件实例化 (
createTemporaryObject
) -
改进的垃圾回收策略
-
-
测试隔离增强
-
每个测试用例在独立上下文中运行
-
更好的资源清理机制
-
-
异步测试改进
-
更精确的
tryCompare
超时控制 -
支持 Promise 风格的异步测试
-
-
调试支持
-
增强的错误位置报告
-
与 Qt Creator 深度集成
-
执行模型
1. 测试发现
-
扫描指定目录的
tst_*.qml
文件 -
解析 TestCase 元素及其测试函数
2. 执行模式
-
顺序执行:默认串行执行测试
-
过滤执行:支持通过名称筛选测试
-
GUI 模式:需要显示窗口的测试 (
when: windowShown
)
报告系统
1. 输出格式支持
-
TAP (Test Anything Protocol)
-
XML (xUnit 风格)
-
文本 (人类可读)
-
LightXML (简化 XML)
2. 报告生成流程
测试执行
→ QQuickTestResult 收集结果
→ QTestLogger 格式化输出
→ 控制台/文件输出
扩展机制
1. 自定义断言
function assertApproxEqual(actual, expected, tol) {if (Math.abs(actual - expected) > tol)fail("Values differ by more than " + tol)
}
2. 测试工具组件
-
可创建可复用的测试组件
-
支持通过 QML 组件注入测试依赖
性能优化
-
延迟初始化:按需创建测试对象
-
智能重绘:最小化不必要的界面更新
-
并行化准备:预编译测试 QML 文件
Qt Quick Test 的这种架构设计使其能够高效地测试 Qt Quick 应用程序,同时保持 QML 开发的自然工作流程,是 Qt 6.0 中 UI 测试的重要基础设施。
相关文章:
Qt Quick Test模块功能及架构
Qt Quick Test 是专门为测试 QML 应用程序设计的模块,在 Qt 6.0 中得到了显著增强。 一、主要功能/使用方法 核心功能概述 QML 单元测试框架 提供完整的 QML 测试环境 支持测试用例组织和执行 包含 QML 断言函数和测试结果收集 测试类型支持 组件功能测试 用…...

Excel自动分列开票工具推荐
软件介绍 本文介绍一款基于Excel VBA开发的自动分列开票工具,可高效处理客户对账单并生成符合要求的发票清单。 软件功能概述 该工具能够将客户对账单按照订单号自动拆分为独立文件,并生成可直接导入发票清单系统的标准化格式。 软件特点 这是一款体…...

Maven入门(够用)
1、Maven是什么? 这个问题非常不重要,或者说不应该上来就问maven是什么,而是直接学习maven怎么用能干什么,学完之后自然就知道了maven是个什么玩意儿,很多技术都是如此。 2、Maven下载 先准备Java环境,安…...
【HarmonyOS 5】 社交行业详解以及 开发案例
HarmonyOS 5通过分布式能力、响应式框架及AI技术,重构社交应用的交互范式,以下是分领域解析: 🧏 一、无障碍社交创新 听障人士实时通讯辅助 语音文字双向转译功能:对方语音实时转为文字显示,用户…...
python版若依框架开发:集成Dash应⽤
python版若依框架开发 从0起步,扬帆起航。 python版若依部署代码生成指南,迅速落地CURD!项目结构解析前端开发规范后端开发规范集成Dash应⽤文章目录 python版若依框架开发后端部分1.安装 Dash2.在 sub_applications 目录下新建 dash_app.py ⽂件3.在 sub_applications/han…...
网盘变硬盘挂载软件:百度 / 阿里 / OneDrive 秒变本地磁盘
各位网盘达人们!今天咱来聊聊超神奇的网盘挂载软件。你知道吗,这玩意儿就像个超级魔法棒,能把远程网盘,像百度网盘、阿里云盘、OneDrive这些,变成咱本地的虚拟磁盘。有了它,咱管理云端文件就跟操作自己家硬…...

自动化办公集成工具:一站式解决文档处理难题
1. 项目概述 在当今信息化时代,办公自动化已成为提升工作效率的关键。本文将详细介绍一款基于Python和PyQt5开发的「自动化办公集成工具」,该工具集成了多种常用的办公文档处理功能,包括批量格式转换、文本智能替换、表格数据清洗等,旨在为用户提供一站式的办公自动化解决方…...

three.js 零基础到入门
three.js 零基础到入门 什么是 three.js为什么使用 three.js使用 Three.js1. 创建场景示例 2.创建相机3. 创建立方体并添加网格地面示例 5. 创建渲染器示例 6. 添加效果(移动/雾/相机跟随物体/背景)自动旋转示例效果 相机自动旋转示例 展示效果 实现由远到近的雾示例展示效果 T…...

PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的区别
python容易编辑,因此用pyrx代替rxjava3做演示会比较快捷。 pyrx安装命令: pip install rx 一、Subject(相当于 RxJava 的 PublishSubject) PublishSubject PublishSubject 将对观察者发送订阅后产生的元素,而在订阅前…...

在Ubuntu22.04 系统中安装Docker详细教程
1.更新系统软件包 #确保您的系统软件包是最新的。这有助于避免安装过程中可能遇到的问题 sudo apt update sudo apt upgrade -y2.安装必要的依赖 sudo apt install apt-transport-https ca-certificates curl software-properties-common -y3.替换软件源 echo "deb htt…...
解决transformers.adapters import AdapterConfig 报错的问题
需要安装 Adapter-Hub 的 transformers 分支,不是官方 transformers 库! pip install githttps://github.com/Adapter-Hub/transformers.git✅ 注意:这个命令会从 GitHub 下载源码并安装。你需要确保你的网络可以访问 GitHub,并且…...

AUTOSAR实战教程--DoIP_01_配置项解释
配置项 解释 备注 DoIPChannelSARef 引用DoIP Tester的源地址,就是你在DoIP Tester这个Containter中配置的Tester实例。 DoIPChannelTARef 引用目标地址。就是你在DoIPTargetAddress这个Container中的配置。 DoIPPduRRxPduId 为该pdu设置一个ID用于DoIP…...
湖北理元理律师事务所:法律视角下的债务优化与生活平衡之道
一、债务优化的本质:法律与生活的平衡艺术 债务问题常被视为单纯的财务危机,实则牵涉法律权责界定、还款能力评估、生活保障等多重维度。作为法律服务机构,我们观察到:真正的债务优化需同时满足两个条件: 法律合规性…...

机器人/智能车纯视觉巡线经典策略—滑动窗口+直方图法
作者:SkyXZ CSDN:SkyXZ~-CSDN博客 博客园:SkyXZ - 博客园 在机器人或智能车的自主导航任务中,视觉巡线是一项最为基础且关键的能力之一。通过摄像头实时获取道路图像,并基于图像信息判断行驶路径࿰…...
附加模块--Qt OpenGL模块功能及架构
一、模块功能: 主要变化 Qt OpenGL 模块的分离: 在 Qt 6 中,原来的 Qt OpenGL 功能被拆分为多个模块 传统的 Qt OpenGL 模块 (QGL*) 已被标记为废弃 新的图形架构: Qt 6 引入了基于 QRhi (Qt Rendering Hardware Interface) 的…...

503 Service Unavailable:服务器暂时无法处理请求,可能是超载或维护中如何处理?
处理 "503 Service Unavailable" 错误是服务器管理者面临的常见挑战之一。这种错误通常表示服务器暂时无法处理请求,可能是由于服务器超载、维护中或其他临时性问题导致的。在本文中,我将介绍如何处理 "503 Service Unavailable" 错…...
抖音怎么下载没有水印的视频?
你是不是经常在抖音上刷到喜欢的视频,想保存下来却总是带着烦人的水印?无论是想收藏精彩片段,还是二次创作,水印都成了“拦路虎”。别急!今天就来教你3种超简单方法,轻松下载无水印抖音视频,高清…...

虚拟机时间同步
一、常见同步方式 常见的虚拟机同步方式有给虚拟机配置ntp、或者用平台提供的agent对时与虚拟机所在的宿主机。第一种依赖网络、第二种依赖平台的agent这个三方工具。 二、利用ptp_kvm.ko来直接和宿主机同步时间 关键组件 ptp_kvm驱动、chrony。 PTP_KVM同步原理 |--------…...
三级流水线是什么?
三级流水线是什么? “三级流水线” 英文名:Three-Stage Pipeline 或 Basic 3-Stage Pipeline,是计算机处理器(CPU)设计中一种基本的指令流水线技术,它将指令的执行过程划分为三个主要阶段,使得…...

软件更新机制的测试要点与稳定性提升
💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...
自定义protoc-gen-go生成Go结构体,统一字段命名与JSON标签风格
背景 在日常的 Go 微服务开发中,Protocol Buffers(protobuf) 是广泛使用的数据交换格式。其配套工具 protoc-gen-go 会根据 .proto 文件生成 Go 结构体代码,但默认生成的字段名、JSON tag 命名风格往往不能满足所有团队或项目的代…...
Context API 应用与局限性
核心概念 React 的 Context API 是为了解决组件间数据共享而设计的一种机制,其核心价值在于提供了一种不通过 props 层层传递就能在组件树中共享数据的方法。在 React 应用中,数据通常是自上而下(从父组件到子组件)通过 props 传…...

LLMs 系列科普文(11)
目前我们已经介绍了大语言模型训练的两个主要阶段。第一阶段被称为预训练阶段,主要是基于互联网文档进行训练。当你用互联网文档训练一个语言模型时,得到的就是所谓的 base 模型,它本质上就是一个互联网文档模拟器,我们发现这是个…...
DQN算法(详细注释版)
DQN算法 DQN算法使用的常见问题 Q1: 为什么用目标网络而非Q网络直接计算? 答案:避免“移动目标”问题(训练中Q网络频繁变化导致目标不稳定),提高收敛性。 Q2: 为什么用 max 而不是像SARSA那样采样动作?…...
sizeof 与strlen的区别
sizeof 和 strlen 是C和C 中用于处理数据大小和字符串长度的两个不同的操作符/函数,它们的区别如下: 概念和用途 - sizeof 是一个操作符,用于计算数据类型或变量在内存中所占的字节数,它是在编译时确定的,与数据的…...
论文阅读:HySCDG生成式数据处理流程
论文地址: The Change You Want To Detect: Semantic Change Detection In Earth Observation With Hybrid Data Generation Abstract 摘要内容介绍 📌 问题背景 “Bi-temporal change detection at scale based on Very High Resolution (VHR) images is crucia…...

10万QPS高并发请求,如何防止重复下单
1. 前端拦截 首先因为是10万QPS的高并发请求,我们要保护好系统,那就是尽可能减少用户无效请求。 1.1 按钮置灰 很多用户抢票、抢购、抢红包等时候,为了提高抢中的概率,都是疯狂点击按钮。会触发多次请求,导致重复下…...

Xilinx IP 解析之 Block Memory Generator v8.4 ——02-如何配置 IP(仅 Native 接口)
相关文章: Xilinx IP 解析之 Block Memory Generator v8.4 ——01-手册重点解读(仅Native RAM) – 徐晓康的博客 Xilinx IP 解析之 Block Memory Generator v8.4 ——02-如何配置 IP(仅 Native RAM) – 徐晓康的博客 V…...

什么是高考?高考的意义是啥?
能见到这个文章的群体,应该都经历过高考,突然想起“什么是高考?意义何在?” 一、高考的定义与核心功能 **高考(普通高等学校招生全国统一考试)**是中国教育体系的核心选拔性考试,旨在为高校选拔…...
RISC-V 开发板 + Ubuntu 23.04 部署 open_vins 过程
RISC-V 开发板 Ubuntu 23.04 部署 open_vins 过程 1. 背景介绍2. 问题描述3. 解决过程3.1 卸载旧版本3.2 安装 Suitesparse v5.8.03.3 安装 Ceres Solver v2.0.03.4 解决编译爆内存问题 同步发布在个人笔记RISC-V 开发板 Ubuntu 23.04 部署 open_vins 过程 1. 背景介绍 最近…...