需求
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);
}
上面只是示例测试了两个信号,实际使用中,一个测试一个信号。
其他
默认情况下,运行项目将启动示例应用程序。要运行单元测试,您可以更改活动运行配置,使用测试面板或使用菜单 工具 > 测试 > 运行所有测试