Skip to main content

适用 Qt Quick 的代理测试生成技能

Comments

编写单元测试是软件开发中最耗时、创造性最低的环节之一。开发者每写一个 QML 组件,就必须紧跟着编写等量的测试代码——覆盖属性、信号、鼠标和键盘交互、状态转换以及边缘案例。

在实际工作中,编写一套完整的测试用例所需的时间往往与编写生产代码本身相当,而这项工作考验的是精确性而非创造力——相同的样板代码结构反复出现,一处遗漏或错误的父节点引用就会悄无声息地导致整个测试失效。

Qt Quick Test 技能是 Qt AI 驱动开发工具的重要新成员,帮助开发者自动完成这项工作。只需提供一个或多个 QML 源文件,智能体即可生成可直接运行的 tst_*.qml 测试文件,按需将其接入构建系统,执行测试,并输出结构化的 Markdown 报告——全程无需开发者手动编写任何测试脚手架代码。

AI 驱动的测试编写,结果可靠

这套测试技能的核心承诺很明确:生成的测试严格遵循规范模板(canonical template)和 47 条确定性规则。配套的运行器技能(runner skill)在执行测试时不会修改项目文件,除非开发者通过标志位明确选择启用该行为。

视频:Qt Quick Test 技能在 Claude Code 中的演示

两种技能,一套工作流

qt-qml-test 技能负责测试编写:读取 QML 源文件,对顶层类型进行分类,解析正确的导入路径,并使用 Qt Quick Test 的基础元素——TestCase、SignalSpy、tryCompare 以及完整的鼠标和键盘事件辅助函数——生成  tst_*.qml 文件。qt-qml-test-run 技能负责测试执行:定位 Qt 安装目录,检测 CMake 测试接线是否存在,构建项目,调用  JUnit XML 已编译的测试二进制文件,解析 JUnit XML 输出,并生成 Markdown 报告。两项技能设计上按顺序使用——先编写,后执行——但也可分别独立调用。

单元测试技能的触发时机

只要开发者提出为某个 QML 文件编写测试、生成 Qt Quick Test,或为特定组件的属性或信号增加覆盖的请求,qt-qml-test 技能即会激活。"write tests for MyButton.qml"、"qml test"或"cover all signals in this component"等表述均足以触发。qt-qml-test-run 技能会在 "run my qml tests"、"execute the qmltestrunner"等请求时激活,或在 qt-qml-test 刚生成新测试文件后自然衔接触发。两项技能的作用范围均可灵活调整:单个文件、目录或整个项目均可在一次调用中作为目标。

Qt Quick Test 技能详解

技能触发后,将接管原本需要开发者手动完成的整套工作流:阅读 Qt Quick Test 文档、确定规范结构、解析导入路径、处理各控件的特殊情况,以及在第一条测试运行前配置好构建系统。以下是每个步骤的具体说明。

第 1 步 - 源代码分类

技能读取源 QML 文件,对顶层类型进行分类,从而选择对应的模板变体。

第 2 步 - 导入路径解析

技能解析出使被测组件对测试文件可见的导入声明行。具体做法是读取最近的 CMakeLists.txt,仅搜索 qt_add_qml_module URI 声明。

步骤 3 - 基于 47 条规则生成测试

规范模板将外部 Item { id: root } 包裹在 Component 和 TestCase 周围。该技能应用了 47 条确定性规则,涵盖:

  • 导入与结构——引入 QtQuick 和 QtTest,当测试按名称引用 Controls 类型时,自动添加 QtQuick.Controls。
  • 属性——仅测试显式声明的属性,跳过 anchors 和 currentIndex。
  • 信号与 SignalSpy——每个信号对应一个专属测试函数中的 spy 实例。
  • 鼠标和键盘事件——在输入测试前设置焦点。
  • 尺寸设定——为内联组件定义显式指定宽度和高度。
  • 不可达的内部项——当内部项仅包含 id 而无 objectName 时,该技能会建议添加 objectName 声明并扩展测试覆盖范围。
  • 无效测试函数——每个测试函数必须以至少一条结果断言(compare 或 tryCompare)结尾,且断言须针对操作改变的状态;仅做存在性检查不构成有效的测试体。

QtQuickTest_Copilot_TestCasesTermostat

图:Qt Quick Test 技能在 GitHub Copilot 中对 Qt 恒温器演示应用的使用截图

第 4 步:构建系统检测(qt-qml-test-run)

在运行任何内容之前,运行技能会通过搜索 CMakeLists.txt 文件中的 QUICK_TEST_MAIN、qt_add_test 及相关模式,检查 CMake 测试连接是否已存在。如果匹配到两个或更多模式,则直接使用现有测试框架。如果匹配到的模式少于两个,该技能默认直接针对测试目录调用 qmltestrunner——无需修改任何文件,适用于所有使用相对导入的 tst_*.qml 文件。

