Google Test在Qt中的使用

單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如C語言中單元指一個函數,Java裏單元指一個類,圖形化的軟件中可以指一個窗口或一個菜單等。總的來說,單元就是人爲規定的最小的被測功能模塊。單元測試是在軟件開發過程中要進行的最低級別的測試活動,軟件的獨立單元將在與程序的其他部分相隔離的情況下進行測試。

Qt Creator 支持四種測試框架,分別是:QtTest、QtQuickTest、Google Test、Boost Test

注:QTestLib框架提供了一個簡單易用的單元測試框架,需要在工程文件中添加Qt+=testlib。

我用過其中的 QtTest 和 Google Test ,QtTest 用起來比較麻煩而 Google Test 比較簡潔好用。

GTest是一個跨平臺的(Liunx、Mac OS X、Windows、Cygwin、Windows CE and Symbian)C++單元測試框架,由Google公司發佈。GTest是爲在不同平臺上爲編寫C++測試而生成的。它提供了豐富的斷言、致命和非致命判斷、參數化、”死亡測試”等等。

一、Google Test的獲取

git clone https://github.com/google/googletest.git

下載好後,解壓縮

unzip googletest-master.zip

二、Qt中使用GTest

1、做測試工作時:在Qt中需要創建“子目錄項目”

2、創建後,提示建立子項目,直接創建PlainC++Application

3、新建“新子項目”,創建自動測試工程

在選擇測試工具時,選擇“GTest”

三、GTest使用細則

斷言/宏測試

Google Test採用一系列的斷言(assertion)來進行代碼測試,這些宏有點類似於函數調用。
當斷言失敗時Google Test將會打印出assertion時的源文件和出錯行的位置,以及附加的失敗信息,用戶可以直接通過“<<”在這些斷言宏後面跟上自己希望在斷言命中時的輸出信息。
測試宏可以分爲兩大類:ASSERT_*和EXPECT_*,這些成對的斷言功能相同,但效果不同。其中ASSERT_*將會在失敗時產生致命錯誤並中止當前調用它的函數執行。EXPECT_*版本的會生成非致命錯誤,不會中止當前函數,而是繼續執行當前函數。通常情況應該首選使用EXPECT_*,因爲ASSERT_*在報告完錯誤後不會進行清理工作,有可能導致內容泄露問題。

gtest中斷言的宏可以分爲兩類:一類是ASSERT宏,另一類就是EXPECT宏了。
1、ASSERT_系列:如果當前點檢測失敗則退出當前函數
2、EXPECT_系列:如果當前點檢測失敗則繼續往下執行
如果你對自動輸出的錯誤信息不滿意的話,也是可以通過operator<<能夠在失敗的時候打印日誌,將一些自定義的信息輸出。

基本斷言

Fatal assertion Nonfatal assertion Verifies
ASSERT_TRUE(condition);  EXPECT_TRUE(condition); condition is true
ASSERT_FALSE(condition); EXPECT_FALSE(condition);   condition is false

 

二值比較

Fatal assertion  Nonfatal assertion  Verifies
ASSERT_EQ(val1,val2); EXPECT_EQ(val1,val2); val1 == val2
ASSERT_NE(val1,val2); EXPECT_NE(val1,val2);  val1 != val2
ASSERT_LT(val1,val2);  EXPECT_LT(val1,val2);  val1 < val2
ASSERT_LE(val1,val2); EXPECT_LE(val1,val2); val1 <= val2
ASSERT_GT(val1,val2); EXPECT_GT(val1,val2); val1 > val2
ASSERT_GE(val1,val2); EXPECT_GE(val1,val2);   val1 >= val2

字符串比較

Fatal assertion Nonfatal assertion Verifies
ASSERT_STREQ(str1,str2);  EXPECT_STREQ(str1,str2);   the two C strings have the same content
ASSERT_STRNE(str1,str2); EXPECT_STRNE(str1,str2);  the two C strings have different content
ASSERT_STRCASEEQ(str1,str2); EXPECT_STRCASEEQ(str1,str2);  the two C strings have the same content, ignoring case
ASSERT_STRCASENE(str1,str2); EXPECT_STRCASENE(str1,str2);  the two C strings have different content, ignoring case

TEST測試用例

TEST是基本的測試方式, 我們傳進測試函數的名字, 調用ASSERT_XX或者EXPECT_XX來測試函數的執行結構和我們預期的是否一致。

TEST_F測試用例

有時候我們希望傳入的參數是一個class的對象, 並且該對象在傳入之前進行了一定的出配置, 並且有好幾個函數的測試都需要用到相同的配置, 爲了避免重複, Googletest 提供了TEST_F 的測試方式。

測試類的撰寫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章