2017-10-20 156 views
1

我想測試功能:如何在調試版本中測試斷言,但在發佈中返回值?

#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的僅在調試版本啓用。 我想編寫能夠通過測試是否使用調試配置構建測試的測試(我認爲這是正確的方法?還是僅爲特定的構建配置編寫測試?)。因此,與一個測試輸入,例如,999:

  1. 如果與調試配置內置的測試應該會崩潰(從assert())。
  2. 但是如果沒有調試配置,測試應該預期返回值爲0

我知道EXPECT_DEBUG_DEATH,它只有在使用調試配置構建時纔會發生崩潰。但是我沒有看到一個測試宏,只有在內置而沒有調試配置的情況下才會得到特定的返回值。

+2

你在尋找'#ifdef NDEBUG'嗎? – user463035818

+0

...或'#ifndef NDEBUG'在你的案例中 – user463035818

+1

我認爲這是你的makefile的問題,而不是你的代碼的問題。在gcc/g ++中,默認情況下可以使用assert而不用調試marcos。我認爲你可以將這個功能封裝成2個相同的功能,一個可以在不受馬科斯干擾的情況下使用,另一個可以反向使用。 –

回答

2

像上面提到的其他人一樣,使用NDEBUG預處理器指令怎麼樣? NDEBUG禁用標準C斷言。

你可以不喜歡它

#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 
{ 
    // ... 
} 

這樣,當你編譯並在釋放模式運行測試套件你的死亡測試被禁用。在調試模式下,死亡測試處於活動狀態。

測試名稱中的DISABLED_前綴允許您禁用測試但繼續編譯測試代碼。您可以在AdvancedGuide中閱讀。

相關問題