IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Chapter 3: Simulating GUI Events

Howe to simulate GUI events.

Article lu   fois.

L'auteur

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

Chapter 3: Simulating GUI Events▲

Qt Test features some mechanisms to test graphical user interfaces. Instead of simulating native window system events, Qt Test sends internal Qt events. That means there are no side-effects on the machine the tests are running on.

This chapter demonstrates how to write a simple GUI test.

Writing a GUI Test▲

This time, let's assume you want to test the behavior of our QLineEdit class. As before, you will need a class that contains your test function:

 
Sélectionnez
#include <QtWidgets>
#include <QTest>

class TestGui: public QObject
{
    Q_OBJECT

private slots:
    void testGui();

};

The only difference is that you need to include the Qt GUI class definitions in addition to the QTest namespace.

 
Sélectionnez
void TestGui::testGui()
{
    QLineEdit lineEdit;

    QTest::keyClicks(&lineEdit, "hello world");

    QCOMPARE(lineEdit.text(), QString("hello world"));
}

In the implementation of the test function, we first create a QLineEdit. Then, we simulate writing "hello world" in the line edit using the QTest::keyClicks() function.

The widget must also be shown in order to correctly test keyboard shortcuts.

QTest::keyClicks() simulates clicking a sequence of keys on a widget. Optionally, a keyboard modifier can be specified as well as a delay (in milliseconds) of the test after each key click. In a similar way, you can use the QTest::keyClick(), QTest::keyPress(), QTest::keyRelease(), QTest::mouseClick(), QTest::mouseDClick(), QTest::mouseMove(), QTest::mousePress() and QTest::mouseRelease() functions to simulate the associated GUI events.

Finally, we use the QCOMPARE() macro to check if the line edit's text is as expected.

Preparing the Stand-Alone Executable▲

As before, to make our test case a stand-alone executable, the following two lines are needed:

 
Sélectionnez
QTEST_MAIN(TestGui)
#include "testgui.moc"

The QTEST_MAIN() macro expands to a simple main() method that runs all the test functions, and since both the declaration and the implementation of our test class are in a .cpp file, we also need to include the generated moc file to make Qt's introspection work.

Building the Executable▲

You can build the test case executable using CMake or qmake.

Building with CMake▲

Configure your build settings in your CMakeLists.txt file:

 
Sélectionnez
cmake_minimum_required(VERSION 3.16)
project(tutorial3 LANGUAGES CXX)

set(CMAKE_AUTOMOC ON)

if(NOT DEFINED INSTALL_EXAMPLESDIR)
    set(INSTALL_EXAMPLESDIR "examples")
endif()

set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/qtestlib/tutorial3")

find_package(Qt6 REQUIRED COMPONENTS Core Gui Test Widgets)

qt_add_executable(tutorial3
    testgui.cpp
)

set_target_properties(tutorial3 PROPERTIES
    WIN32_EXECUTABLE TRUE
    MACOSX_BUNDLE TRUE
)

target_link_libraries(tutorial3 PUBLIC
    Qt::Core
    Qt::Gui
    Qt::Test
    Qt::Widgets
)

install(TARGETS tutorial3
    RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
    BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
    LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)

Next, from the command line, run either cmake or use the qt-cmake convenience script located in Qt-prefix/<version>/<platform>/bin/qt-cmake:

 
Sélectionnez
&lt;Qt-prefix&gt;/&lt;version&gt;/&lt;platform&gt;/bin/qt-cmake &lt;source-dir&gt; &lt;build-dir&gt; -G Ninja

Then, run your preferred generator tool to build the executable. Here, we're using Ninja:

 
Sélectionnez
ninja

Building with qmake▲

Configure your build settings in your .pro file:

 
Sélectionnez
QT += widgets testlib

SOURCES = testgui.cpp

# install
target.path = $$[QT_INSTALL_EXAMPLES]/qtestlib/tutorial3
INSTALLS += target

Next, run qmake, and, finally, run make to build your executable:

 
Sélectionnez
qmake
make

Running the Executable▲

Running the resulting executable should give you the following output:

 
Sélectionnez
********* Start testing of TestGui *********
Config: Using QtTest library %VERSION%, Qt %VERSION%
PASS   : TestGui::initTestCase()
PASS   : TestGui::testGui()
PASS   : TestGui::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped, 0 blacklisted, 20ms
********* Finished testing of TestGui **

Example project▲

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+