轉(zhuǎn)自: csdn
fiftymetre(50米深藍(lán))
關(guān)于測(cè)試驅(qū)動(dòng)開發(fā), C++的庫比較多, 選擇是一個(gè)問題.
Boost.Test是一個(gè)用于C++開發(fā)的測(cè)試框架, 類似的還有CPPUnit, 個(gè)人認(rèn)為, CPPUnit過多的照搬了JUnit的框架, 有比較濃厚的Java風(fēng)格, 用起來總感覺有些束縛, 不是那么native.
CXXTest 我用過Symbian版本的, 好像需要Perl, 不過Symbian本身安裝的時(shí)候就需要Perl,
因此對(duì)于Symbian上來說還是無所謂,而且使用Perl可以免除一些套路代碼的編寫. (題外話, Symbian啥都要,
裝個(gè)Symbian C++ SDK還要JDK1.3.2, 不知道開發(fā)J2ME是否需要安裝一個(gè)GCC? ) .
Boost.Test可以以#include一行代碼的代價(jià)實(shí)現(xiàn)一個(gè)test-case的編寫, 就測(cè)試來說, 越簡單就可以越使得開發(fā)者愿意使用,
比起繼承一個(gè)基類, 覆蓋其中的一個(gè)虛擬函數(shù)來說, Boost.Test在某些情況下就顯得十分方便了.
下面是一個(gè)Hello,world般的測(cè)試?yán)? 測(cè)試你的系統(tǒng)是否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 就是我前面說的一行代碼的代價(jià)
#2 main當(dāng)然已經(jīng)被Boost.Test接管了, 我們就用test_main, 等著被調(diào)用.
#3 測(cè)試宏, 要求1 == 2 . 當(dāng)然會(huì)報(bào)錯(cuò)
#4 按照C的傳統(tǒng), 如果我們的test_main函數(shù)返回非0的值也是一個(gè)錯(cuò)誤.
#5 異常逃出test_main外也是錯(cuò)誤, 當(dāng)然這句并不會(huì)執(zhí)行. 舉個(gè)例子而已.
然后編譯運(yùn)行, 例如使用VC, 那么
cl.exe /GX /ID:/boost hello.cpp
D:/boost是我的Boost安裝路徑. 然后運(yùn)行hello.exe, 結(jié)果應(yīng)該不出意外是報(bào)錯(cuò)2個(gè). 指出文件名, 行號(hào)等. 例如
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
一個(gè)是#3的錯(cuò)誤, 一個(gè)是#4的 .
這是最簡單的情況, 適用于測(cè)試不多的情形, 如果測(cè)試比較多, 那么就應(yīng)該將Boost.Test編譯成一個(gè)Lib, 然后Link到這個(gè)Lib上,
而不是每次都整個(gè)編譯一次Boost.Test, 這樣可以節(jié)約編譯的時(shí)間( 主要花費(fèi)在#1處).
配合Boost.Build中的Bjam也是一個(gè)好主意.