9

ユースケースは、Qt アプリがあり、そのユーザー スタイルのテストを自動化したいと考えています。つまり、keyClicks()、mouseClick() などを使用したいのですが、これが発生している間に Qt アプリケーション ウィンドウが実際に表示されるようにしたいと考えています。

私が今抱えている問題は、 QTestLib を使用すると、 main を自分で定義する代わりに QTEST_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

@ケルビンS。これは、itemview へのログの追加をテストしようとする @VGambit メソッドに続く私のコード スニペットです。

#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 に答える