2013-02-28 8 views
8

quando prova un metodo che utilizzaBOOST_CHECK_NO_THROW come ottenere messaggio di eccezione stampato

BOOST_CHECK_NO_THROW(method_to_test()); 

e viene generata un'eccezione, visualizza che è stato gettato un'eccezione, ma mai il messaggio di eccezione il in questo modo:

test.cpp(14): error in "test": incorrect exception my_exception is caught 

È possibile stampare anche il messaggio di eccezione, ovvero la stringa restituita da my_exception.what()? my_exception deriva da std::exception e sovraccarichi what().

+0

Scrivici dove ? I test di potenziamento servono a verificare se il codice non funziona per il debug del codice. È rotto? È un valore booleano: vero o falso. –

+0

(1) scrittura sullo standard output (console o file XML, a seconda degli argomenti della riga di comando di prova corridore) (2) Se viene generata un'eccezione, sì, è rotto. Ma se si può vedere il messaggio di eccezione (output di cosa()) è più veloce scoprire da dove viene il bug. – 550

+0

Sì, ma perché? Il test ha mostrato che il codice è rotto: genera eccezioni dove non dovrebbe essere lanciato. Il passo successivo consiste nel prendere e correggere il codice o il test e non creare file XML dettagliati della console di riempimento con garbage. –

risposta

5

Ho letto un po 'nelle intestazioni di boost e ho ridefinito BOOST_CHECK_NO_THROW_IMPL nel mio file di intestazione che utilizzo nel progetto per ridefinire il comportamento di boost. Ora sembra che questo:

#ifndef _CATCH_BOOST_NO_THROW_H_ 
#define _CATCH_BOOST_NO_THROW_H_ 

#include <boost/test/unit_test.hpp> 
#include <sstream> 
#include <string> 

#define BOOST_CHECK_NO_THROW_IMPL(S, TL)              \ 
    try {                      \ 
    S;                       \ 
    BOOST_CHECK_IMPL(true, "no exceptions thrown by " BOOST_STRINGIZE(S), TL, CHECK_MSG); } \ 
    catch(const std::exception & e) {               \ 
    std::stringstream ss;                  \ 
    ss << std::endl                    \ 
    << "-----------------------------------------------" << std::endl       \ 
    << "test case: " << boost::unit_test::framework::current_test_case().p_name << std::endl \ 
    << std::endl << "exception message: " << e.what() << std::endl;        \ 
    BOOST_TEST_MESSAGE(ss.str());                \ 
    BOOST_CHECK_IMPL(false, "exception thrown by " BOOST_STRINGIZE(S), TL, CHECK_MSG);  \ 
    }                       \ 
    catch(...) {                    \ 
    std::stringstream ss;                  \ 
    ss << std::endl                    \ 
    << "-----------------------------------------------" << std::endl       \ 
    << "test case: " << boost::unit_test::framework::current_test_case().p_name << std::endl \ 
    << std::endl << "exception message : <unknown exception>" << std::endl;      \ 
    BOOST_TEST_MESSAGE(ss.str());                \ 
    BOOST_CHECK_IMPL(false, "exception thrown by " BOOST_STRINGIZE(S), TL, CHECK_MSG);  \ 
    }                       \ 
    /**/ 

#define BOOST_WARN_NO_THROW(S)   BOOST_CHECK_NO_THROW_IMPL(S, WARN) 
#define BOOST_CHECK_NO_THROW(S)   BOOST_CHECK_NO_THROW_IMPL(S, CHECK) 
#define BOOST_REQUIRE_NO_THROW(S)   BOOST_CHECK_NO_THROW_IMPL(S, REQUIRE) 

#endif // _CATCH_BOOST_NO_THROW_H_ 

Gli svantaggi sono: Funziona finché ci sono cambiamenti in BOOST _ * _ NO_THROW

e

il messaggio di eccezione verrà stampato prima di essere contrassegnato come errore nell'output di test. Questo sembra in primo luogo un po 'noioso, ecco perché raggruppo l'output scrivendo "---" a valle per migliorare la lettura. Ma il codice dopo BOOST_CHECK_IMPL non verrà mai raggiunto.

La soluzione sopra funziona molto bene per me. Sentitevi liberi di usare a, se hai lo stesso whish =)

(Usando CDash per l'uscita CTest, non dimenticare di aumentare il limite di uscita di test, o semplice disabilitare il limite: http://web.archiveorange.com/archive/v/5y7PkVuHtkmVcf7jiWol)

5

Mi sono trovato annoiato dallo stesso problema con BOOST_REQUIRE_NO_THROW. L'ho risolto rimuovendo semplicemente lo BOOST_REQUIRE_NO_THROW. Ciò si traduce in output come:

unknown location(0): fatal error in "TestName": std::runtime_error: Exception message 

e interrompe il test (ma va avanti con il testo seguente), che è quello che volevo. Questo non aiuta molto se si desidera utilizzare BOOST_CHECK_NO_THROW o BOOST_WARN_NO_THROW, però.

+0

Stranamente è la soluzione migliore per me. – Archont