如何通过 QTest 访问 QMessageBox
How can I get access to a QMessageBox by QTest
我正在使用 QTest.
在我的应用程序中创建一些自动化 GUI 测试
我可以使用以下命令从我的应用程序访问小部件:
savePushButton = mainWindow->findChild<QPushButton *>("savePushButton");
工作正常,但现在我必须单击 QMessageBox 的确定按钮。
我在我的应用程序中创建了 QMessageBox,如下所示:
if( something_wrong )
{
QMessageBox::warning(new Widget(), "Title", "Something wrong!");
}
我怎样才能访问此 QMessageBox 及其按钮?
查看 Qt's auto tests:
通常会有所帮助
void ExecCloseHelper::timerEvent(QTimerEvent *te)
{
if (te->timerId() != m_timerId)
return;
QWidget *modalWidget = QApplication::activeModalWidget();
if (!m_testCandidate && modalWidget)
m_testCandidate = modalWidget;
if (m_testCandidate && m_testCandidate == modalWidget) {
if (m_key == CloseWindow) {
m_testCandidate->close();
} else {
QKeyEvent *ke = new QKeyEvent(QEvent::KeyPress, m_key, Qt::NoModifier);
QCoreApplication::postEvent(m_testCandidate, ke);
}
m_testCandidate = Q_NULLPTR;
killTimer(m_timerId);
m_timerId = m_key = 0;
}
}
从该代码来看,您可以通过QApplication::activeModalWidget()
获取消息框。测试本机(我假设它们是本机的)小部件很困难,这可能是他们选择发送关键事件的原因,因为您不需要知道,例如这些按钮的位置,就像单击鼠标一样。
我找到了以下 link 的解决方案:http://www.qtcentre.org/threads/31239-Testing-modal-dialogs-with-QTestLib。
它使用命令QApplication::topLevelWidgets();
获取小部件列表。然后它搜索消息框小部件并模拟关闭消息框的按键输入 (QTest::keyClick(mb, Qt::Key_Enter);
)。
示例:
void MyTest::testDialog()
{
QTimer::singleShot(500, this, SLOT(timeOut()));
QVERIFY(functionThatProducesMessageBox());
}
void MyTest::timeOut()
{
QWidgetList allToplevelWidgets = QApplication::topLevelWidgets();
foreach (QWidget *w, allToplevelWidgets) {
if (w->inherits("QMessageBox")) {
QMessageBox *mb = qobject_cast<QMessageBox *>(w);
QTest::keyClick(mb, Qt::Key_Enter);
}
}
}
头文件必须包含Q_OBJECT宏才能使用信号和槽机制。
示例:
class MyClass: public QWidget
{
Q_OBJECT
public:
...
它对我来说效果很好,因为当消息框出现时 UI(线程)被阻塞。
注意:记得在添加Q_OBJECT宏的时候重建工程。
我正在使用 QTest.
在我的应用程序中创建一些自动化 GUI 测试我可以使用以下命令从我的应用程序访问小部件:
savePushButton = mainWindow->findChild<QPushButton *>("savePushButton");
工作正常,但现在我必须单击 QMessageBox 的确定按钮。
我在我的应用程序中创建了 QMessageBox,如下所示:
if( something_wrong )
{
QMessageBox::warning(new Widget(), "Title", "Something wrong!");
}
我怎样才能访问此 QMessageBox 及其按钮?
查看 Qt's auto tests:
通常会有所帮助void ExecCloseHelper::timerEvent(QTimerEvent *te)
{
if (te->timerId() != m_timerId)
return;
QWidget *modalWidget = QApplication::activeModalWidget();
if (!m_testCandidate && modalWidget)
m_testCandidate = modalWidget;
if (m_testCandidate && m_testCandidate == modalWidget) {
if (m_key == CloseWindow) {
m_testCandidate->close();
} else {
QKeyEvent *ke = new QKeyEvent(QEvent::KeyPress, m_key, Qt::NoModifier);
QCoreApplication::postEvent(m_testCandidate, ke);
}
m_testCandidate = Q_NULLPTR;
killTimer(m_timerId);
m_timerId = m_key = 0;
}
}
从该代码来看,您可以通过QApplication::activeModalWidget()
获取消息框。测试本机(我假设它们是本机的)小部件很困难,这可能是他们选择发送关键事件的原因,因为您不需要知道,例如这些按钮的位置,就像单击鼠标一样。
我找到了以下 link 的解决方案:http://www.qtcentre.org/threads/31239-Testing-modal-dialogs-with-QTestLib。
它使用命令QApplication::topLevelWidgets();
获取小部件列表。然后它搜索消息框小部件并模拟关闭消息框的按键输入 (QTest::keyClick(mb, Qt::Key_Enter);
)。
示例:
void MyTest::testDialog()
{
QTimer::singleShot(500, this, SLOT(timeOut()));
QVERIFY(functionThatProducesMessageBox());
}
void MyTest::timeOut()
{
QWidgetList allToplevelWidgets = QApplication::topLevelWidgets();
foreach (QWidget *w, allToplevelWidgets) {
if (w->inherits("QMessageBox")) {
QMessageBox *mb = qobject_cast<QMessageBox *>(w);
QTest::keyClick(mb, Qt::Key_Enter);
}
}
}
头文件必须包含Q_OBJECT宏才能使用信号和槽机制。 示例:
class MyClass: public QWidget
{
Q_OBJECT
public:
...
它对我来说效果很好,因为当消息框出现时 UI(线程)被阻塞。
注意:记得在添加Q_OBJECT宏的时候重建工程。