Я немного читал заголовки форматирования и переопределял BOOST_CHECK_NO_THROW_IMPL в своем собственном файле заголовка, который я использую в проекте, чтобы переопределить поведение повышения. Теперь это выглядит следующим образом:
#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)
Пишите где ? Boost Tests предназначены для проверки того, был ли код нарушен не для отладки кода. Разрушено? Это логическое значение: true или false. –
(1) Запись на стандартный вывод (консоль или файл XML, в зависимости от аргументов командной строки тестового бегуна) (2) Если исключение, да он сломан. Но если можно увидеть сообщение об исключении (output of what()), то быстрее узнать, откуда исходит ошибка. – 550
Да, но почему? Тест показал, что код сломан: он выдает исключения, в которых он не должен бросать. Следующий шаг - взять и исправить либо код, либо тест, а не создавать подробные XML-файлы консоли заполнения с мусором. –