1、前言
作為乙個成熟的單元測試框架,gtest自然擁有一些用於判斷值是否與期望一致的斷言。在gtest中,斷言分為兩大類:assert_*和expect_*。它們的區別在於,assert_*類斷言在失敗時,會立即退出當前的測試用例(即其所在的函式,但不會結束整個測試);expect_*類斷言在失敗時,會繼續執行,不會退出當前測試用例。
在每乙個大類中,有分為多個小類別,它們分別用於不同目的的測試,如布林測試、數值測試、字串測試等等,下面我們逐個認識gtest中,為它們所定義的巨集。
2、布林測試
布林測試用於測試給定的值為真還是假,它們包括:
*_true(condition):期望condition為true,若condition為false,則斷言失敗;
*_false(condition):期望condition為false,若condition為true,則斷言失敗;
其中「*「為」assert「或者」expect「,後續所有的巨集都將採用這種形式。
3、數值比較測試
數值比較測試即比較兩個數值之間的大小關係,它們包括:
*_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則成功,否則失敗;
4、浮點數型別比較
gtest針對浮點數是否相等專門定義了巨集,它們包括:
*_float_eq(expected, actual):expected與actual相差很小時成功,否則失敗;
*_double_eq(expected, actual):expected與actual相差很小時成功,否則失敗;
*_near(val1, val2, abs):|val1 - val2| <= abs時成功,否則失敗;
5、字串型別比較
對於字串,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字串內容不同則成功,否則失敗;
6、執行成功與失敗標記
在gtest中,測試通過與否有三種狀態,它們對應於乙個列舉:
enum type ;
每乙個列舉值都對應乙個巨集,通過這個巨集我們可以返回相應的執行狀態:
ksuccess:成功,對應的巨集為succeed();
knonfatalfailure:雖然失敗,但當前測試用例的後續測試仍然繼續執行,對應add_fail();
kfatalfailure:致命錯誤,當前測試用例後續測試不會執行,對應fail();
7、異常檢查
gtest中提供檢查**是否丟擲異常的方法,它們包括:
*_throw(statement, exception_type):statement如果丟擲exception_type型別異常則成功,否則失敗;
*_any_throw(statement):只要statement丟擲任何異常則成功,否則失敗;
*_no_throw(statement):只要statement丟擲任何異常則失敗,否則成功;
8、謂詞檢查
在gtest中,有一系列的巨集,它們第乙個引數為執行的函式或可執行體(要求返回值能夠轉換為bool型別),後續為執行函式所需要的引數,然後這些巨集會自動執行這個函式,如果函式返回true則斷言成功,否則失敗,它們包括:
*_pred1(pred, param1):pred位可執行體,它接收乙個引數,當pred(param1)返回true則斷言成功,否則失敗;
*_pred2(pred, param1, param2):pred位可執行體,它接收兩個引數,當pred(param1, param2)返回true則斷言成功,否則失敗;
... ...
gtest中最多提供了對5個引數的支援,即從*_pred1到*_pred5。如下測試**:
bool iseven(int n)
test(hellogtest, firsttest)
它的執行結果如下圖所示:
從圖中可以看到,謂詞斷言比expect_true斷言給了更加詳細的錯誤資訊,為了方便對比,我們給出expect_true的執行結果:
當然,如果我們隊輸出的錯誤資訊仍然不滿意,還可以使用gtest中的格式化斷言,它們包括:
*_pred_format1(pred_format1, param1):如果pred_format1(param1)失敗,則會按使用者自定義的format來輸出錯誤資訊;
......(同樣支援最多5個引數)
要使用這些巨集,我們需要自己額外定義乙個函式來提供對錯誤資訊的格式化,依然以判斷偶數為例:
testing::assertionresult assertnumberiseven(const char* n_expr, int n)
test(hellogtest, firsttest)
其中assertnumberiseven這個函式即我們需要額外定義的函式,它返回乙個testing::assertionresult,在這個函式中,如果用於*_pred_format1,則它最第乙個引數為乙個const char*型別,用於儲存格式化後的錯誤資訊,後續為待測試函式的引數;如果用於*_pred_format2,則它前兩個引數為const char*,後續兩個為函式引數,以此類推...然後在呼叫*_pred_format1時,將這個函式作為第乙個引數傳給巨集即可,後續為待測試函式的引數,不包括上述的字串。
執行結果如下所示:
9、windows hresult檢查
它們包括:
*_hresult_succeeded及*_hresult_failed。
10、型別檢查
gtest中的型別檢查為testting::staticasserttypeeq,它是乙個靜態檢查,主要用於模板程式設計之中,如果型別檢查失敗則無法通過編譯,這樣可以避免在執行時程式出錯。這就類似於c++ 11中的static_assert一樣。
11、總結
本章我們主要羅列了gtest中的一些斷言的巨集,及其使用。
gtest測試框架使用詳解 GTest常用斷言
gtest 是一套用於編寫c 測試的框架,支援很多好用的特性,包括自動識別測試 豐富的斷言 生成報告等。gtest 斷言是類似於函式呼叫的巨集。經常使用斷言來測試類或函式的功能。當斷言失敗時,gtest則列印出斷言所在的檔案 行號,以及失敗資訊。判斷實際結果與預期結果是否相符的機制稱為斷言。gtes...
gtest快速入門
解壓,進入該目錄,按reame說明 安裝 1.5之前 make install可以安裝,1.6之後不可以。安裝可按readme裡的提示進行安裝 a g i.include i.c src gtest all.cc 注意,i後沒有空格,直接加.b ar rv libgtest.a gtest all....
gtest配置過程
1 配置前準備 電腦環境 windows7 旗艦版 gtest ide visual studio 2015專業版 昨天學習了git剛好可以用上 git學習筆記 3 進入googletest源 目錄如下 4 開啟通過vs開啟sln檔案 一共4個project,圖中的my demo是我自己新增的 5 ...