2016-01-12 7 views
8

Ich bin sehr neu zu Qt und Qt Quick. Ich validiere das Qt Test Unit-Test-Framework für Qt Quick und kann nicht nachvollziehen, wie die Tests durchgeführt werden. Hier ist, was ich habe, habe ich ein SUBDIRS Projekt mit folgenden Struktur erstellt:Unit-Test für Qt Quick

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 

„Projekt“ die Anwendung getestet und meine Testfälle sind in „Project/Ressourcen/qml.qrc/tst_gui werden. 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") 
    } 
} 

Ich habe einen Knopf mit der ID "click_button" in "Projekt/Resources/qml.qrc/main.qml", die ich simulieren will. Als ich das Testprojekt laufen, bekomme ich Ausfall mit der Meldung:

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 

Ich bin sicher, dass ich etwas falsch mache. Könnte jemand bitte helfen?

+0

Müssen Sie Ihre 'main.qml' Datei nicht importieren? In 'tst_gui.qml' etwas wie' import 'Projekt/Ressourcen/qml.qrc/main.qml "' – Tarod

+0

Ich habe einige verschiedene Methoden ausprobiert, um die Datei main.qml mit der import-Anweisung und einem Alias ​​zu importieren. Beides hat nicht funktioniert. Ich habe schließlich den ganzen qml-Code von 'main.qml' nach' tst_gui.qml' verschoben. Es funktioniert jetzt gut, da der Testfall den click_button jetzt finden kann. – medasumanth

+0

Großartig! :) Ich denke, du solltest deine eigene Antwort schreiben und sie akzeptieren. Glückliche Kodierung! – Tarod

Antwort

2

Endlich konnte ich es zum Laufen bringen. Der Testfall konnte die Schaltfläche nicht finden, da sie sich in einer anderen QML-Datei befand. Ich habe versucht, Eigenschaftsalias zu importieren und zu verwenden, beides hat nicht funktioniert. Ich habe alles in meine tst_gui.qml kopiert (meine main.qml leer gelassen) und es funktioniert jetzt gut.

tst_gui.qml (aktualisiert):

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) 
     } 
    } 
} 

In meinem main.cpp, nenne ich nur das Makro:

QUICK_TEST_MAIN("tst_gui") 

der richtige Weg Wahrscheinlich Unit-Tests zu schreiben, ist zu trennen sie vom tatsächlichen Code. Im Moment funktioniert das für mich.

+0

Hey @medasumanth Ich habe versucht, was auch immer Sie als Lösung erwähnt haben, aber ich bekomme einen Fehler: Das Verzeichnis '/ home/Documents/Testing/Qml_testing_1' enthält keine Testdateien, die 'tst _ *. Qml' entsprechen. Irgendeine Idee zu diesem Fehler? Danke – 1218GG

+0

@ 1218GG hast du sicher, deine qml Datei 'tst_' etwas zu benennen? – Matthias