Chapter 4: Replaying GUI Events
在本章中, 我们将展示如何模拟 GUI 事件, 如何存储一系列 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() 函数为数据集命名, 并将事件列表和预期结果流式传输到表中.
我们再次调用 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() 函数在widget上发送事件列表.
最后, 我们使用 QCOMPARE() 宏检查QLineEdit的文本是否符合预期.
同样, 为了使我们的测试用例成为独立的可执行文件, 需要以下两行:
QTEST_MAIN(TestGui)
#include "testgui.moc"
和以前一样, QTEST_MAIN() 宏扩展为一个简单的main()方法, 这个方法运行所有测试函数, 并且由于我们的测试类的声明和实现都在 .cpp 文件中, 因此我们还需要包含生成的 moc 文件以使 Qt 的自省工作.
文件: