需求

qt 如何进行 gui 单元测试

解决

创建项目

别忘了勾选 gui 选项

获取访问权限

在需要测试的 widget 中需要增加友元类:

class WIDGETSLIBSHARED_EXPORT PanelConcat : public QWidget
{
  Q_OBJECT
  friend class TestPanelConcat;
public:

基本测试

测试生成

测试有没有创建 widget

void TestPanelConcat::TestConstruction()
{
  QVERIFY2(panel.mInputA, "Input field A not created");
  QVERIFY2(panel.mInputB, "Input field B not created");
  QVERIFY2(panel.mLabelRes, "Result label not created");
}

测试重要属性

void TestPanelConcat::TestSize()
{
  QVERIFY2(panel.minimumWidth() == PanelConcat::MIN_W, "Minimum width not set.");
  QVERIFY2(panel.minimumHeight() == PanelConcat::MIN_H, "Minimum height not set");
}

模拟简单使用

可以模拟鼠标和键盘,通过 keyClicks, mouseClick.

void TestPanelConcat::TestClear()
{
  // write into input fields
  QTest::keyClicks(panel.mInputA, STR1);
  QTest::keyClicks(panel.mInputB, STR2);

  // click button CONCAT
  QTest::mouseClick(panel.mButtonConcat, Qt::LeftButton);
  // click button CANCEL
  QTest::mouseClick(panel.mButtonCancel, Qt::LeftButton);

  // check all fields are empty
  QVERIFY2(panel.mInputA->text().isEmpty(), "Input A not empty");
  QVERIFY2(panel.mInputB->text().isEmpty(), "Input B not empty");
  QVERIFY2(panel.mLabelRes->text().isEmpty(), "Label result not empty");
}

数据驱动测试

需要创建后缀是 _data 的私有槽函数,然后通过 addColumn 来添加列, addKeyClicks 来添加动作, newRow 添加数据行.

创建表

const QString STR1("blog.");
const QString STR2("davidecoppola.com");
const QString STR_RES(STR1 + STR2);

void TestPanelConcat::TestConcat_data()
{
  QTest::addColumn<QTestEventList>("inputA");
  QTest::addColumn<QTestEventList>("inputB");
  QTest::addColumn<QString>("result");

  QTestEventList listA;
  QTestEventList listB;
  // -- Normal A + B --
  listA.addKeyClicks(STR1);
  listB.addKeyClicks(STR2);

  QTest::newRow("Normal A + B") << listA << listB << STR_RES;
  // ... more data ...
}

数据表如下:

index name inputA inputB result
0 “Normal A + B” listA listB STR_RES

测试

使用 QFETCH 来获取数据, simulate 模拟作用于 widget 上动作, QCOMPARE 检查结果

void TestPanelConcat::TestConcat()
{
  QFETCH(QTestEventList, inputA);
  QFETCH(QTestEventList, inputB);
  QFETCH(QString, result);

  // write into input fields
  inputA.simulate(panel.mInputA);
  inputB.simulate(panel.mInputB);
  // click button CONCAT
  QTest::mouseClick(panel.mButtonConcat, Qt::LeftButton);

  // compare result
  QCOMPARE(panel.mLabelRes->text(), result);
}

上面只是示例测试了两个信号,实际使用中,一个测试一个信号。

其他

默认情况下,运行项目将启动示例应用程序。要运行单元测试,您可以更改活动运行配置,使用测试面板或使用菜单 工具 > 测试 > 运行所有测试

参考