9

用例是,我有一个 Qt 应用程序,我想自动化用户风格的测试;也就是说,我想使用 keyClicks()、mouseClick() 等,但我希望 Qt 应用程序窗口在发生这种情况时实际显示。

我现在遇到的问题是使用 QTestLib 涉及使用 QTEST_MAIN 宏而不是自己定义 main ,所以我从来没有机会 show() 正在测试的小部件。所以,这个问题的另一种说法是,有没有办法在使用其主要功能的应用程序上使用 QTestLib?

我知道 Squish 和可能的 Testability Driver 能够做到这一点,但如果可以在不使用额外工具的情况下获得此功能,那将是理想的。

4

2 回答 2

9

想出了如何做到这一点。使 Squish 完全没有必要,但它需要访问源代码。

在您的测试类中,存储指向 QApplication 和您要测试的任何小部件的指针。为了便于使用,存储一个指向应用程序 QMainWindow 的指针。然后,使用指向您计划测试的小部件的指针来实例化您的测试类,或者使用 window->findChild() 来获取您需要的任何元素。请记住,您需要在完成所有操作后调用 app->processEvents()。在显示小部件后调用它,以便显示所有子小部件。在与小部件交互后调用它,以便在 GUI 上实际处理交互。如果您需要足够慢的速度观看,请使用 QTest::qSleep()。

于 2014-01-22T14:11:15.123 回答
0

@KelvinS。这是我遵循@VGambit 方法的代码片段,它尝试测试将日志添加到itemview。

#include <QApplication>
#include <QWidget>
#include <QtTest/QtTest>
#include "guimain.h"`
#include "xlogview.h"`

class TestLogView:public QObject
{
    Q_OBJECT
    public:
        void set_mainwindow(QWidget * qw);
    public slots:
        void startTest();
    private:
        QWidget * m_qw ;

    private slots:
        void addItem();
};
void TestLogView::startTest()
{
    QTest::qExec(this);
}

void TestLogView::set_mainwindow(QWidget * qw)
{
    m_qw = qw;
}
void TestLogView::addItem()
{
    XLogView * test_logview= m_qw->findChild<XLogView*>();
    bool ret = test_logview->addLog("new log");
    QVERIFY (ret == true);
}
#include "main.moc"
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    GUIMain window;
    window.show();
    app.processEvents();
    TestLogView test;
    test.set_mainwindow(&window);
    QTimer::singleShot(1000, &test, SLOT(startTest()));
    return app.exec();
}
于 2017-10-07T13:47:51.067 回答