2017-10-20 54 views
1

Je veux tester une fonction:Comment faire pour tester assert dans la construction de débogage, mais a renvoyé la valeur dans la version?

#include <cassert> 

int my_func(int myParam) { 
    int ret = 0 
    if (myParam >= 10) { 
     assert(false); 
     // Logger call like `qCritical << "myParam is too big. Returning 0";` 
    } else { 
     ret = myParam * 2; 
    } 
    return ret; 
} 

assert() s ne sont activés que dans la version de débogage. Je veux écrire des tests qui passeront si les tests ont été construits avec la configuration de débogage ou pas (je suppose que c'est la bonne façon ou est-ce que c'est raisonnable d'écrire des tests seulement pour une configuration spécifique?). Donc, avec une entrée de test, par exemple, 999:

  1. Si elle est construite avec la configuration de débogage le test doit attendre un accident (du assert()).
  2. Mais sans la configuration de débogage, le test doit s'attendre à une valeur de retour de 0.

Je connais EXPECT_DEBUG_DEATH, qui ne s'attend à un crash que s'il est construit avec la configuration de débogage. Mais je ne vois pas une macro de test pour attendre une valeur de retour spécifique seulement si construit sans la configuration de débogage.

+2

êtes-vous à la recherche de '#ifdef NDEBUG'? – user463035818

+0

... ou '#ifndef NDEBUG' dans votre cas – user463035818

+1

Je pense que c'est le problème de votre makefile, pas le problème de votre code. En gcc/g ++, vous pouvez utiliser assert sans déboguer marcos par défaut. Je pense que vous pouvez sceller cette fonction à 2 mêmes fonctions, on peut utiliser sans interférer par marcos, l'autre par l'inverse. –

Répondre

2

Comme d'autres mentionné ci-dessus, que diriez-vous juste d'employer NDEBUG la directive de pré-processeur? NDEBUG désactive les assertions C standard.

Vous pouvez le faire comme

#ifdef NDEBUG 
TEST_F(FooTest, DISABLED_MyFuncAbortsOnInputBigger10) 
#else 
TEST_F(FooTest, MyFuncAbortsOnInputBigger10) 
#endif 
{ 
    // ... 
    EXPECT_DEATH(/* .. */); 
} 

#ifdef NDEBUG 
TEST_F(FooTest, MyFuncLogsInvalidInput) 
#else 
TEST_F(FooTest, DISABLED_MyFuncLogsInvalidInput) 
#endif 
{ 
    // ... 
} 

De cette façon, votre test de mort est désactivé lorsque vous compilez et exécutez votre suite de test en mode de libération. En mode débogage, le test de décès est actif.

Le préfixe DISABLED_ dans le nom du test vous permet de désactiver un test mais de continuer à compiler le code de test. Vous pouvez lire à ce sujet dans le AdvancedGuide.