2009-11-23 58 views
1

我剛開始使用CxxTest,並想測試一個std :: vector是否已正確排序。下面是我的測試,到目前爲止:我可以在CxxTest中編寫自定義斷言嗎?

void testSort() { 
    std::sort(vec.begin(), vec.end()); // This could be any sorting function 

    for (unsigned int i = 0; i < vec.size() - 1; ++i) { 
    TS_ASSERT(vec[i] <= vec[i + 1]); 
    } 
} 

顯然,CxxTest不提供TS_ASSERT_SORTED斷言,但有編寫自定義斷言的方法嗎?這將允許我這樣做:

void testSort() { 
    std::sort(vec.begin(), vec.end()); // This could be any sorting function 

    TS_ASSERT_SORTED(vec); 
} 

當用這種方式來寫這個測試時,看到測試的目的是非常容易的。

我查看了CxxTest user's guide,但無法弄清楚是否可以編寫像這樣的自定義斷言。作爲一種選擇,我可以寫一個IsSorted類並執行它的operator()。然後我可以寫這樣的測試:

void testSort() { 
    std::sort(vec.begin(), vec.end()); // This could be any sorting function 

    TS_ASSERT_PREDICATE(IsSorted, vec); 
} 

我猜這是正確的做法。但是,如果我這樣做,我應該將class IsSorted的定義放在它自己的頭文件中,與我的測試套件分開嗎?我仍然試圖找出與單元測試相關的最佳實踐,特別是在這個框架中。

最後一個問題:我應該在setUp()方法中還是在測試本身中排序向量?

回答

1

您可以通過更改cxxtest頭文件來添加一些新的宏。畢竟它是開源的!確保從這些宏中正確地測試失敗(請參閱TS_ASSERT_EQUALS的操作,與martiert給出的示例不兼容cxxtest的工作方式)。

-1

你可以使用的#define


#define TS_ASSERT_PREDICATE(vec)\ 
    std::vector tmp = vec;\ 
    for(int i = 0; i tmp[i+1]) \ 
      return false;\ 
    }\ 
    return true;\ 
} 
+1

'TS_ASSERT'宏必須做的不僅僅是返回一個bool ...否則,當測試失敗時如何輸出變量值? – ThisSuitIsBlackNot 2009-11-23 19:57:24

0

那麼,斷言都只是預處理宏,所以你很可能實現它們不過你想要的,然後#定義爲他們的宏。我認爲最好使用不以TS_ASSERT_開頭的名稱,以免後面的代碼讀者感到困惑。

謂詞版本看起來並不那麼笨拙 - 我可能會這樣做,或者可能在您正在測試的類上實現check_方法,然後從測試中調用它。我經常最終需要驗證類的內部結構以用於運行時調試&日誌記錄的方法,無論如何...

相關問題