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 的单元测试的主要内容,如果未能解决你的问题,请参考以下文章

quick + nimble 单元测试

为啥在 Quick 的单元测试中多次调用 before- 和 afterEach 块?

Qt高级——QTestLib单元测试框架

Qt:使用 Visual Studio 进行单元测试

Qt 单元测试:执行时间

Qt中的单元测试非返回函数[关闭]