Я немного почитал заголовки Boost и переопределил BOOST_CHECK_NO_THROW_IMPL в своем собственном заголовочном файле, который я использую в проекте, чтобы переопределить поведение Boost. Теперь это выглядит так:
#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_
Недостатки: Работает пока нет изменений в BOOST_*_NO_THROW
и
сообщение об исключении будет напечатано до того, как оно будет помечено как ошибка в тестовом выводе. Во-первых, это выглядит немного жалко, поэтому я группирую вывод, записывая «---» в исходящий поток, чтобы улучшить чтение. Но код после BOOST_CHECK_IMPL никогда не будет достигнут.
Решение выше работает довольно хорошо для меня. Не стесняйтесь использовать, если у вас есть такое же желание =)
(Используя CDash для вывода ctest, не забудьте увеличить предел вывода теста или просто отключить ограничение: http://web.archiveorange.com/archive/v/5y7PkVuHtkmVcf7jiWol )
person
550
schedule
22.05.2013
BOOST_AUTO_*()
. Но спасибо Тииб! - person 550   schedule 28.02.2013BOOST_<LEVEL>_NO_THROW
. Использование утверждений не должно давать вам меньше информации, чем вы бы получили без них. - person Trebor Rude   schedule 25.04.2013