UI 层自动化测试详解:Qt Test、QML Test 与 Squish 实战指南
UI 层自动化测试详解Qt Test、QML Test 与 Squish 实战指南在大型 Qt 应用开发中UI 层往往是最容易出现问题的地方例如按钮点击无响应页面切换失败信号槽连接错误QML 属性绑定异常界面升级导致旧功能失效不同分辨率下布局错乱传统测试方式手动启动程序 → 点击按钮 → 查看结果对于简单项目可以接受但是对于工业软件医疗软件自动驾驶软件视觉检测软件大型 Qt/QML 客户端手工测试成本非常高。因此需要 UI 自动化测试。Qt 生态主要有三类方案方案适用场景特点Qt TestC Widget/逻辑测试官方轻量方案Qt Quick TestQML 自动化测试官方 QML 测试框架Squish完整 UI 自动化商业级 GUI 测试平台1. UI 自动化测试整体架构一个典型 Qt 应用UI测试层 | | ---------------- | Qt Test | | QML Test | | Squish | ---------------- | v Qt Application | ---------------- | QWidget | | QML | | C Backend | ----------------测试目标不是测试界面长什么样而是测试用户操作是否正确状态变化是否正确数据流是否正确2. Qt Test 基础介绍Qt Test 是 Qt 官方提供的单元测试框架。模块Qt6::Test或者Qt5::Test主要用于C 类测试QObject 测试信号槽测试Model 测试例如测试CameraController而不是CameraButton3. Qt Test 基本结构假设classCameraController{public:boolopen();};测试#includeQtTestclassTestCamera:publicQObject{Q_OBJECTprivateslots:voidtestOpen();};voidTestCamera::testOpen(){CameraController camera;QVERIFY(camera.open());}QTEST_MAIN(TestCamera)#includetestcamera.moc运行TestCamera.exe输出PASS : TestCamera::testOpen() Totals: 1 passed4. Qt Test 常用断言QVERIFY判断 boolQVERIFY(result);QCOMPARE比较QCOMPARE(actual,expected);例如QCOMPARE(camera.status(),CameraStatus::Running);QSignalSpy测试信号。例如类classDevice{signals:voidconnected();};测试QSignalSpyspy(device,Device::connected);device.connect();QCOMPARE(spy.count(),1);验证connect() ↓ emit connected() ↓ 收到信号5. Qt Test 测试 UI Widget例如Qt WidgetMainWindow | -- QPushButton代码QPushButton button;button.show();QTest::mouseClick(button,Qt::LeftButton);模拟鼠标点击键盘QTest::keyClick(widget,Qt::Key_Return);输入QTest::keyClicks(lineEdit,hello);6. Qt Quick TestQML测试如果项目Qt Quick QML Controls推荐Qt Quick Test。模块Qt6::QuickTest目录tests | -- tst_login.qml7. QML Test 示例界面Login.qmlButton { id: loginButton objectName:loginButton text:Login onClicked: { backend.login() } }注意必须objectName:loginButton测试才能找到。测试tst_login.qmlimport QtQuick import QtTest TestCase { name:LoginTest function test_button() { var button findChild( testCase, loginButton ) mouseClick(button) } }执行qmltestrunner8. QML 测试重点objectName自动化测试最重要的是稳定定位元素。不要Button { }推荐Button { objectName: startButton }测试find: startButton click verify类似WebidloginQtobjectNamelogin9. QML Model 测试例如列表ListView { model:dataModel }测试compare( dataModel.count, 10 )验证数据加载 ↓ Model更新 ↓ UI刷新10. Squish 介绍Squish 是 Froglogic后来被 Qt 收购开发的商业 GUI 自动化测试工具。官网Qt Squish GUI Testing它支持Qt WidgetsQt Quick/QMLWebJavaWindows UI相比 Qt TestSquish 更接近用户真实操作11. Squish 测试架构Test Script | v Squish Runner | v Application Under Test | v Qt Object Tree12. Squish 示例界面Button { objectName: startButton }Squish Pythondeftest_start():clickButton(waitForObject(:startButton))执行squishrunner13. Squish 与 Qt Test 对比功能Qt TestQML TestSquishC单元测试★★★★★×★★QML测试★★★★★★★★★★★★模拟用户操作★★★★★★★★★★跨平台★★★★★★★★★★★★★★★商业支持××★★★★★录制操作××★★★★★CI集成★★★★★★★★★★★★★★★14. 大型 Qt 工程推荐测试分层不要所有东西都使用 UI 自动化。推荐UI Automation ↑ QML Test ↑ ViewModel Test ↑ Business Logic Test ↑ Unit Test比例70% 业务逻辑测试 20% Model/ViewModel测试 10% UI自动化原因UI测试慢不稳定维护成本高15. Qt 项目 CMake 集成目录Project ├── src │ ├── main.cpp │ ├── tests │ │ ├── CMakeLists.txt │ └── tst_camera.cpptests/CMakeLists.txtfind_package( Qt6 REQUIRED COMPONENTS Test ) add_executable( tst_camera tst_camera.cpp ) target_link_libraries( tst_camera Qt6::Test )CTestenable_testing() add_test( NAME CameraTest COMMAND tst_camera )运行ctest16. CI 自动化例如GitLab CIcommit | | build | | unit test | | qml test | | package失败UI按钮测试失败 ↓ 禁止发布17. 工业软件中的实际应用例如视觉检测软件MainWindow | -- CameraPage | -- AlgorithmPage | -- ResultPage | -- SettingPage测试相机页面打开页面 ↓ 点击连接 ↓ 等待状态变化 ↓ 显示Online参数页面修改曝光时间 ↓ 点击保存 ↓ 配置文件更新 ↓ 重新打开保持数据回放加载文件 ↓ 点击播放 ↓ 时间轴移动 ↓ 数据显示18. UI 自动化最佳实践1. 给控件稳定ID不要Button{}使用Button { objectName: saveConfigButton }2. 不测试像素不要第100个像素必须是红色测试状态Success3. UI和业务分离不要Button 直接操作硬件应该Button ↓ ViewModel ↓ Controller ↓ Hardware这样测试容易。19. Qt项目推荐组合对于现代 Qt6 QML 项目推荐单元测试Qt Test测试C类ControllerServiceQML测试Qt Quick Test测试页面加载属性绑定Model回归测试Squish测试用户流程完整业务总结Qt UI 自动化测试不是单纯测试按钮点击而是一套完整质量体系。三种主要方案Qt Test定位C 后端和业务逻辑测试优点官方免费快速Qt Quick Test定位QML界面测试优点原生支持QML轻量Squish定位企业级UI回归测试优点模拟真实用户支持录制适合大型商业软件对于Qt6 QML C 工业视觉软件推荐架构Qt Test | | 业务层测试 Qt Quick Test | | QML页面测试 Squish | | 完整用户流程测试三者结合可以形成类似汽车、医疗、工业控制软件中的自动化质量体系。

相关新闻