gtest -UT测试框架
??gtest是Google公司發(fā)布的一款非常優(yōu)秀的開源C/C++單元測(cè)試框架。gtest測(cè)試框架是google開源的用于在不同平臺(tái)上(Linux,Mac OS X,Windows,Cygwin,Windows CE和Symbian)為編寫C/C++測(cè)試用例的項(xiàng)目。它是基于xUnit架構(gòu)的測(cè)試框架,支持自動(dòng)發(fā)現(xiàn)測(cè)試,豐富的斷言集, 用戶定義的斷言,death測(cè)試,致命與非致命的失敗,類型參數(shù)化測(cè)試,各類運(yùn)行測(cè)試的選項(xiàng)和XML的測(cè)試報(bào)告。
??本文的測(cè)試環(huán)境Ubuntu,用gcc編譯源碼為靜態(tài)庫(kù)(被測(cè)試的源碼接口),而測(cè)試程序用g++編譯。
gtest 環(huán)境安裝
??用命令直接安裝gtest,可直接參考如下的命令操作即可:
~$ sudo apt-get install libgtest-dev /**若是老版本只有這一個(gè)目錄:/usr/src/gtest* ~$ cp /usr/src/gtest ./ -r* ~$ cd gtest*/ /* 這里下載的是最新版本:/usr/src/gtest->googletest 和 /usr/src/googletest* 可以用命令查看安裝的目錄:~$ ls /usr/src*/ ~$ cp /usr/src/googletest ./ -r ~$ cd googletest ~/googletest$ mkdir build ~/googletest$ cd build ~/googletest/build$ cmake .. ~/googletest/build$ make /* make命令執(zhí)行成功后,在build目錄下:* build/googlemock/gtest 生成2個(gè)靜態(tài)庫(kù)文件libgtest_main.a和libgtest.a * 再將庫(kù)文件放到系統(tǒng)目錄下,再使用libgtest_main.a和libgtest.a就像使用系統(tǒng)庫(kù)文件一樣* 這里的靜態(tài)文件也可以不用系統(tǒng)目錄下,存放的路徑中Makefile能找到即可*/ ~/googletest/build$ sudo cp googlemock/gtest/libgtest* /usr/local/lib ~/googletest/build$ sudo cp –r ../googletest/include /usr/include/gtest 斷言
??gtest作為一個(gè)成熟的單元測(cè)試框架,gtest有一些用于判斷值是否與期望一致的斷言。在gtest中斷言分為兩大類:ASSERT_* 和 EXPECT_*。它們的區(qū)別在于:
??a. ASSERT_*類斷言在失敗時(shí),會(huì)立即退出當(dāng)前的測(cè)試用例(即其所在的函數(shù),但不會(huì)結(jié)束整個(gè)測(cè)試)
??b. EXPECT_*類斷言在失敗時(shí),會(huì)繼續(xù)執(zhí)行剩余代碼,不會(huì)退出當(dāng)前測(cè)試用例。
??在每一個(gè)大類中,有分為多個(gè)小類別,它們分別用于不同目的的測(cè)試,如布爾測(cè)試、數(shù)值測(cè)試、字符串測(cè)試等等,下面逐個(gè)介紹它們所定義的宏。
-
布爾測(cè)試
布爾測(cè)試用于測(cè)試給定的值為真還是假,它們包括:
*_TRUE(condition):期望condition為true,若condition為false,則斷言失敗;
*_FALSE(condition):期望condition為false,若condition為true,則斷言失敗;
其中“*“為”ASSERT“或者”EXPECT“,后續(xù)所有的宏都將采用這種形式 -
布數(shù)值比較測(cè)試
數(shù)值比較測(cè)試即比較兩個(gè)數(shù)值之間的大小關(guān)系,它們包括:
*_EQ(expected, actual):expected == actual則成功,否則失敗;
*_NE(expected, actual):expedted != actual則成功,否則失敗;
*_LT(val1, val2):val1 < val2則成功,否則失敗;
*_LE(val1, val2):val1 <= val2 則成功,否則失敗;
*_GT(val1, val2):val1 > val2則成功,否則失敗;
*_GE(val1,val2): val1 >= val2則成功,否則失敗; -
浮點(diǎn)數(shù)類型比較
gtest針對(duì)浮點(diǎn)數(shù)是否相等專門定義了宏,它們包括:
*_FLOAT_EQ(expected, actual):expected與actual相差很小時(shí)成功,否則失敗;
*_DOUBLE_EQ(expected, actual):expected與actual相差很小時(shí)成功,否則失敗;
*_NEAR(val1, val2, abs):|val1 - val2| <= abs時(shí)成功,否則失敗; -
字符串類型比較
對(duì)于字符串,gtest提供字符串相等及不等斷言,但它們都只支持C類型的字符串,不支持C++中的std::string和std::wstring,它們包括:
*_STREQ(expected, actual):同時(shí)支持char*和wchar_t*,expected和actual的字符串內(nèi)容相同則成功,否則失敗;
*_STRNE(str1, str2):同時(shí)支持char*和wchar_t*,str1和str2字符串內(nèi)容不同則成功,否則失敗;
*_STRCASEEQ(expected, actual):只支持char*, expected和actual的字符串內(nèi)容相同則成功,否則失敗;
*_STRCASENE(str1, str2):只支持char*,str1和str2字符串內(nèi)容不同則成功,否則失敗; -
執(zhí)行成功與失敗標(biāo)記
在gtest中,測(cè)試通過(guò)與否有三種狀態(tài),它們對(duì)應(yīng)于一個(gè)枚舉:
enum Type {
?kSuccess, ? ? ?// Succeeded.
?kNonFatalFailure, // Failed but the test can continue.
?kFatalFailure ? ?// Failed and the test should be terminated.
};
每一個(gè)枚舉值都對(duì)應(yīng)一個(gè)宏,通過(guò)這個(gè)宏我們可以返回相應(yīng)的執(zhí)行狀態(tài):
kSuccess:成功,對(duì)應(yīng)的宏為SUCCEED();
kNonFatalFailure:雖然失敗,但當(dāng)前測(cè)試用例的后續(xù)測(cè)試仍然繼續(xù)運(yùn)行,對(duì)應(yīng)ADD_FAIL();
kFatalFailure:致命錯(cuò)誤,當(dāng)前測(cè)試用例后續(xù)測(cè)試不會(huì)執(zhí)行,對(duì)應(yīng)FAIL(); -
異常檢查
gtest中提供檢查代碼是否拋出異常的方法,它們包括:
*_THROW(statement, exception_type):statement如果拋出exception_type類型異常則成功,否則失敗;
*_ANY_THROW(statement):只要statement拋出任何異常則成功,否則失敗;
*_NO_THROW(statement):只要statement拋出任何異常則失敗,否則成功; -
謂詞檢查
在gtest中,有一系列的宏,它們第一個(gè)參數(shù)為運(yùn)行的函數(shù)或可執(zhí)行體(要求返回值能夠轉(zhuǎn)換為bool類型),后續(xù)為執(zhí)行函數(shù)所需要的參數(shù),然后這些宏會(huì)自動(dòng)運(yùn)行這個(gè)函數(shù),如果函數(shù)返回true則斷言成功,否則失敗,它們包括:
*_PRED1(pred, param1):pred位可執(zhí)行體,它接收一個(gè)參數(shù),當(dāng)pred(param1)返回true則斷言成功,否則失敗;
*_PRED2(pred, param1, param2):pred位可執(zhí)行體,它接收兩個(gè)參數(shù),當(dāng)pred(param1, param2)返回true則斷言成功,否則失敗;
… …
gtest中最多提供了對(duì)5個(gè)參數(shù)的支持,即從*_PRED1到*_PRED5。如下測(cè)試代碼:
gtest 單元測(cè)試
??在使用gtest的項(xiàng)目中引入libgtest_main.a和libgtest.a這倆個(gè)靜態(tài)庫(kù)文件和gtest/gtest.h頭文件即可。注:gtest使用了系統(tǒng)的線程庫(kù),所以在項(xiàng)目中還需要引入pthread庫(kù)。
ts_test這個(gè)案例是將gtest的lib文件和頭文件直接和待測(cè)試代碼放在一起使用的,具體用法見 。
代碼覆蓋率測(cè)試工具gcov與lcov
注意事項(xiàng)
collect2: error: ld returned 1 exit status總結(jié)
以上是生活随笔為你收集整理的gtest -UT测试框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零开始的单片机学习(一)
- 下一篇: 原理图端口符号_电气百科:电气原理图和接