2014-01-14 5 views
7

Вариант использования: у меня есть приложение Qt, и я хотел бы автоматизировать его тестирование пользователем; то есть я хотел бы использовать keyClicks(), mouseClick() и т. д., но я хотел бы, чтобы окно приложения Qt отображалось на самом деле во время этого события.Возможно ли, чтобы QTestLib отображал графический интерфейс, который он тестирует при запуске?

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что использование QTestLib предполагает использование макроса QTEST_MAIN вместо определения main, поэтому я никогда не получаю возможность показать() тестируемые виджеты. Итак, еще один способ сформулировать этот вопрос: есть ли способ использовать QTestLib для приложения, использующего его основную функцию?

Я знаю, что Squish и, вероятно, Testability Driver способны на это, но если можно получить эту функциональность без использования дополнительных инструментов, то это будет идеально.

+0

Звук очень много, как то, что [хлюпать] (http://www.youtube.com/watch?v=7uJ2U_3eHpI) уже выполняет. Просто наблюдение ... – Huy

+0

Я знаю, что Squish уже делает это, и я сказал это в последнем предложении обзора. Основная проблема заключается в том, что существует нулевая вероятность утверждения бюджета, который включает лицензию Squish на несколько тысяч долларов. – Roderick

ответ

8

Выяснено, как это сделать. Делает Squish совершенно ненужным, но требует доступа к исходному коду.

В вашем тестовом классе сохраните указатель на QApplication и любые виджеты, которые вы хотите проверить. Для удобства использования сохраните указатель на QMainWindow вашего приложения. Затем либо создайте экземпляр вашего тестового класса с указателями на виджеты, которые вы планируете тестировать, либо используйте window-> findChild(), чтобы захватить любой элемент, который вам нужен. Имейте в виду, что вам нужно будет вызвать app-> processEvents() после всего. Вызовите его после отображения виджета, чтобы отображались все дочерние виджеты. Вызовите его после взаимодействия с виджетами, чтобы взаимодействие фактически обрабатывалось в графическом интерфейсе. Если вам нужно, чтобы вещи были достаточно медленными, чтобы смотреть, используйте QTest :: qSleep().

+0

Я пытаюсь сделать именно это, можете ли вы поделиться своим кодом или его частью? – KelvinS

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

 Смежные вопросы

  • Нет связанных вопросов^_^