QtTest を使用してカスタム Qt ウィジェットのいくつかをテストできるかどうか、調査を行いました。
テストをビルドして実行することができました。また、イベントをシミュレートして で確認することもできましたQSignalSpy
。
テストしようとしているウィジェットは、内部のサブウィジェットを公開していないため、親ウィジェットに対するマウス クリックの位置をシミュレートする必要があります。
何らかの理由で、私はこのアプローチで失敗しています。次のスニペットは、私が達成しようとしていることを示しています。
auto button=new QPushButton("Hello");
auto grpBox = new QGroupBox("Group Box");
grpBox->setLayout(new QVBoxLayout);
grpBox->layout()->addWidget(button);
QSignalSpy spy(button, &QPushButton::clicked);
grpBox->show();
QTest::mouseClick(button, Qt::MouseButton::LeftButton);
QTest::mouseClick(grpBox, Qt::MouseButton::LeftButton, Qt::KeyboardModifier::NoModifier, QPoint(250,70));
QCOMPARE(spy.count(), 2); // 1!=2
最初のクリックは正しく認識されますが、2 回目のクリックは何らかの形で消えます。何故ですか?
フレームワークを正しく使用する方法を本当に理解しているかどうか疑問に思っています.マウスの位置を扱うことは、実用的なテストフレームワークには退屈で壊れやすいようです.
リビジョン:
GUI テストでの座標の使用が非常に脆弱であることは明らかです。findChild
したがって、実際に同じことを行うソリューションを見つけました。
auto button=new QPushButton("Hello");
button->setObjectName("PushButton");
auto grpBox = new QGroupBox("Group Box");
grpBox->setLayout(new QVBoxLayout);
grpBox->layout()->addWidget(button);
QSignalSpy spy(button, &QPushButton::clicked);
grpBox->show();
QTest::mouseClick(button, Qt::MouseButton::LeftButton);
if (auto btn = grpBox->findChild<QPushButton*>("PushButton")) {
QTest::mouseClick(btn, Qt::MouseButton::LeftButton, Qt::KeyboardModifier::NoModifier);
} else {
QVERIFY(false);
}
QCOMPARE(spy.count(), 2);
これにより、2 つの利点が組み合わされます。第一に、座標を扱う必要がなくなり、第二に、テストするウィジェットのコードに触れる必要がなくなりました。
このアプローチでは、すべての gui 要素がobjectName()
簡単な検索メカニズムをサポートする独自のものを持っている場合、有利に思われます。