2013-03-27 7 views
7

Ich bin vertraut mit der Standard C++ - Zusicherung funktioniert. Dies hat in meinem Projekt für eine Vielzahl von Testzwecken funktioniert.C++ Assertion-Funktion zu überprüfen, dass Ausnahme ausgelöst wird

Angenommen, ich möchte überprüfen, ob eine bestimmte Ausnahme von meinem Code ausgelöst wird.

Ist es möglich ohne ein Testframework wie CPPUnit zu verwenden?

+0

basierend auf dem Beitrag: http://StackOverflow.com/Questions/37473/How-CanI-Asssert-without-using-abort. Was ist mit dem Schreiben eines Makros, das '' catch'' verwendet? – gongzhitaao

Antwort

-2

in-Code Behauptungen sind in der Regel am Anfang eines Verfahrens verwendet, um, dass bestimmte Voraussetzungen erfüllt waren, um zu bestätigen, vor dem Eintritt dieser besonderen Funktion zum Beispiel:

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

sie sind hier in erster Linie zu fangen Bugs von nicht erfüllten Abhängigkeiten zwischen Methoden oder Klassen.

Assertionen in Test-Frameworks sind unterschiedlich und werden normalerweise für Komponententests verwendet, um sicherzustellen, dass das Gerät zurückgibt, was es benötigt, um zurückzukehren.

Ausnahmen sollten normalerweise ausgelöst werden, wenn die Realität (d. H. Externe Systeme) uns mit einem Fall versehen hat, den der Code nicht verarbeiten kann/sollte. Es ist ein einfacher Ausweg für seltene, aber immer noch zu erwartende Probleme. zum Beispiel - eine Auszeit wartet auf einen Server in der Regel verfügbar. oder, nicht genug Speicher. Ich würde es nicht als Hilfe für die Programmierlogik verwenden.

zu Ihrer Frage, es könnte eine Möglichkeit geben, Ausnahmen in Test-Frameworks zu fangen, indem Sie die getestete Einheit mit try-catch umgehen. aber ich bin mir nicht sicher, ob es wirklich wünschenswert ist.

HTH

+1

Ich sehe nicht, wie das überhaupt hilft. –

2

ein Skelett (nicht getestet)

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

Sie können das gleiche tun CPPUnit does manuell:

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 

Natürlich, wenn Sie verwenden diese Muster viel es, Sinnvoll ist es, hierfür ein Makro zu verwenden.

0

Hier ist ein Ausnahme-Tester, den ich basierend auf @JPlatte und @ Gongzhitaao's Antworten geschrieben habe. Für mein Test-Framework habe ich zwei globale Variablen num_test und num_test_success, die verfolgen, wie viele Tests durchgeführt werden und wie viele über eine Reihe von Tests erfolgreich sind, aber dies kann geändert werden, um Ihren Anforderungen gerecht zu werden.

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;             \ 
                   \ 
} 

Die Makros __FILE__ und __LINE__ in die aktuelle Datei und die Zeilennummer (siehe https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html) erweitern. Die Rautenzeichen innerhalb des Makros teilen dem Präprozessor das Argument als String in die Makroerweiterung mit (siehe http://bruceblinn.com/linuxinfo/Stringification.html).

Verwandte Themen