C 單元測試 打樁測試

2021-06-22 09:10:48 字數 1822 閱讀 9708

當構造測試用例的資料,是在函式內部被另乙個外部函式所使用時,我們需要忽略外部函式所帶來的影響。

需要進行「打樁」,舉乙個具體的例子

class

datagetter ;

.....

.....

bool

datagetter::run()

....

....

比如要對run這個函式進行單元測試,它內部呼叫了ptr_client->getdata(data)的方法,它是通過tcp協議從服務端取資料到data裡,測試run這個函式,必然要構造data。

如果不「打樁」,要測試的話,我們就需要再從服務端去構造資料,而且還可能收到其他因素的影響。

這時候「樁」就是很好的一種技術。

那如何去構造「樁」呢。

原理:利用c++ virtual的特性,改變m_ptr_client指標所指向的物件,重寫乙個「打樁」測試類。

當然,前提是getdata的定義本身是virtual的。

假設client的定義如下

class

client ;

我們只需要重寫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 單元測試...