如何复现GUI事件。 (replay,有翻译重播,重现,我和测试之间经常说的是复现,就翻译成这个了)
在本章中,我们将展示如何模拟GUI事件,以及如何存储一系列GUI事件,并在一个小部件上复现它们。
存储一系列事件并复现它们的方法与第2章中解释的方法非常相似。你需要做的就是在你的测试类中添加一个数据函数:
class TestGui: public QObject
{
Q_OBJECT
private slots:
void testGui_data();
void testGui();
};
编写数据函数
与前面一样,测试函数的相关数据函数具有相同的名称,后面附加_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 << "";
}
首先,我们使用QTest::addColumn()函数定义表的元素:GUI事件列表,以及在QWidget上应用事件列表的预期结果。注意,第一个元素的类型是QTestEventList。
QTestEventList可以用GUI事件填充,这些事件可以存储为测试数据以供以后使用,或者在任何QWidget上复现。
在当前的数据函数中,我们创建了两个QTestEventList元素。第一个列表由单击“a”键组成。我们使用QTestEventList::addKeyClick()函数将事件添加到列表中。然后,我们使用QTest::newRow()函数为数据集指定一个名称,并将事件列表和预期结果流到表中。
第二个列表包含两个键的点击:一个“a”和后面的“退格”。同样,我们使用QTestEventList::addKeyClick()将事件添加到列表中,并使用QTest::newRow()将事件列表和预期结果放入具有关联名称的表中。
重写测试函数
我们的测试现在可以重写:
void TestGui::testGui()
{
QFETCH(QTestEventList, events);
QFETCH(QString, expected);
QLineEdit lineEdit;
events.simulate(&lineEdit);
QCOMPARE(lineEdit.text(), expected);
}
TestGui:: TestGui()函数将被执行两次,对于我们在相关的TestGui::testGui_data()函数中创建的测试数据中的每个条目,执行一次。
首先,我们使用QFETCH()宏获取数据集的两个元素。QFETCH()接受两个参数:元素的数据类型和元素名称。然后,我们创建QLineEdit,并使用QTestEventList::simulate()函数在小部件上应用事件列表。
最后,我们使用QCOMPARE()宏来检查行编辑的文本是否符合预期。
和前面一样,要使我们的测试用例成为一个独立的可执行文件,需要以下两行代码:
QTEST_MAIN(TestGui)
#include "testgui.moc"
宏QTEST_MAIN()扩展为一个简单的main()方法,它运行所有的测试函数,由于我们的测试类的声明和实现都在一个.cpp文件中,我们还需要包含生成的moc文件,以使Qt进行自测工作。