Przeczytałem trochę w nagłówkach doładowań i przedefiniowałem BOOST_CHECK_NO_THROW_IMPL w moim własnym pliku nagłówkowym, którego używam w projekcie, aby przedefiniować zachowanie doładowania. Teraz wygląda to tak:
#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_
Wadami są: To działa tak długo, jak istnieją żadne zmiany w BOOST _ * _ NO_THROW
i
komunikat wyjątku zostaną wydrukowane, zanim zostanie oznaczony jako błąd w wynikach testu. To na pierwszy rzut oka wygląda na kiepskie, dlatego grupuję wyjście, pisząc "---" na zewnątrz, aby poprawić odczyt. Ale kod po BOOST_CHECK_IMPL nigdy nie zostanie osiągnięty.
Powyższe rozwiązanie działa całkiem nieźle. Zapraszam do korzystania, jeśli masz taką samą zażyczyć =)
(Korzystanie CDash dla ctest wyjścia, nie zapomnij, aby zwiększyć limit wyjścia testowego, albo prosty wyłączyć limit: http://web.archiveorange.com/archive/v/5y7PkVuHtkmVcf7jiWol)
Zapis do miejsca, gdzie ? Testy wzmocnienia służą do sprawdzania, czy kod został złamany, a nie do debugowania kodu. Czy to jest zepsute? Jest to wartość logiczna: prawda lub fałsz. –
(1) zapisu na wyjściu standardowym (konsoli lub XML, w zależności od argumentów polecenia badanego wirnika) (2) Jeśli jest wyjątek, tak że jest uszkodzona. Ale jeśli można zobaczyć komunikat wyjątku (output of what()), to szybciej dowiedzieć się, skąd pochodzi błąd. – 550
Tak, ale dlaczego? Test wykazał, że kod jest uszkodzony: generuje wyjątki tam, gdzie nie powinien się wyrzucać. Następnym krokiem jest zrobienie i naprawienie kodu lub testu, a nie tworzenie szczegółowych plików XML z konsoli wypełnienia ze śmieciami. –