Qt Quick 的单元测试
Posted
技术标签:
【中文标题】Qt Quick 的单元测试【英文标题】:Unit testing for Qt Quick 【发布时间】:2016-01-12 15:24:57 【问题描述】:我对 Qt 和 Qt Quick 很陌生。我正在验证 Qt Quick 的 Qt Test 单元测试框架,但我无法理解如何运行测试。 这就是我所拥有的,我创建了一个具有以下结构的 SUBDIRS 项目:
ProjectSolution
ProjectSolution.pro
Project
Project.pro
Sources/main.cpp
Resources/qml.qrc/main.qml
ProjectTest
ProjectTest.pro
Sources/main.cpp
Resources/qml.qrc/main.qml
Resources/qml.qrc/tst_gui.qml
“Project”是要测试的应用程序,我的测试用例在“ProjectTest/Resources/qml.qrc/tst_gui.qml”中。
tst_gui.qml:
import QtQuick 2.5
import QtTest 1.0
TestCase
name: "UI Testcase"
when: windowShown
function test_button_click()
mouseClick(click_button, Qt.LeftButton, Qt.NoModifier)
function test_key_press()
keyClick(Qt.Key_Left)
keyClick("a")
我想要模拟的“Project/Resources/qml.qrc/main.qml”中有一个 ID 为“click_button”的按钮。 当我运行测试项目时,我收到消息失败:
FAIL! : tst_gui::UI Testcase::test_button_click() Uncaught exception: click_button is not defined
C:\Users\sjayaprakash\Qt Test Projects\Qt Test Validation\QtTestValidation6\QtTestValidation6Test\tst_gui.qml(9) : failure location
我确定我做错了什么。有人可以帮忙吗?
【问题讨论】:
您不需要导入您的main.qml
文件吗?在tst_gui.qml
中类似于import "Project/Resources/qml.qrc/main.qml"
我尝试了几种不同的方法来导入 main.qml 文件,使用 import 语句和别名。两者都没有工作。我最终将所有 qml 代码从 main.qml
移动到 tst_gui.qml
。它现在工作正常,因为测试用例现在能够找到 click_button。
太棒了! :) 我认为您应该编写自己的答案并接受它。编码愉快!
【参考方案1】:
最后,我能够让它工作。测试用例无法找到该按钮,因为它位于不同的 QML 文件中。我尝试导入和使用属性别名,都不起作用。 我将所有内容都复制到了 tst_gui.qml(将 main.qml 留空),现在可以正常工作了。
tst_gui.qml(更新):
import QtTest 1.0
import QtQuick 2.5
import QtQuick.Window 2.0
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import QtQuick.Dialogs 1.2
import QtQml 2.2
Rectangle
id: main_window
visible: true
width: Screen.width/2
height: Screen.height/2
color: "light grey"
Rectangle
property alias click_button: click_button
id: click_button
width: main_window.width/4
height: main_window.height/14
color: "blue"
x: main_window.width/2 - click_button.width/2
y: main_window.height/2 - main_window.height/4
Text
id: button_text
text: qsTr("Click!")
font.pointSize: 24
color: "white"
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
MouseArea
anchors.fill: parent
onClicked:
//Log to console as a proof of button click simulation
console.log("Button was clicked!")
TextArea
id: textarea
width: main_window.width/2
height: main_window.height/8
x: main_window.width/2 - textarea.width/2
y: (main_window.height/2 - textarea.height/2) + main_window.height/8
focus: true
selectByKeyboard: true
textColor: "darkblue"
textFormat: TextEdit.PlainText
wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere
Keys.onLeftPressed:
//Log to console as a proof of key press simulation
console.log("Left key was pressed!")
TestCase
name: "UI Testcase"
when: windowShown
function test_button_click()
mouseClick(click_button, Qt.LeftButton, Qt.NoModifier)
function test_key_press()
keyClick(Qt.Key_Left)
在我的 main.cpp 中,我只是调用宏:
QUICK_TEST_MAIN("tst_gui")
可能,编写单元测试的正确方法是将它们与实际代码分开。目前,这对我有用。
【讨论】:
嘿@medasumanth 我尝试了上面提到的任何解决方案,但我收到一个错误:目录'/home/Documents/Testing/Qml_testing_1'不包含任何匹配'tst_的测试文件*.qml'。关于这个错误的任何想法?谢谢 @1218GG 你确定将你的 qml 文件命名为tst_
什么吗?以上是关于Qt Quick 的单元测试的主要内容,如果未能解决你的问题,请参考以下文章