當構造測試用例的資料,是在函式內部被另乙個外部函式所使用時,我們需要忽略外部函式所帶來的影響。
需要進行「打樁」,舉乙個具體的例子
比如要對run這個函式進行單元測試,它內部呼叫了ptr_client->getdata(data)的方法,它是通過tcp協議從服務端取資料到data裡,測試run這個函式,必然要構造data。classdatagetter ;
.....
.....
bool
datagetter::run()
....
....
如果不「打樁」,要測試的話,我們就需要再從服務端去構造資料,而且還可能收到其他因素的影響。
這時候「樁」就是很好的一種技術。
那如何去構造「樁」呢。
原理:利用c++ virtual的特性,改變m_ptr_client指標所指向的物件,重寫乙個「打樁」測試類。
當然,前提是getdata的定義本身是virtual的。
假設client的定義如下
classclient ;
我們只需要重寫getdata的方法,並且當引數data被傳進來時,我們可以返回特定的值。
這一套方法,google已經提供了很好的一套框架:gmock
下面介紹一下它的用法
#include "client.h"//
被mock的類的標頭檔案
#include //
gmock 的標頭檔案
class mockclient : public
client
mock_method1(getdata,
bool(std::string&));
}
這裡使用了乙個巨集mock_method1
原形是mock_method#1(#2, #3(#4) )
#1表示被mock的函式引數個數,#2表示被mock的函式名稱,#3表示被mock的函式返回值,#4表示被mock的函式引數列表
這樣,乙個「樁」就「打」好了。
首先,要先改變m_ptr_client指向的物件,對於private的變數,在前一章有描述方法,
然後測試的時候,直接將 m_ptr_client = new mockclient()即可,不過要記得釋放它之前new的資源(如果有的話),不然就記憶體洩露了,哈哈
使用gmock的幾個巨集,用乙個例子簡單介紹下:
expect_call( //mock被呼叫時,要發生的動作
*m_ptr_client, //
被mock的物件,看清楚,是物件,不是指標了
getdata(test::_) //
被mock的方法,引數為佔位符
).times(2) //
表示被呼叫2次
.willonce( 第一次呼叫
testing::setargreferee
<0>(「test」), //
設定第0個引數的值為「test」
testing::return(true), //
設定返回值為true
).willonce( 第二次呼叫
testing::setargreferee
<0>(「test」), //
設定第0個引數的值為「test」
testing::return(false), //
設定返回值為false
);
測試的原則,盡量不修改被測函式,覆蓋函式的每乙個分支,保證外部條件都是正確的。
c 單元測試
資料庫單元測試 1.資料庫設計 person id int,主鍵 username password age 2.新建乙個專案 2.1.定義person類 public class person set public string username set public string passwor...
C 單元測試
單元測試,或者更大一些的自動化測試,對提高軟體質量是有很大幫助的。通過一系列預先設計的規則,就可以覆蓋大量的測試點。尤其是對重構一類的任務,確保修改前後系統行為不變很重要,而修改後的回歸測試工作量又極其繁重,此時單元測試,或者自動化測試就能體現出無以倫比的效率。我在2005年學python不久,就鬱...
C 單元測試
學歷代表你的過去,能力代表你的現在,學習代表你的將來 十年河東,十年河西,莫欺少年窮 學無止境,精益求精 廢話咱也不多說,直接進入正題 首先說說單元測試的好處 今天說說c 的單元測試特點 1 單元測試的類名用 testclass 標註 2 單元測試的方法名用 testmethod 標註 3 單元測試...