2014-01-14 4 views
7

Der Anwendungsfall ist, ich habe eine Qt-App, und ich möchte automatisieren Benutzer-Stil-Tests davon; das heißt, ich würde gerne keyClicks(), mouseClick() und so weiter verwenden, aber ich möchte, dass das Qt-Anwendungsfenster tatsächlich angezeigt wird, während dies geschieht.Ist es möglich, dass QTestLib die GUI anzeigt, die gerade getestet wird?

Das Problem, das ich jetzt habe, ist, dass die Verwendung QTestLib beinhaltet die QTEST_MAIN Makro anstelle der Definition Haupt mich mit, so dass ich nie eine Chance() zeigen die Widgets getestet. Also, eine andere Möglichkeit, diese Frage zu formulieren, ist, gibt es eine Möglichkeit, QTestLib für eine Anwendung zu verwenden, die ihre Hauptfunktion verwendet?

Ich weiß Squish und wahrscheinlich Testability Driver sind in der Lage, aber wenn es möglich ist, diese Funktionalität ohne zusätzliche Tools zu bekommen, dann wäre das ideal.

+0

Ton sehr viel wie das, was [Squish] (http://www.youtube.com/watch?v=7uJ2U_3eHpI) bereits erreicht. Nur eine Beobachtung ... – Huy

+0

Ich weiß Squish macht das schon, und ich sagte das im letzten Satz der Kritik. Das Hauptproblem ist, dass es keine Chance gibt, dass ein Budget genehmigt wird, das eine Squish-Lizenz für mehrere Tausend Dollar umfasst. – Roderick

Antwort

8

Wie das gemacht wird. Macht Squish völlig überflüssig, aber es erfordert Quellcodezugriff.

Speichern Sie in Ihrer Testklasse einen Zeiger auf die QApplication und alle Widgets, die Sie testen möchten. Speichern Sie zur einfacheren Verwendung einen Zeiger auf das QMainWindow Ihrer Anwendung. Dann instanziieren Sie entweder Ihre Testklasse mit Zeigern zu den Widgets, die Sie testen möchten, oder verwenden Sie window-> findChild(), um alle benötigten Elemente zu erfassen. Beachten Sie, dass Sie app-> processEvents() nach allem aufrufen müssen. Rufen Sie es auf, nachdem Sie das Widget angezeigt haben, sodass alle untergeordneten Widgets angezeigt werden. Rufen Sie es nach der Interaktion mit einem Widget auf, so dass die Interaktion tatsächlich auf der GUI verarbeitet wird. Wenn Sie Dinge brauchen, die langsam genug zum Ansehen sind, verwenden Sie QTest :: qSleep().

+0

Ich versuche genau das zu tun, kannst du bitte deinen Code oder einen Teil davon teilen? – KelvinS

0

@KelvinS. Dies ist mein Codeschnipsel nach der @ VGambit-Methode, die versucht, ein Hinzufügen eines Protokolls zu itemview zu testen.

#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(); 
} 
Verwandte Themen