認識單元測試中的打樁
什麼是樁
樁,或稱樁程式碼,是指用來代替關聯程式碼或者未實現程式碼的程式碼。如果函式B用B1來代替,那麼,B稱為原函式,B1稱為樁函式。打樁就是編寫或生成樁程式碼。
打樁的目的
打樁的目的主要有:隔離、補齊、控制。
隔離是指將測試任務從產品專案中分離出來,使之能夠獨立編譯、連結,並獨立執行。隔離的基本方法就是打樁,將測試任務之外的,並且與測試任務相關的程式碼,用樁來代替,從而實現分離測試任務。例如函式A呼叫了函式B,函式B又呼叫了函式C和D,如果函式B用樁來代替,函式A就可以完全割斷與函式C和D的關係。
補齊是指用樁來代替未實現的程式碼,例如,函式A
控制是指在測試時,人為設定相關程式碼的行為,使之符合測試需求。例如:
externint B();
int A()
{
int ret = B();
if(ret == 0)
;//do something
elseif(ret == 1)
;//do something
else
;//do something
return ret;
}
如果函式B返回隨機數,或者返回網路狀態,或者返回環境溫度,等等,則當呼叫其實際程式碼時,函式A
一個樁函式,可能既具有控制功能,又具有隔離或補齊功能。
編寫樁
一般來說,樁函式要具有與原函式完全一致的原形,僅僅是實現不同,這樣測試程式碼才能正確連結到樁函式。
用於實現隔離和補齊的樁函式一般比較簡單,只需把原函式的宣告拷過來,加一個空的實現,能通過編譯連結就行了。
比較複雜的是實現控制功能的樁函式,要根據測試的需要,輸出合適的資料,下面是一個示例:
//獲取環境溫度。溫度由出參pTemperature輸出,返回值表示獲取溫度是否成功,如果成功,則返回1
int GetTemperature(int* pTemperature)
{
if(caseNameIs("failed"))
return 0;
if(caseNameIs("ok-23"))
{
*pTemperature = 23;
return 1;
}
if(caseNameIs("ok-25"))
{
*pTemperature = 25;
return 1;
}
if(caseNameIs("ok-28"))
{
*pTemperature = 28;
return 1;
}
return 0;
}
其中,caseNameIs()是由測試工具提供的API,用於判斷用例的名稱。程式碼根據用例名稱來決定輸出資料。