Chapter 3: Simulating GUI Events

Qt Test 具有一些测试图形用户界面的机制. Qt Test 发送 Qt 内部事件, 而不是模拟本机窗口系统事件. 这意味着运行测试的机器不会产生副作用.

在本章中, 我们将看到如何编写一个简单的 GUI 测试.

编写一个GUI测试

这次, 假设你想测试 QLineEdit 的行为. 和以前一样, 需要一个包含测试函数的类:


  #include <QtWidgets>
  #include <QtTest/QtTest>

  class TestGui: public QObject
  {
      Q_OBJECT

  private slots:
      void testGui();

  };

唯一的区别是, 除了 QTest 命名空间之外, 你还需要包含 Qt GUI 类定义.


  void TestGui::testGui()
  {
      QLineEdit lineEdit;

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

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

在测试函数中, 我们首先创建一个QLineEdit. 然后我们使用QTest::keyClicks()函数模拟用户在QLineEdit中写入" hello world ".

注意: 我们必须显示widget, 才能正确测试键盘快捷键.

QTest::keyClicks() 模拟单击widget上得一系列按键. 这个函数还可以指定键盘修饰键及每次按键后的延迟时间(单位: ms). 以类似的方式, 你可以使用QTest::keyClick(), QTest::keyPress(), QTest::keyRelease(), QTest::mouseClick(), QTest::mouseDClick(), QTest::mouseMove(), QTest::mousePress(), QTest::mouseRelease()等相关函数模拟GUI事件.

最后, 我们使用QCOMPARE()宏检测QLineEdit的文本是否是所期望的.

同样, 为了使我们的测试用例成为独立的可执行文件, 需要以下两行:


  QTEST_MAIN(TestGui)
  #include "testgui.moc"

和以前一样, QTEST_MAIN() 宏扩展为一个简单的main()方法, 这个方法运行所有测试函数, 并且由于我们的测试类的声明和实现都在 .cpp 文件中, 因此我们还需要包含生成的 moc 文件以使 Qt 的自省工作.

文件: