背景:c語言編寫的目標檔案,在做單元測試的時候,在目標c檔案(如target.c)中想測試乙個函式a,而a呼叫了b,b目前無法實現,所以需要打樁來代替b.
在不改變target.c的前提下(不修改程式的**),在另外的c檔案中(test.c)寫樁函式,怎樣讓a函式執行的時候呼叫樁函式,而不是原來的b函式呢?
查閱了網上的資料
方法1:採用巨集定義,在編譯的時候先採用gcc -d編譯target.c
在編譯連線target.o 和test.c
gcc -db=stub_b -c target.c
gcc target.o test.c –o test
./test
error:multiple definition of `stub_b'
原因:gcc –db=stub_b 相當於#define b stub_b
將target.c中的b都替換成stub_b,而target.c中就有了stub_b的定義,就出現了重定義
這種重定義的方法,適用於底層函式的定義和目標檔案不再同乙個檔案中
方法2:採用google的cmockery框架
這個的安裝和使用網上有很多的資料。
使用下來的結果和方法1相同。
可能是本人使用有誤,在此不確定這個可不可行。
糾結了好多天,尋思著怎麼才能實現上述的功能。
本人採用了gcc和g++編譯器,在本地函式和動態庫中的函式同名的時候,會呼叫本地函式的特性,先將target.c生成動態庫,然後編譯test.c的時候鏈結此庫,實現了所要的功能。可以結合cppunit進行單元測試了。
//目標檔案
#include"target.h"
#include
int inside_function()
// outside_function()為待測函式,這個是沒有入口引數的,但是有內部輸入inside_functionf(),這個函式是底層函式,大多數的時候可能是比較複雜的,或者說是難以是實現的,或者說是
//和硬體相關的,這個時候需要打樁來代替
void outside_function()
int inside_function();
void outside_function();
//測試**
//inside_function()是樁函式,和target.c中的底層函式同名
#include"target.h"
int inside_function()
int main()
將target.c生成動態庫 libtarget.so
然後載入進去一起編譯test.c
g++ -c -o target.obj target.c
g++ -shared -o libtarget.so target.obj
g++ libtarget.so test.c -o test
./test
結果是a=100
說明了呼叫了本地的函式。
這個方法是本人拙見,在window上不可行,這個跟編譯器相關,目前還在探索有沒有其他的方法可以實現。
期待各路高手指教。
任重道遠~~~
堅持到底~~~
單元測試 二 樁物件
在單元測試時,難免會碰到一些外部依賴,外部依賴是指在系統中 與其互動的物件,而且無法對其做人為控制,比如檔案系統 執行緒 記憶體 時間 資料庫結果集等,這時可以使用偽物件 fake 來替代外部依賴,樁物件 stub 便是其中之一 一 樁物件 a 樁物件是對系統中現有依賴項的乙個替代品,可人為控制。通...
單元測試 二 樁物件
在單元測試時,難免會碰到一些外部依賴,外部依賴是指在系統中 與其互動的物件,而且無法對其做人為控制,比如檔案系統 執行緒 記憶體 時間 資料庫結果集等,這時可以使用偽物件 fake 來替代外部依賴,樁物件 stub 便是其中之一 一 樁物件 a 樁物件是對系統中現有依賴項的乙個替代品,可人為控制。通...
談談單元測試中的測試樁實踐 2
首先定義乙個clock 介面。並為clock 顧名思義其實就是實現了clock 的ntpclock 另乙個是systemclock 它就提供系統當前時間作為標準時間。packageshannon.demo clock isan inte ce forall theclock toprovide ti...