2013-02-28 11 views
8

Kiedy przetestować metodę używającBOOST_CHECK_NO_THROW jak dostać komunikat wyjątku drukowane

BOOST_CHECK_NO_THROW(method_to_test()); 

i jest wyjątek, wyświetla że wyjątek został rzucony, ale nigdy przesłanie Wyjątkiem jest takiego:

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

Czy można wydrukować również komunikat o wyjątku, tj. Ciąg zwracany przez my_exception.what()? my_exception pochodzi z std::exception i przeciąża what().

+0

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

+0

(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

+0

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

Odpowiedz

5

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)

5

Znalazłem się zirytowany tym samym problemem z BOOST_REQUIRE_NO_THROW. Rozwiązałem go, po prostu usuwając BOOST_REQUIRE_NO_THROW. W rezultacie otrzymujemy wynik:

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

i przerywa test (ale przechodzi do następnego tekstu), co jest tym, czego chciałem. Nie pomoże to jednak, jeśli chcesz używać BOOST_CHECK_NO_THROW lub BOOST_WARN_NO_THROW.

+0

Co dziwne, to najlepsze rozwiązanie dla mnie. – Archont

Powiązane problemy