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::_」是一種引數匹配語法,它表示匹配任意型別的引數,這裡這樣寫是我們這個測試用例不關心引數型別。
其它請參考:
搞了3個禮拜的單元測試了,把最近所學所用的東西記錄一下,順便為公司接下來要做的單元測試培訓做下背書。首先什麼是單元測試。在物件導向程式設計中,通常乙個類會承擔乙個單一的職責,所以我們可以用類來劃分單元。單元測試,就是針對專案中的各個類進行測試。它側重於發現單元內部的邏輯錯誤,屬於白盒測試的範疇。單元... 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... gtest是谷歌為c 開發的單元測試框架,該框架基於xunit架構。gtest提供了較豐富的測試特性,且其命令列方式輸出介面友好美觀,是c 單元測試工具的較佳選擇。先從這裡 configure make 這裡google沒有提供make install行為來安裝,我們需要手動安裝。繼續執行以下命令 ...c 單元測試框架之gtest
gtest單元測試
c 單元測試工具之 gtest