轉自: csdn
fiftymetre(50米深藍)
關于測試驅動開發, C++的庫比較多, 選擇是一個問題.
Boost.Test是一個用于C++開發的測試框架, 類似的還有CPPUnit, 個人認為, CPPUnit過多的照搬了JUnit的框架, 有比較濃厚的Java風格, 用起來總感覺有些束縛, 不是那么native.
CXXTest 我用過Symbian版本的, 好像需要Perl, 不過Symbian本身安裝的時候就需要Perl,
因此對于Symbian上來說還是無所謂,而且使用Perl可以免除一些套路代碼的編寫. (題外話, Symbian啥都要,
裝個Symbian C++ SDK還要JDK1.3.2, 不知道開發J2ME是否需要安裝一個GCC? ) .
Boost.Test可以以#include一行代碼的代價實現一個test-case的編寫, 就測試來說, 越簡單就可以越使得開發者愿意使用,
比起繼承一個基類, 覆蓋其中的一個虛擬函數來說, Boost.Test在某些情況下就顯得十分方便了.
下面是一個Hello,world般的測試例子: 測試你的系統是否1等于2 (玩笑)
#include <boost/test/included/test_engine_monitor.hpp> #1
int test_main(int , char *[]) #2
{
BOOST_CHECK_EQUAL(1 , 2); #3
return 1; #4
throw "Ooops.."; #5
}
#1 就是我前面說的一行代碼的代價
#2 main當然已經被Boost.Test接管了, 我們就用test_main, 等著被調用.
#3 測試宏, 要求1 == 2 . 當然會報錯
#4 按照C的傳統, 如果我們的test_main函數返回非0的值也是一個錯誤.
#5 異常逃出test_main外也是錯誤, 當然這句并不會執行. 舉個例子而已.
然后編譯運行, 例如使用VC, 那么
cl.exe /GX /ID:/boost hello.cpp
D:/boost是我的Boost安裝路徑. 然后運行hello.exe, 結果應該不出意外是報錯2個. 指出文件名, 行號等. 例如
hello.cpp(7): error in "test_main_caller( argc, argv )": check 1 == 2 failed [1 != 2]
D
:/boost/boost/test/impl/test_main.ipp(39): error in
"test_main_caller( argc, argv )": check test_main_result ==
0 || test_main_result == boost::exit_success failed
一個是#3的錯誤, 一個是#4的 .
這是最簡單的情況, 適用于測試不多的情形, 如果測試比較多, 那么就應該將Boost.Test編譯成一個Lib, 然后Link到這個Lib上,
而不是每次都整個編譯一次Boost.Test, 這樣可以節約編譯的時間( 主要花費在#1處).
配合Boost.Build中的Bjam也是一個好主意.