2013-02-28 8 views
8

gedruckt bekommen, wenn ich eine Methode testen mitBOOST_CHECK_NO_THROW wie Ausnahmemeldung

BOOST_CHECK_NO_THROW(method_to_test()); 

und eine Ausnahme ausgelöst wird, zeigt es dass eine Ausnahme ausgelöst wurde, aber nie die Botschaft Ausnahme wie folgt aus:

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

Kann die Ausnahmebedingungsnachricht auch gedruckt werden, dh die von my_exception.what() zurückgegebene Zeichenfolge? my_exception ist abgeleitet von std::exception und Überladungen what().

+0

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

+0

(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

+0

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

Antwort

5

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)

5

Ich fand mich genervt von dem gleichen Problem mit BOOST_REQUIRE_NO_THROW. Ich löste es, indem ich einfach die BOOST_REQUIRE_NO_THROW entfernte. Daraus ergibt sich folgende Ausgabe:

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

und bricht den Test (aber geht mit dem nächsten Text), das ist, was ich wollte. Dies hilft allerdings nicht sehr, wenn Sie BOOST_CHECK_NO_THROW oder BOOST_WARN_NO_THROW verwenden wollten.

+0

Seltsamerweise ist es die beste Lösung für mich. – Archont