如何用googletest寫單元測試


googletest是一個用來寫C++單元測試的框架,它是跨平台的,可應用在windows、linux、Mac等OS平台上。下面,我來說明如何使用最新的1.6版本gtest寫自己的單元測試。

本文包括以下幾部分:1、獲取並編譯googletest(以下簡稱為gtest);2、如何編寫單元測試用例;3、如何執行單元測試。4、google test內部是如何執行我們的單元測試用例的。

 

1. 獲取並編譯gtest

gtest試圖跨平台,理論上,它就應該提供多個版本的binary包。但事實上,gtest只提供源碼和相應平台的編譯方式,這是為什么呢?google的解釋是,我們在編譯出gtest時,有些獨特的工程很可能希望在編譯時加許多flag,把編譯的過程下放給用戶,可以讓用戶更靈活的處理。這個仁者見仁吧,反正也是免費的BSD權限。

 

源碼的獲取地址:http://code.google.com/p/googletest/downloads/list

 

目前gtest提供的是1.6.0版本,我們看看與以往版本1.5.0的區別:

 

 

就是最下面一行,make install禁用了,郁悶了吧?UNIX的習慣編譯方法:https://blog.csdn.net/russell_tao/article/details/configure;make;make install失靈了,只能說google比較有種,又開始挑戰用戶習慣了。

那么怎么編譯呢?

先進入gtest目錄(解壓gtest.zip包過程就不說了),執行以下兩行命令:

 

 
        


之后,生成了libgtest.a,這個就是我們要的東東了。以后寫自己的單元測試,就需要libgtest.a和gtest目錄下的include目錄,所以,這1文件1目錄我們需要拷貝到自己的工程中。

 

編譯完成后怎么驗證是否成功了呢?(相當不友好!)

 

 
        


如果看到:

 

 

 
        


那么證明編譯成功了。

 

 

2、如何編寫單元測試用例

以一個例子來說。我寫了一個開地址的哈希表,它有del/get/add三個主要方法需要測試。在測試的時候,很自然,我只希望構造一個哈希表對象,對之做許多種不同組合的操作,以驗證三個方法是否正常。所以,gtest提供的TEST方式我不會用,因為多個TEST不能共享同一份數據,而且還有初始化哈希表對象的過程呢。所以我用TEST_F方式。TEST_F是一個宏,TEST_F(classname, casename){}在函數體內去做具體的驗證。

上面是我要執行單元測試的類圖。那么,我需要寫一系列單元測試用例來測試這個類。用gtest,首先要聲明一個類,繼承自gtest里的Test類:

代碼很簡單:

 

 
        



 

然后開始寫測試用例,用例里可以直接使用上面類中的成員。

 

 
        


注意,TEST_F宏會直接生成一個類,這個類繼承自上面我們寫的CHashTableTest類。

 

gtest提供ASSERT_和EXPECT_系列的宏,用於判斷二進制、字符串等對象是否相等、真假等等。這兩種宏的區別是,ASSERT_失敗了不會往下執行,而EXPECT_會繼續。

 

3、如何執行單元測試

首先,我們自己要有一個main函數,函數內容非常簡單:

 

 
        


InitGoogleTest會解析參數。RUN_ALL_TESTS會把整個工程里的TEST和TEST_F這些函數全部作為測試用例執行一遍。

 

 

執行時,假設我們編譯出的可執行文件叫unittest,那么直接執行https://blog.csdn.net/russell_tao/article/details/unittest就會輸出結果到屏幕,例如:

 

 
        

 

 

 
        


如此,一個簡單的單元測試寫完。因為太簡單,所以不需要使用google mock模擬一些依賴。后續我再寫結合google mock來寫一些復雜的gtest單元測試。

下面來簡單說下gtest的工作流程。

 

4、google test內部是如何執行我們的單元測試用例的

首先從main函數看起。

我們的main函數執行了RUN_ALL_TESTS宏,這個宏干了些什么事呢?

 

 
        


原來是調用了UnitTest靜態工廠實例的Run方法!在gtest里,一切測試用例都是Test類的實例!所以,Run方法將會執行所有的Test實例來運行所有的單元測試,看看類圖:

 

為什么說一切單元測試用例都是Test類的實例呢?

我們有兩種寫測試用例的方法,一種就是上面我說的TEST_F宏,這要求我們要顯示的定義一個子類繼承自Test類。在TEST_F宏里,會再次定義一個新類,繼承自我們上面定義的子類(兩重繼承哈)。

第二種就是TEST宏,這個宏里不要求用戶代碼定義類,老人服裝但在google test里,TEST宏還是定義了一個子類繼承自Test類。

所以,UnitTest的Run方法只需要執行所有Test實例即可。

 

每個單元測試用例就是一個Test類子類的實例。它同時與TestResult,TestCase,TestInfo關聯起來,用於提供結果。

當然,還有EventListen類來監控結果的輸出,控制測試的進度等。

以上並沒有深入細節,只是大致幫助大家理解,我們寫的幾個簡單的gtest宏,和單元測試用例,到底是如何被執行的。接下來,我會通過gmock來深入的看看google單元測試的玩法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM