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)
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. –
(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
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. –