Google C++單元測試架構(Gtest)系列教程之一——入門

來源:互聯網
上載者:User

引言

本文將先介紹單元測試的相關概念,然後引入Google的開源C++單元測試架構Gtest,最後通過編譯、運行Gtest內建的一個測試範例,介紹如何在Unix/Linux下使用Gtest。

單元測試

說到單元測試,大家應該不會陌生。作為軟體開發過程中最低層級的測試環節,單元測試一般由編碼人員自己完成,它的目的是隔離程式組件,並證明這些單個組件滿足預期的功能。在靜態程式分析、代碼檢視之後進行單元測試,可以協助我們在開發過程的早期發現問題。好的測試具備以下特點:

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),以保證該用例在運行前後程式的狀態一致。

2.有效組織架構,清晰的命名。各個測試案例針對不同的測試對象,而對單個測試對象而言,又可能有多個測試案例對應該對象的多個功能。好的習慣是把這些用例以階層的形式組織起來,並使用清晰的命名,使得我們通過閱讀用例名稱即可明了該用例的功能。

3.可移植、可複用。像我們對程式平台性無關的苛刻要求一樣,對於優秀的測試,我們也期望做到在不同的作業系統、編譯器間進行方便地移植。

4.當用例失敗時,提供儘可能多的有效資訊。毋庸置疑,提示資訊越是清晰和全面,越方便我們定位問題、高效地找出程式中的bug。

如今有不少測試架構協助我們完成單元測試,像針對C++的有Google Test、CppUnit,針對C的有CUnit,針對Java的有JUnit,這些測試架構為我們實現獨立、可移植、可複用、有組織的測試提供了條件,使我們能夠專註於編寫程式功能相關的測試代碼。下面介紹Gtest的使用方法。

Google C++單元測試架構

Google C++單元測試架構(簡稱Gtest),可在多個平台上使用(包括Linux, Mac OS X, Windows, Cygwin和Symbian),它提供了豐富的斷言、致命和非致命失敗判斷,能進行值參數化測試、型別參數化測試、“死亡測試”。Gtest是一個開源的項目,其源碼可以從這裡下載,目前的代碼發行版是1.6.0。

編譯

源碼包中的README檔案說明了如何編譯Gtest源碼,目錄msvc、xcode中分別包含了Windows、Mac OS X平台相關的專案檔,cmake目錄下是使用CMake進行Makefiles和項目產生的相關檔案,如果你在Unix/Linux下,直接在源碼目錄下執行make命令即可編譯。

如果執行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編譯過後並不需要執行make install命令安裝Gtest相關的標頭檔和庫檔案,對自己的測試代碼進行編譯時間,從目前的目錄引用標頭檔和庫檔案即可。

執行用例

源碼檔案的samples目錄下為我們提供了多個用例,從sample1到sample9,Gtest作者由淺入深為我們講解了Gtest的用法,怎麼執行這些用例呢?

首先進入源碼目錄下的make目錄,其中包含了一個Makefile檔案,執行make命令,make命令執行過後可以看到該目錄下增加了幾個檔案,其中sample1_unittest就是sample1的可執行檔了。執行./sample1_unittest即可看到測試的運行結果:

為編譯產生其他用例的可執行檔,我們可以參照make目錄下的Makefile檔案,或者執行以下步驟:

將gtest-main.a動態庫檔案拷貝到samples目錄下,執行以下命令:

$ g++ -I ../include/ -c sample2_unittest.cc  

以及:

$ g++ -I ../include/ sample2.o sample2_unittest.o gtest_main.a -lpthread -o test2

最後我們得到了sample2的可執行檔test2,經過這幾步,相信大家也懂得了如何產生自己的Gtest測試執行檔案。

小結

本文介紹了良好的測試代碼所具備的一些特點,對Gtest作了簡要介紹,說明了如何編譯Gtest測試代碼、產生Gtest測試可執行檔。接下來的文章將詳細介紹Gtest的使用方法,包括斷言、函數測試、測試韌體、參數化、“死亡測試”等內容。

Reference: googletest project

              《玩轉Google開源C++單元測試架構Google Test系列(gtest)》by CoderZh

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.