遇見gtest 斷言

2021-07-06 01:58:24 字數 3693 閱讀 6544

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 ...