QTestLib是否可以在运行时显示正在测试的GUI?

时间:2014-01-14 23:27:11

标签: c++ qt gui-testing qtestlib qttest

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

我现在遇到的问题是使用QTestLib涉及使用QTEST_MAIN宏而不是自己定义main,所以我永远不会有机会展示()正在测试的小部件。所以,另一种说出这个问题的方法是,有没有办法在使用其主函数的应用程序上使用QTestLib?

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

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分: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();
}