2010-05-11 17 views
5

Sto sviluppando un'applicazione GUI in Qt Creator e voglio scrivere alcuni test di unità per esso.Come eseguire i test delle unità qtestlib da QtCreator

Ho seguito This guide per effettuare alcuni test di unità con QtTestlib e il programma viene compilato correttamente. Ma come li eseguo? Mi piacerebbe che venissero eseguiti prima che l'app della GUI si avvii in caso di debug buid e non in esecuzione se release build.

risposta

4

Finalmente capito come eseguire i test prima di avviare l'app.

ho aggiunto un metodo statico nella classe test per eseguire i test:

#include <QtTest/QtTest> 

TestClass::runTests() 
{ 
    TestClass * test = new TestClass(); 

    QTest::qExec(test); 
    delete test; 
} 

Nella funzione principale, vedere:

int main(int argv, char *args[]) 
{ 
    ::TestsClas::runTests(); 

    QApplication app(argv, args); 
    MainWindow mainWindow; 
    mainWindow.setGeometry(100, 100, 800, 500); 
    mainWindow.show(); 

    return app.exec(); 
} 

Il test risultati sono stampati in uscita finestra dell'applicazione.

+7

Non si desidera inquinare l'applicazione principale con il codice di prova. – jkyle

2

Qt creatore non supporta ancora in modo esplicito i test delle unità in esecuzione in questo momento (fino a Qt Creator 2.0beta). Quindi per ora dovrai iniziare i test manualmente.

Se si utilizza un sistema di build come cmake anziché qmake, è possibile provare a eseguire automaticamente i test delle unità come parte del processo di compilazione stesso. Sfortunatamente non sono a conoscenza di alcun metodo per farlo con qmake. CMake è supportato da Qt creator, anche se non così come qmake.

+0

Personalmente, trovo che il supporto per cmake sia abbastanza buono. Uso anche CTEST per eseguire in batch le mie lezioni di test dell'unità QTEST tramite Creator. in una configurazione di build personalizzata. – jkyle

18

Non inserire il codice di prova nel progetto principale. Dovresti creare un progetto separato per i tuoi test unitari, quindi costruirlo ed eseguirlo. Non modificare il tuo progetto principale per eseguire test.

Idealmente, è necessario configurare un server di generazione che invochi automaticamente il progetto di test dell'unità e crea le versioni. Puoi scrivere questo.

Non hackerare mai l'applicazione principale per eseguire i test dell'unità. Se è necessario eseguire il test del livello di integrazione (ossia testare come funziona il programma una volta che è stato completamente compilato e integrato) è necessario utilizzare un diverso framework di test di integrazione che consenta di testare il programma da una fonte esterna. FrogLogic's Squish è uno di questi framework.

+0

Ciao James. Diciamo che ho un'applicazione con un gruppo di articoli menulisti. Ogni voce di menu quando si fa clic mostra un modulo. Come faccio a fare un test unitario che fa clic su ogni voce dell'elenco di menu e controlla se viene mostrato il modulo giusto? – Owen

+3

Non è possibile effettuare un test unitario per questo. Hai bisogno di qualcosa come FrogLogic's Squish per fare questo tipo di test integrati. Il test delle unità è molto più basso rispetto ai test dell'interfaccia utente. Almeno questo è il modo in cui lo capisco.Se trovi che puoi fare questo genere di cose mi piacerebbe sapere, ma tutto ciò che ho letto dice che questo è un uso improprio dei test unitari. –

5

Utilizzare obiettivi multipli e bandiere del preprocessore per raggiungere questo obiettivo:

int main(int argv, char *args[]) 
{ 
#ifdef TEST 
    ::TestsClas::runTests(); 
#endif 
    QApplication app(argv, args); 
    MainWindow mainWindow; 
    mainWindow.setGeometry(100, 100, 800, 500); 
    mainWindow.show(); 

    return app.exec(); 
} 

Poi vai nel pannello progetti e aggiungere un nuovo obiettivo "Test" duplicando "Debug". Sotto istruzioni di generazione, aggiungere un argomento per fare questo è

CXXFLAGS+=-DTEST 

In questo modo il test è incluso nel target di prova, ma non il debug o Release bersagli.

Problemi correlati