Google C++单元测试框架(Gtest)系列教程之一——入门
引言
本文將先介紹單元測試的相關概念,然后引入Google的開源C++單元測試框架Gtest,最后通過編譯、運行Gtest自帶的一個測試樣例,介紹如何在Unix/Linux下使用Gtest。
單元測試
說到單元測試,大家應該不會陌生。作為軟件開發(fā)過程中最低級別的測試環(huán)節(jié),單元測試一般由編碼人員自己完成,它的目的是隔離程序部件,并證明這些單個部件滿足預期的功能。在靜態(tài)程序分析、代碼檢視之后進行單元測試,可以幫助我們在開發(fā)過程的早期發(fā)現(xiàn)問題。好的測試具備以下特點:
1.獨立。一個測試用例應該是獨立的,所謂“獨立”,即該測試用例的測試結果不受其他測試的影響,下面的例子簡單地說明了單元測試的獨立性:
1 #include <assert.h> 2 int glob[3] = {1, 2, 3}; 3 int* g_p = glob; 4 int alloc(void) 5 { 6 return *g_p++; 7 } 8 int release(void) 9 { 10 return *g_p--; 11 } 12 void test_1(void) 13 { 14 assert(1 == alloc()); 15 //release(); 16 } 17 void test_2(void) 18 { 19 assert(1 == alloc()); 20 //release(); 21 } 22 int main() 23 { 24 test_1(); 25 test_2(); 26 return 0; 27 }在上面的例子中,test_2的斷言會被拋出,顯然它的運行受到了test_1的影響,test_1中進行了申請(alloc),理應進行釋放(release),以保證該用例在運行前后程序的狀態(tài)一致。
2.有效的組織架構,清晰的命名。各個測試用例針對不同的測試對象,而對單個測試對象而言,又可能有多個測試用例對應該對象的多個功能。好的習慣是把這些用例以層次結構的形式組織起來,并使用清晰的命名,使得我們通過閱讀用例名稱即可明了該用例的功能。
3.可移植、可復用。像我們對程序平臺性無關的苛刻要求一樣,對于優(yōu)秀的測試,我們也期望做到在不同的操作系統(tǒng)、編譯器間進行方便地移植。
4.當用例失敗時,提供盡可能多的有效信息。毋庸置疑,提示信息越是清晰和全面,越方便我們定位問題、高效地找出程序中的bug。
如今有不少測試框架幫助我們完成單元測試,像針對C++的有Google Test、CppUnit,針對C的有CUnit,針對Java的有JUnit,這些測試框架為我們實現(xiàn)獨立、可移植、可復用、有組織的測試提供了條件,使我們能夠專注于編寫程序功能相關的測試代碼。下面介紹Gtest的使用方法。
Google C++單元測試框架
Google C++單元測試框架(簡稱Gtest),可在多個平臺上使用(包括Linux, Mac OS X, Windows, Cygwin和Symbian),它提供了豐富的斷言、致命和非致命失敗判斷,能進行值參數(shù)化測試、類型參數(shù)化測試、“死亡測試”。Gtest是一個開源的項目,其源碼可以從這里下載,目前的代碼發(fā)行版是1.6.0。
編譯
源碼包中的README文件說明了如何編譯Gtest源碼,目錄msvc、xcode中分別包含了Windows、Mac OS X平臺相關的項目文件,cmake目錄下是使用CMake進行Makefiles和項目生成的相關文件,如果你在Unix/Linux下,直接在源碼目錄下執(zhí)行make命令即可編譯。
如果執(zhí)行make的過程中遇到如下出錯提示:
./src/gtest-death-test.cc:970:73: error: ‘clone’ was not declared in this scope make: *** [src/gtest-all.lo] Error 1在/src/gtest-death-test.cc文件中,將第970行的代碼:
970 child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);改成:
970 child_pid = fork();使用make編譯過后并不需要執(zhí)行make install命令安裝Gtest相關的頭文件和庫文件,對自己的測試代碼進行編譯時,從當前目錄引用頭文件和庫文件即可。
執(zhí)行用例
源碼文件的samples目錄下為我們提供了多個用例,從sample1到sample9,Gtest作者由淺入深為我們講解了Gtest的用法,怎么執(zhí)行這些用例呢?
首先進入源碼目錄下的make目錄,其中包含了一個Makefile文件,執(zhí)行make命令,make命令執(zhí)行過后可以看到該目錄下增加了幾個文件,其中sample1_unittest就是sample1的可執(zhí)行文件了。執(zhí)行./sample1_unittest即可看到測試的運行結果:
為編譯生成其他用例的可執(zhí)行文件,我們可以參照make目錄下的Makefile文件,或者執(zhí)行以下步驟:
將gtest-main.a動態(tài)庫文件拷貝到samples目錄下,執(zhí)行以下命令:
$ g++ -I ../include/ -c sample2_unittest.cc以及:
$ g++ -I ../include/ sample2.o sample2_unittest.o gtest_main.a -lpthread -o test2最后我們得到了sample2的可執(zhí)行文件test2,經過這幾步,相信大家也懂得了如何生成自己的Gtest測試執(zhí)行文件。
小結
本文介紹了良好的測試代碼所具備的一些特點,對Gtest作了簡要介紹,說明了如何編譯Gtest測試代碼、生成Gtest測試可執(zhí)行文件。接下來的文章將詳細介紹Gtest的使用方法,包括斷言、函數(shù)測試、測試固件、參數(shù)化、“死亡測試”等內容。
Reference: googletest project
《玩轉Google開源C++單元測試框架Google Test系列(gtest)》by CoderZh總結
以上是生活随笔為你收集整理的Google C++单元测试框架(Gtest)系列教程之一——入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual Studio属性配置中使用
- 下一篇: 在cmd命令行下编译运行C/C++源文件