第 5 步 - 构建、运行、解析、报告

确定运行模式后,该技能通过 CMake 构建项目(除非传递了 --no-build 参数),调用测试二进制文件或 qmltestrunner 并附带 -o <report.xml>,junitxml 参数,然后使用内置的 Python 脚本解析生成的 JUnit XML 文件。

解析结果——总计数、通过数、失败数、跳过数、耗时、最慢的十个测试用例以及所有失败信息——将以结构化 Markdown 报告的形式写入 tests/reports/ 目录下,文件名含时间戳。控制台摘要显示最终判决行和前三条失败信息。若源文件在上次运行后有改动,将在报告开头标注失败可能为回归问题(regression),并建议先检查 diff。

QtQuickTest_Claude_TestRun_Termostat

图:Qt Quick Test Run 技能在 Claude Code 中的运行结果截图

Qt Quick Test 技能的局限性

针对某个组件生成的测试用例数量,取决于所使用的前沿模型(frontier model)及其算力设置。在最高算力下运行、面对属性丰富的大型组件时,模型会生成完整的测试套件;在较低算力或较小上下文窗口下,模型会优先覆盖最核心的信号和属性。审阅者应将生成结果视为扎实的起点,并针对需要了解应用运行时行为的领域特定不变量和错误路径,手动补充更多测试用例。

某些代理工具(如基于 GPT 5.4 的 GitHub Copilot)在一次性对包含数十个 QML 文档的大型项目调用技能时,可能仅生成样板测试用例。这是因为代理的上下文被分散到所有源文件,对单个组件的分析深度不足,导致测试体较为浅显,几乎只验证对象的实例化。在大型项目中要获得充分覆盖,建议针对每个 QML 文件单独触发技能,而非在一次调用中以整个项目目录为目标。

这套技能专注于 Qt 6 的 QML 测试用例,不涵盖 C++ QtTest、Squish GUI 测试自动化、基于 qmake 的构建系统,以及交叉编译的设备端测试运行。

生成的测试具有 AI 生成单元测试的典型特征:覆盖范围由源文件中声明的公共 API 驱动,而非内部实现路径或运行时数据流。依赖外部状态、网络资源或 QML 源文件中不可见的 C++ 后端对象的测试会被排除,而值由 State/PropertyChanges 块设置的属性需要显式的状态守护操作,而该技能可能无法始终正确推断这些操作。

Qt Quick 3D 图形节点源(Model、Node、相机类型、灯光类型、Skybox、SceneEnvironment)被设计性跳过。将其包裹在规范的 Item { id: root } 模板中,会导致测试报告 PASS,而实际上运行时警告已触发且渲染交互未经测试。基于 View3D 的源和 Qt Quick 3D 材质则受支持,并使用标准模板。

运行器技能不能替代完整的持续集成(CI)基础设施。它仅针对单次本地运行生成并解析测试结果,不管理测试并行性、覆盖率收集或多平台矩阵执行。架构级质量保证和静态分析仍属于 Qt 代码审查技能及 Axivion 等专用工具的范畴。

由于某些工具(如 Claude Desktop)的沙盒环境特性,测试无法在其代理工作流中直接运行。用户需要手动运行已创建的测试

依赖项

qt-qml-test 技能仅需代理具备文件写入能力,无需额外工具。qt-qml-test-run 技能需要满足以下条件:Qt 6 安装环境(需将 qmltestrunner 配置在 PATH 路径或$QT_HOST_PATH/bin/目录下)、用于解析捆绑 JUnit XML 的 Python 3、使用 CMake 接线方案的项目需安装 CMake,以及在报告中使用差异对比功能时需安装 Git。除标准库外,无需安装其他 Python 包。

环境测试

这些技能已在 Claude Code CLI、Claude Desktop(Cowork 模式)、Qt Creator 20 以及 VS Code 中的 GitHub Copilot 上进行了测试。Claude Sonnet 4.6、GPT 5.4 和 Gemini 3.1 Pro 均能提供良好效果。除上述已测试的配置外,对于深度任务,始终推荐使用前沿模型。

获取技能

您可以从我们的 GitHub 代码库中获取 Qt 代理技能 https://github.com/TheQtCompanyRnD/agent-skills。

或者,您也可以直接从 Claude 的插件市场中安装官方 Qt Quick Test 技能,该技能作为 qt-development 插件的一部分提供(搜索 "qt-development")。已安装该插件的用户,只需让 Claude 升级插件即可立即获取新技能。

Comments

Subscribe to our blog

Try Qt 6.11 Now!

Download the latest release here: www.qt.io/download

Qt 6.11 is now available, with new features and improvements for application developers and device creators.

We're Hiring

Check out all our open positions here and follow us on Instagram to see what it's like to be #QtPeople.