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 的自省工作.

文件: