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