Domanda

usi applicativi mio Qt Q_ASSERT_X, che chiama qFatal (), che (per impostazione predefinita) interrompe l'applicazione. Che è grande per l'applicazione, ma mi piacerebbe per sopprimere questo comportamento quando l'unità testare l'applicazione. (Sto usando il Google framework di test.) Ho da test di unità in un separato progetto, che collega in modo statico alla classe sto testando. Il documentazione per qFatal () si legge:

  

chiama il gestore messaggio con il   messaggio msg fatale. Se nessun messaggio   gestore è stato installato, il   messaggio viene stampato a stderr. Sotto   Windows, il messaggio viene inviato al   debugger.

     

Se si utilizza il messaggio predefinito   handler questa funzione interrompe il   sistemi Unix per creare un core dump. Su   Di Windows, per la build di debug, questo   la funzione riporterà un _CRT_ERROR   che consente di collegare un debugger a   l'applicazione.

     

...

     

di sopprimere l'output in fase di esecuzione,   installare il proprio gestore di messaggi con   qInstallMsgHandler ().

Quindi, ecco il mio file main.cpp:

#include <gtest/gtest.h>
#include <QApplication>

void testMessageOutput(QtMsgType type, const char *msg) {
    switch (type) {
    case QtDebugMsg:
        fprintf(stderr, "Debug: %s\n", msg);
        break;
    case QtWarningMsg:
        fprintf(stderr, "Warning: %s\n", msg);
        break;
    case QtCriticalMsg:
        fprintf(stderr, "Critical: %s\n", msg);
        break;
    case QtFatalMsg:
        fprintf(stderr, "My Fatal: %s\n", msg);
        break;
    }
}

int main(int argc, char **argv)
{
    qInstallMsgHandler(testMessageOutput);
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

Ma la mia domanda è ancora ferma al assert. Vi posso dire che il mio gestore personalizzato viene chiamato, perché l'uscita durante l'esecuzione il mio test è:

  

Il mio Fatal: fallimento ASSERT in   MyClass :: doSomething: "doSomething ()",   MyClass.cpp di file, la linea 21 Il programma   ha inaspettatamente terminato.

Che cosa posso fare in modo che i miei test continuare a correre anche quando un'asserzione fallisce?

È stato utile?

Soluzione

Almeno per Qt-4.6.2, non c'è niente che puoi fare.

src/corelib/global/qglobal.cpp definisce void qt_message_output(QtMsgType msgType, const char *buf) che i controlli per vedere se un un gestore è stato installato. Se è così si chiama, altrimenti utilizza i gestori predefiniti. Subito dopo, è quasi sempre Aborts (Unix / MingWn) o chiamate uscita (gli altri).

Non ho potuto trovare un browser per il codice sorgente di corrente on-line, ma il codice sorgente di Qt-4.2.2 è per lo più identico e dovrebbe darvi un'idea generale ciò che sta accadendo.

Altri suggerimenti

Q_ASSERT_X compilazioni a nulla quando si fa una build di rilascio.

Quindi, per unit testing, fare un build di rilascio e non chiamerà qFatal.

-DqFatal = qCritical:)

In alcuni casi si potrebbe non può surpress qFatal e continuare in silenzio, componente testato potrebbe essere in stato tale incidente si verificherà in ogni caso, dopo poche righe. Un modo per evitare che potrebbe essere quella di stub qFatal da qualche parte al vostro codice di prova;)

void qFatal(const char *msg, ...)
{
    QT_THROW(std::some_exception);
}

allora si potrebbe avere un po 'proprio macro assert:

#define CUSTOM_QEXPECT_FAIL( method ) { bool failed = false;\
    try { \
        method ; \
    }\
    catch(...) { \
        failed = true; \
    } \
    QVERIFY(failed); }

e utilizzarlo nel codice come:

CUSTOM_QEXPECT_FAIL( testedObj->panicAtTheDisco() );

Non dicendo che questo è in alcun approccio bel modo, solo cercando di dimostrare che qualcosa può essere fatto per il rilascio.

Inoltre, non ha letto con sufficiente attenzione che si sta collegando staticamente contro classe testato. Stubbing fa probabilmente non lavoro in quel caso, solo se si potrebbe costruire nel vostro eseguibile di prova.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top