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

Qt Quick Test模块功能及架构

Qt Quick Test 是专门为测试 QML 应用程序设计的模块,在 Qt 6.0 中得到了显著增强。

一、主要功能/使用方法

核心功能概述

  1. QML 单元测试框架

    • 提供完整的 QML 测试环境

    • 支持测试用例组织和执行

    • 包含 QML 断言函数和测试结果收集

  2. 测试类型支持

    • 组件功能测试

    • 用户界面行为测试

    • 信号和属性绑定测试

    • 可视化项渲染测试

基本使用方法

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")}}
}

关键测试元素

  1. TestCase

    • 基础测试容器

    • 提供测试函数和断言方法

    • 支持异步测试

  2. SignalSpy

    • 监听信号发射

    • 记录信号发射次数和参数

  3. 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 新特性

  1. 改进的组件创建

    • createTemporaryObject() 更可靠

    • 更好的内存管理

  2. 增强的事件模拟

    • 支持多点触控

    • 更精确的鼠标移动模拟

  3. 更好的调试支持

    • 详细的错误信息

    • 测试失败时的堆栈跟踪

  4. 与 C++ 测试集成

    • 可以在 C++ 测试中嵌入 QML 测试

    • 共享测试基础设施

测试执行

  1. 命令行执行

    qmltestrunner -input tst_example.qml
  2. 输出选项

    • -o file,xml XML 格式输出

    • -o file,txt 文本格式输出

    • -o file,lightxml 轻量级 XML 输出

  3. 测试选择

    • 按名称筛选测试用例

    • 支持通配符匹配

最佳实践

  1. 测试组织

    • 按功能模块分组测试

    • 使用有意义的测试名称

  2. 测试数据

    • 使用 JSON 文件存储测试数据

    • 考虑使用数据驱动测试

  3. 测试稳定性

    • 避免依赖绝对时间

    • 使用 tryCompare 处理异步操作

  4. 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. 测试执行流程

  1. 解析阶段:加载 QML 测试文件,识别测试用例

  2. 初始化阶段:调用 initTestCase()

  3. 执行阶段:按顺序运行测试函数

  4. 清理阶段:调用 cleanupTestCase()

  5. 报告阶段:生成测试结果输出

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 架构改进

  1. QML 引擎优化

    • 更快的组件实例化 (createTemporaryObject)

    • 改进的垃圾回收策略

  2. 测试隔离增强

    • 每个测试用例在独立上下文中运行

    • 更好的资源清理机制

  3. 异步测试改进

    • 更精确的 tryCompare 超时控制

    • 支持 Promise 风格的异步测试

  4. 调试支持

    • 增强的错误位置报告

    • 与 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 组件注入测试依赖

性能优化

  1. 延迟初始化:按需创建测试对象

  2. 智能重绘:最小化不必要的界面更新

  3. 并行化准备:预编译测试 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 - 博客园 在机器人或智能车的自主导航任务中,视觉巡线是一项最为基础且关键的能力之一。通过摄像头实时获取道路图像,并基于图像信息判断行驶路径&#xff0…...

附加模块--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. 背景介绍 最近…...