2016-09-20 5 views
0

In einem Testfall möchte ich eine Funktion testen, die im Debug-Modus eine Assertion für ungültige Eingabe generiert. Dies stoppt leider Catch Testläufer. Gibt es eine Möglichkeit, diese Behauptung zu umgehen, damit der Testläufer weitermacht?Wie kann Assert im Komponententest im Debug-Modus umgangen werden?

Hier ist mein Testfall:

SCENARIO("Simple test case", "[tag]") { 
    GIVEN("some object") { 
     MyObject myobject; 

     WHEN("object is initialized with invalid data") { 
      // method init generates an assertion when parameters are invalid 
      bool result = myObject.init(nullptr, nullptr, nullptr, nullptr); 
      REQUIRE(false == result); 

      THEN("data processing can't be started") { 
      } 
     } 
    } 
} 
+0

Behauptungen sind da, um gegen Fälle zu schützen, die * nie * in einem korrekten Programm passieren sollten. Warum testest du das Unit-Testen? Wenn innerhalb eines korrekten Programms ungültige Parameter auftreten (z. B. durch fehlerhafte Benutzereingaben), sollten Sie Ausnahmen anstelle von Assertions verwenden. – Quentin

+0

@Quentin Tatsächlich ist es eine externe Bibliothek (generiert von Matlab Code Generator), die ich testen möchte. Wir erzeugten einen Wrapper für den generierten Code, aber jetzt nicht wirklich, wenn die Bibliothek mit ungültigen Daten umgehen kann, die im wirklichen Leben passieren könnten, da sie aus Eingabedateien stammen. Ich stimme zu, dass die Verwendung von Ausnahmen eine bessere Lösung sein kann als in unserem Fall. – tommyk

+0

Dies scheint sehr ähnlich zu http://stackoverflow.com/q/38533272/102345 – JBRWilkinson

Antwort

1

Normalerweise assert ist ein Makro, etwas zu tun, wie

#define assert(e) ((void) ((e) \ 
    ? 0 
    : (void)printf ("%s:%u: failed assertion `%s'\n", __FILE__, __LINE__, #e), 
    abort(), // <-- this aborts you program after printf's above 
    0   
) 

und dieses Makro aktiviert ist in Debug-Builds. Genauere Informationen hierzu finden Sie in Ihrem Standard. Wenn Sie also eine binäre Bibliothek haben, mit der Sie Ihre Testfälle verknüpfen, müssen Sie dem Entwicklerteam mitteilen, dass es sich um einen Release-Build handelt, für den keine Aktivierung aktiviert ist , können Sie ihre API nicht für negative Testfälle testen.

Wenn Sie einen Header-only Bibliothek testen müssen oder Sie kompilieren gegen den Quellcode getestet werden, werden Sie brauchen

  1. kompilieren Ihre Testfälle/Suite mit -DNDEBUG; und/oder
  2. definieren Sie Ihre eigene assert Makro (e, g. Einen Fehler zu werfen, die Sie fangen werden) und hoffen, dass Ihre spezifischen assert.h definiert, wenn bereits testen und wird nicht versuchen, es erneut zu definieren (wieder , suchen Sie nach Details in Ihrem Compiler/Std-Bibliotheken header)
Verwandte Themen