C 單元測試框架 gtest 5 gmock

2021-09-11 12:00:18 字數 2801 閱讀 3439

google mock(簡稱 gmock) 是google在2023年推出的一套針對c++的 mock框架,它靈感取自於 jmock、easymock、harcreat。google mock是用來配合 google test 對c++專案做單元測試的。它依賴於 googletest。

當你寫乙個原型或是測試的時候,直接去依賴真實的物件通常是不可行的或是不明智的。mock物件實現與真實物件有著相同的介面, 但你可以去指定mock物件在執行時它做什麼( 比如,呼叫哪個函式,以什麼順序,呼叫多少次,使用什麼引數,返回內容是什麼,等等 )。

使用google mock有下面三個基本步驟:

使用簡單的巨集來描述你想mock的介面,這些巨集會自動擴充套件成你的mock類的實現。

建立一些mock物件,並用一種直觀的語法去指定mock物件的期望和行為。

用這些mock物件測試**。google mock會捕獲那些違反期望的衝突。

我們直接使用示例**,來展示其使用方法:

#include #include #include // gmock最大只支援10個引數的函式mock

class ifileapi;

class filedataload

~filedataload() }

int loaddata(const char* path, int size)

// 我們假設 fd > 0. (真實環境中可能=0)

m_szfiledata = new char[size+1];

m_szfiledata[size] = '\0';

int size_ret = 0;

// 讀檔案,僅僅作為示例,所以忽略引數size

int ret = m_fileapi->read(path, m_szfiledata, size, size_ret);

if (ret != 0)

if (size != size_ret)

m_ndatasize = ret;

// 關閉檔案

ret = m_fileapi->close(fd);

return ret;

}char *getfiledata()

int getdatasize()

private:

ifileapi* m_fileapi;

char* m_szfiledata;

int m_ndatasize;

};class mockfileapi : public ifileapi;

test(filedataloadtest, loaddata)

int main(int argc, char **ar**)

--------------------------------《**分析》----------------------------------------------

在這兒,我們只寫了乙個test,即只有乙個測試用例(test case),測試的目標函式是 filedataload:: loaddata()

filedataload::loaddata函式使用ifileapi*型別的成員變數m_fileapi 來完成載入檔案內容的功能。首先開啟檔案(open),然後讀取檔案(read),最後關閉檔案控制代碼(close)。使用ifileapi純虛介面的目的在於, 可以擴充套件不同應用場景的檔案內容載入。 比如可以實現乙個本地檔案內容載入的子類來實現檔案內容載入: class localfileapi : public ifileapi 使用posix標準檔案系統api來實現本地檔案 open, read 和 close 。還可以實現乙個雲端檔案內容載入:class cloudfileapi : public ifileapi,使用約定介面規範來實現雲端檔案 open,read 和 close。

我們在測試filedataload:: loaddata時,無需關心m_fileapi是本地的還是雲端的還是其他什麼的,我們只關心loaddata這個函式的邏輯是否正確,錯誤處理是否完整,是否有記憶體洩漏等等。

所以,我們只需模擬m_fileapi的open,read和close,並指定這三個函式一些操作(返回一些特定值, 設定一些特定返回引數等:在test巨集後面大括號中,使用expect_call來設定),以此來驗證 filedataload::loaddata的邏輯是否正確。

以模擬open函式為例:

首先,定義mock類,並繼承自ifileapi純虛基類,使用mock_method巨集宣告open:

mock_method2(open, int(const char*, int));
因為open有兩個引數,所以使用mock_method2。巨集第乙個引數為函式名,第二個引數為函式型別 然後,使用expect_call來設定呼叫到這個函式時的期望,**如下(gmock_test.cpp第86行):

expect_call(*api, open(::testing::, ::testing::)) 

.times(1)

.willrepeatedly(::testing::return(11));

具體含義為,在這個期望設定完以後,只會發生一次api->open呼叫(.times(1)的作用),並且api->open被呼叫時的返回值為11(.willrepeatedly(::testing::return(11)的作用)

另外」::testing::_」是一種引數匹配語法,它表示匹配任意型別的引數,這裡這樣寫是我們這個測試用例不關心引數型別。

其它請參考:

c 單元測試框架之gtest

搞了3個禮拜的單元測試了,把最近所學所用的東西記錄一下,順便為公司接下來要做的單元測試培訓做下背書。首先什麼是單元測試。在物件導向程式設計中,通常乙個類會承擔乙個單一的職責,所以我們可以用類來劃分單元。單元測試,就是針對專案中的各個類進行測試。它側重於發現單元內部的邏輯錯誤,屬於白盒測試的範疇。單元...

gtest單元測試

1 用於加入源,方便更新。sudo add apt repository ppa ubuntu toolchain r test 2 更新 sudo apt get update 3 將 usr bin gcc和 usr bin g 這兩個快捷方式給刪除 sudo update alternativ...

c 單元測試工具之 gtest

gtest是谷歌為c 開發的單元測試框架,該框架基於xunit架構。gtest提供了較豐富的測試特性,且其命令列方式輸出介面友好美觀,是c 單元測試工具的較佳選擇。先從這裡 configure make 這裡google沒有提供make install行為來安裝,我們需要手動安裝。繼續執行以下命令 ...