2014-03-05 78 views
0

有沒有一種合適的方法可以有效地針對私有變量和函數進行TDD(測試驅動開發)?Test Driven Development with hidden variables and methods in C

我正在測試一個新的循環緩衝模塊。緩衝區參數保存在一個結構中。這些結構成員應該是私有的,因爲客戶端不需要觸摸它們。但通過隱藏成員,測試變得更加困難。如果結構格式在標頭中是公共的,我可以直接查看以確保我指向存儲陣列,我的讀取索引是正確的,我的寫入索引是正確的,等等。如果是私有的,我只能測試界面,我顯然需要這樣做,但驗證底層的隱藏功能感覺很慢並且效率低下。

buf.h

typedef struct circBuf circBuf_t; 

buf.c

struct circBuf { 
    privateMember_1; 
    ... 
    privateMember_n; 
}; 

我應該把間諜在我的測試功能?即:

test_buf.c

#include "buf.h"  

struct spy_circBuf { 
    privateMember_1; 
    ... 
    privateMember_n; 
}; 

void test_circBufInit(void) 
{ 
    circBuf_t * p_testCircBuf; 
    struct spy_circBuf * p_spy; 

    p_testCircBuf = CircBuf_Init (initVar_1, ...); 

    p_spy = ((struct spy_circBuf *)p_testCircBuf); 

    TEST_ASSERT_EQUAL(p_spy->privateMember_1, initVar_1); 
} 

有沒有更好的辦法做到的私有變量和函數TDD?

+0

請參閱http://googletesting.blogspot.com/2013/03/testing-on-toilet-testing-state-vs.html 如果您無法測試狀態,請測試您的對象與其他對象的交互。 –

回答

1

TDD是關於測試你的類的外部行爲,而不是內部實現。如果您的測試考慮內部實施,那麼如果實施細節發生變化,它們將會很脆弱並且可能會中斷。這會阻止你重構和改進代碼。

TDD還強調,在編寫必要的生產代碼之前,您要編寫每個測試。這有助於避免測試實現,因爲您正在編寫一個尚不存在的實現的測試。這鼓勵你考慮你班級的期望行爲,並寫一個測試來行使這種行爲。

+0

謝謝邁克。這是有道理的和共鳴。我絕對看到如何看待內部組件抑制重構的慾望。再加上如果所有的角落案例都經過測試,內部實施將會得到很好的測試,我可以自由地更改/重構,並且只關心api。我喜歡。 我可以看到如何從實現行爲改變對模塊行爲的關注是理想的,因爲首先我們應該關注模塊的功能,而不是關注模塊的功能,並將其鎖定在非相關的開發路徑中 – jaypee