單元測試關於樁函式的探索

2021-06-16 07:26:11 字數 1575 閱讀 9508

背景: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...