Qt Quick Test模块功能及架构

news2025/6/9 13:29:30

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

一、主要功能/使用方法

核心功能概述

  1. QML 单元测试框架

    • 提供完整的 QML 测试环境

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

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

  2. 测试类型支持

    • 组件功能测试

    • 用户界面行为测试

    • 信号和属性绑定测试

    • 可视化项渲染测试

基本使用方法

1. 创建测试文件

// tst_example.qml
import QtQuick 2.15
import QtTest 1.15

TestCase {
    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.15

Window {
    visible: true
    width: 400
    height: 300

    TestCase {
        id: mainTest
        name: "MainTests"
        when: windowShown

        function 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: testObject
    signalName: "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 测试的重要基础设施。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2405411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel自动分列开票工具推荐

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

Maven入门(够用)

1、Maven是什么? 这个问题非常不重要,或者说不应该上来就问maven是什么,而是直接学习maven怎么用能干什么,学完之后自然就知道了maven是个什么玩意儿,很多技术都是如此。 2、Maven下载 先准备Java环境,安…

自动化办公集成工具:一站式解决文档处理难题

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…

AUTOSAR实战教程--DoIP_01_配置项解释

配置项 解释 备注 DoIPChannelSARef 引用DoIP Tester的源地址,就是你在DoIP Tester这个Containter中配置的Tester实例。 DoIPChannelTARef 引用目标地址。就是你在DoIPTargetAddress这个Container中的配置。 DoIPPduRRxPduId 为该pdu设置一个ID用于DoIP…

机器人/智能车纯视觉巡线经典策略—滑动窗口+直方图法

作者:SkyXZ CSDN:SkyXZ~-CSDN博客 博客园:SkyXZ - 博客园 在机器人或智能车的自主导航任务中,视觉巡线是一项最为基础且关键的能力之一。通过摄像头实时获取道路图像,并基于图像信息判断行驶路径&#xff0…

503 Service Unavailable:服务器暂时无法处理请求,可能是超载或维护中如何处理?

处理 "503 Service Unavailable" 错误是服务器管理者面临的常见挑战之一。这种错误通常表示服务器暂时无法处理请求,可能是由于服务器超载、维护中或其他临时性问题导致的。在本文中,我将介绍如何处理 "503 Service Unavailable" 错…

虚拟机时间同步

一、常见同步方式 常见的虚拟机同步方式有给虚拟机配置ntp、或者用平台提供的agent对时与虚拟机所在的宿主机。第一种依赖网络、第二种依赖平台的agent这个三方工具。 二、利用ptp_kvm.ko来直接和宿主机同步时间 关键组件 ptp_kvm驱动、chrony。 PTP_KVM同步原理 |--------…

软件更新机制的测试要点与稳定性提升

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

LLMs 系列科普文(11)

目前我们已经介绍了大语言模型训练的两个主要阶段。第一阶段被称为预训练阶段,主要是基于互联网文档进行训练。当你用互联网文档训练一个语言模型时,得到的就是所谓的 base 模型,它本质上就是一个互联网文档模拟器,我们发现这是个…

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…

什么是高考?高考的意义是啥?

能见到这个文章的群体,应该都经历过高考,突然想起“什么是高考?意义何在?” 一、高考的定义与核心功能 **高考(普通高等学校招生全国统一考试)**是中国教育体系的核心选拔性考试,旨在为高校选拔…

Spring Cloud 多机部署与负载均衡实战详解

🧱 一、引言 为什么需要多机部署? 解决单节点性能瓶颈,提升系统可用性和吞吐量 在传统单机部署模式下,系统的所有服务或应用都运行在单一服务器上。这种模式在小型项目或低并发场景中可能足够,但随着业务规模扩大、用…

基于定制开发开源AI智能名片S2B2C商城小程序的首屏组件优化策略研究

摘要:在数字化转型背景下,用户对首屏交互效率的诉求日益提升。本文以"定制开发开源AI智能名片S2B2C商城小程序"为技术载体,结合用户行为数据与认知心理学原理,提出首屏组件动态布局模型。通过分析搜索栏、扫码入口、个人…

EasyRTC嵌入式音视频通信SDK音视频功能驱动视频业务多场景应用

一、方案背景​ 随着互联网技术快速发展,视频应用成为主流内容消费方式。用户需求已从高清流畅升级为实时互动,EasyRTC作为高性能实时音视频框架,凭借低延迟、跨平台等特性,有效满足市场对多元化视频服务的需求。 二、EasyRTC技术…

linux下gpio控制

linux下gpio控制 文章目录 linux下gpio控制1.中断命令控制/sys/class/gpio/export终端命令控制led 2.应用程序控制 3.驱动代码控制 1.中断命令控制 通用GPIO主要用于产生输出信号和捕捉输入信号。每组GPIO均可以配置为输出输入以及特定的复用功能。 当作为输入时,内…

Spring Boot 从Socket 到Netty网络编程(下):Netty基本开发与改进【心跳、粘包与拆包、闲置连接】

上一篇:《Spring Boot 从Socket 到Netty网络编程(上):SOCKET 基本开发(BIO)与改进(NIO)》 前言 前文中我们简单介绍了基于Socket的BIO(阻塞式)与NIO(非阻塞式&#xff0…