2013-03-27 16 views
7

Jestem zaznajomiony z działaniem standardowej asercji C++. To działało dobrze w moim projekcie dla różnych celów testowych.Funkcja asercji C++ w celu sprawdzenia, czy wyjątek został zgłoszony

Załóżmy na przykład, że chcę sprawdzić, czy określony wyjątek jest zgłaszany przez mój kod.

Czy można to zrobić bez korzystania z platformy testowej, takiej jak CPPUnit?

+0

w oparciu o wpis: http://stackoverflow.com/questions/37473/how-can-i-assert-without-using-abort. A co z pisaniem makra z "catch"? – gongzhitaao

Odpowiedz

-2

in-kodu twierdzenia są zwykle używane na początku sposobu, w celu potwierdzenia, że ​​pewne warunki wstępne zostały spełnione, przed wejściem tej konkretnej funkcji na przykład:

Window::paint() 
{ 
    assert(m_device != NULL); 
    m_device->repaintRegion(); 
} 

są tutaj przede wszystkim do złapania błędów niezerowych zależności między metodami lub klasami.

asercje w frameworkach testowych są różne i zwykle używane do testowania jednostek, aby upewnić się, że urządzenie zwróciło wszystko, co było potrzebne do zwrócenia.

wyjątki powinny być wyrzucane zwykle tam, gdzie rzeczywistość (tj. Systemy zewnętrzne) zapewnia nam przypadek, którego kod nie może/nie powinien obsłużyć. jest to łatwe wyjście z rzadkich, ale wciąż oczekiwanych problemów. na przykład - czas oczekiwania na zwykle dostępny serwer. lub, za mało pamięci. Nie użyłbym tego jako pomocy w programowaniu logiki.

na twoje pytanie, może istnieć sposób na przechwytywanie wyjątków w frameworkach testowych przez otaczanie jednostki testowanej przy użyciu try-catch. ale nie jestem pewien, czy jest to naprawdę pożądane.

HTH

+1

Nie widzę, jak to w ogóle pomaga. –

2

szkielet (NIE TESTOWANY)

#define MY_ASSERT(f, e) {\ 
    try {\ 
     f();\ 
    } catch (std::exception &e) {\ 
     ...\ 
    }\ 
} 
6

Można zrobić to samo CPPUnit does ręcznie:

bool exceptionThrown = false; 

try 
{ 
    // your code 
} 
catch(ExceptionType&) // special exception type 
{ 
    exceptionThrown = true; 
} 
catch(...) // or any exception at all 
{ 
    exceptionThrown = true; 
} 

assert(exceptionThrown); // or whatever else you want to do 

oczywiście, jeśli używasz tego wzorca dużo, to ma sens używanie do tego makra.

0

Oto tester wyjątków, który napisałem na podstawie odpowiedzi @JPlatte i @ gongzhitaao. W moim środowisku testowym mam dwie zmienne globalne: i num_test_success, które śledzą liczbę przeprowadzonych testów i ile z nich zakończyło się powodzeniem w serii testów, ale można to zmienić w zależności od potrzeb.

int num_test; 
int num_test_success; 

#define UT_ASSERT_THROW(expression, ExceptionType) {   \ 
                   \ 
    try {              \ 
     expression;            \ 
     printf("test %d: *** FAILURE ***  %s:%d:%s,%s\n", \ 
       num_test, __FILE__, __LINE__,     \ 
       #expression, #ExceptionType);     \         
    } catch (const ExceptionType &) {       \ 
     printf("test %d: success\n", num_test);    \ 
     ++num_test_success;          \ 
    } catch (...) {            \ 
     printf("test %d: *** FAILURE ***  %s:%d:%s,%s\n", \ 
       num_test, __FILE__, __LINE__,     \ 
       #expression, #ExceptionType);     \ 
    }               \ 
                   \ 
    ++num_test;             \ 
                   \ 
} 

Makra __FILE__ i __LINE__ rozwiń do bieżącego pliku i numer linii (patrz https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html). Znaki funta wewnątrz makra informują preprocesor o miejscu, w którym argument jest łańcuchem do rozszerzenia makra (patrz http://bruceblinn.com/linuxinfo/Stringification.html).

Powiązane problemy