原文地址:http://hi.baidu.com/shuiyuan2004/blog/item/7d4b43eccdf5c2d32f2e213f.html
C++單元測試架構的比較
單元測試現在已經成為標準的編程實踐,但是C++缺少Java和.Net平台語言的反射機制,所以無法枚舉測試方法,必須手工添加,或者使用一些特別的宏,弄得代碼非常難看。Java語言單元測試是JUnit的天下,C#基本上都用NUnit,而C++則群花怒放,單元測試架構非常多,JUnit移植過來的CppUnit,Boost::test,CppTest,CxxTest, TUT等等。但是解決方案最好的是CxxTest和TUT,CxxTest採用的方法比較特殊,用Perl分析C++的源檔案,從中抽取測試方法,建立TestSuite。文法與JUnit非常相似,沒有使用進階的C++特性,也沒有定義特別的宏,無須寫額外的代碼。TUT也是一個不錯的解決方案,利用進階C++ Template功能,必須比較新的編譯器才支援,比如VC6和VS.NET 2002就不支援,必須VS.NET 2003以上或者Intel C++ Complier 8.1以上。
1、 TUT
結構架構簡單。添加新的測試工作量小;無須註冊測試;可移植性好(因其只需兩個標頭檔,就可以完成測試工作);便於裝卸;提供介面可以擴充其輸出方式等。
最大的優點:輕量級,便於裝卸和可擴充其輸出方式;
缺點:斷言似乎不是很好,只用了一個ensure()函數,不知道對複雜的測試是否支援;輸出的測試結果較為簡單。
2、 Boost::test
結構架構較為複雜。添加新的測試工作量也不大;提供多種測試方法,可註冊測試案例,也可不註冊;可移植性一般;裝卸不易;在控制異常、崩潰方面的能力勝過其它所有對手;擁有良好的斷言功能;大概能支援多種輸出方式,但更改輸出方式不易;支援測試套件。
最大的優點:控制異常崩潰的能力、良好的斷言、輸出結果較為詳細、編寫測試的方法靈活;
缺點:結構架構較為複雜,更改輸出方式不易,裝卸不易。
3、 CXXTest
結構架構的複雜性處於TUT與boost::test之間。添加新的測試工作量非常小;無須註冊測試案例;可移植性很好;便於裝卸;控制異常、崩潰方面的能力也不錯;擁有良好的斷言功能;支援多種輸出方式;支援測試套件。
最大的優點:編譯即測試方式,並且可以雙擊結果行立即定位到相應的原始碼,相當吸引人;支援多種輸出,輸出結果較為詳細;編寫測試簡單;
缺點:需要用到perl對測試代碼進行文法掃描,產生可執行代碼,需要用到makefile檔案(不是必須);準備工作比較麻煩。