编写单元测试是软件开发中最耗时、创造性最低的环节之一。开发者每写一个 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)结尾,且断言须针对操作改变的状态;仅做存在性检查不构成有效的测试体。

图: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。

图: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 升级插件即可立即获取新技能。