Chapter 4: Replaying GUI Events¶
How to replay GUI events.
In this chapter, we will show how to simulate a GUI event, and how to store a series of GUI events as well as replay them on a widget.
The approach to storing a series of events and replaying them is quite similar to the approach explained in chapter 2 . All you need to do is to add a data function to your test class:
class TestGui: public QObject { Q_OBJECT private slots: void testGui_data(); void testGui(); };
Writing the Data Function¶
As before, a test function’s associated data function carries the same name, appended by
_data
.void TestGui::testGui_data() { QTest::addColumn<QTestEventList>("events"); QTest::addColumn<QString>("expected"); QTestEventList list1; list1.addKeyClick('a'); QTest::newRow("char") << list1 << "a"; QTestEventList list2; list2.addKeyClick('a'); list2.addKeyClick(Qt::Key_Backspace); QTest::newRow("there and back again") << list2 << ""; }First, we define the elements of the table using the
addColumn()
function: A list of GUI events, and the expected result of applying the list of events on aQWidget
. Note that the type of the first element isQTestEventList
.A
QTestEventList
can be populated with GUI events that can be stored as test data for later usage, or be replayed on anyQWidget
.In our current data function, we create two
QTestEventList
elements. The first list consists of a single click to the ‘a’ key. We add the event to the list using theaddKeyClick()
function. Then we use thenewRow()
function to give the data set a name, and stream the event list and the expected result into the table.The second list consists of two key clicks: an ‘a’ with a following ‘backspace’. Again we use the
addKeyClick()
to add the events to the list, andnewRow()
to put the event list and the expected result into the table with an associated name.
Rewriting the Test Function¶
Our test can now be rewritten:
void TestGui::testGui() { QFETCH(QTestEventList, events); QFETCH(QString, expected); QLineEdit lineEdit; events.simulate(&lineEdit); QCOMPARE(lineEdit.text(), expected); }The TestGui::testGui() function will be executed two times, once for each entry in the test data that we created in the associated TestGui::testGui_data() function.
First, we fetch the two elements of the data set using the
QFETCH()
macro.QFETCH()
takes two arguments: the data type of the element and the element name. Then we create aQLineEdit
, and apply the list of events on that widget using thesimulate()
function.Finally, we use the
QCOMPARE()
macro to check if the line edit’s text is as expected.As before, to make our test case a stand-alone executable, the following two lines are needed:
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.
© 2022 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.