Ich habe ein wenig in den Boost-Headern gelesen und BOOST_CHECK_NO_THROW_IMPL in meiner eigenen Header-Datei neu definiert, die ich im Projekt verwende, um das Boost-Verhalten neu zu definieren. Jetzt sieht es wie folgt aus:
#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_
Die Nachteile sind: Es funktioniert, solange es keine Änderungen in BOOST sind _ * _ NO_THROW
und
die Ausnahmemeldung gedruckt wird, bevor es markiert ist als Fehler in der Testausgabe. Das sieht in erster Linie ein bisschen schade aus, deshalb gruppiere ich die Ausgabe, indem ich "---" in den Outstream schreibe, um das Lesen zu verbessern. Aber Code nach BOOST_CHECK_IMPL wird nie erreicht werden.
Die obige Lösung funktioniert ganz gut für mich. Fühlen Sie sich frei zu verwenden, wenn Sie die gleiche whish bekam =)
(mit CDASH für ctest Ausgang, nicht zu vergessen die Testausgabegrenze oder einfach deaktivieren Sie die Grenze zu erhöhen: http://web.archiveorange.com/archive/v/5y7PkVuHtkmVcf7jiWol)
Schreibe wo ? Boost-Tests dienen zur Überprüfung, ob der Code defekt ist, nicht zum Debuggen des Codes. Ist es kaputt? Es ist ein boolescher Wert: wahr oder falsch. –
(1) Schreiben auf der Standardausgabe (Konsole oder XML-Datei in Abhängigkeit von Befehlszeilenargumenten von Test runner) (2) Wenn Ausnahme ausgelöst wird, ja es ist gebrochen. Aber wenn man die Nachricht der Ausnahme (Ausgabe von what()) sehen kann, ist es schneller herauszufinden, wo der Fehler herkommt. – 550
Ja, aber warum? Test hat gezeigt, dass der Code kaputt ist: Er löst Exceptions aus, wo er nicht geworfen werden soll. Der nächste Schritt besteht darin, entweder den Code oder den Test zu übernehmen und zu reparieren und keine detaillierten XML-Dateien der Füllkonsole mit Müll zu erstellen. –