2013-02-28 4 views
8

Когда я тестирую метод, использующийBOOST_CHECK_NO_THROW как получить сообщение об исключении печатных

BOOST_CHECK_NO_THROW(method_to_test()); 

и исключение, он показывает , что было выброшено исключение, но никогда послание Exception в вроде этого:

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

Возможно ли напечатать сообщение об исключении, т.е. строку, возвращаемую my_exception.what()? my_exception получен из std::exception и перегрузки what().

+0

Пишите где ? Boost Tests предназначены для проверки того, был ли код нарушен не для отладки кода. Разрушено? Это логическое значение: true или false. –

+0

(1) Запись на стандартный вывод (консоль или файл XML, в зависимости от аргументов командной строки тестового бегуна) (2) Если исключение, да он сломан. Но если можно увидеть сообщение об исключении (output of what()), то быстрее узнать, откуда исходит ошибка. – 550

+0

Да, но почему? Тест показал, что код сломан: он выдает исключения, в которых он не должен бросать. Следующий шаг - взять и исправить либо код, либо тест, а не создавать подробные XML-файлы консоли заполнения с мусором. –

ответ

5

Я немного читал заголовки форматирования и переопределял 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)

5

Я нашел себя досадной той же проблемой с BOOST_REQUIRE_NO_THROW. Я решил это, просто удалив BOOST_REQUIRE_NO_THROW. Это приводит к выходу, как:

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

и прервет тест (но идет со следующим текстом), который является то, что я хотел. Однако это мало поможет, если вы хотите использовать BOOST_CHECK_NO_THROW или BOOST_WARN_NO_THROW.

+0

Как ни странно, это лучшее решение для меня. – Archont

Смежные вопросы