我在測試方面很新,所以請讓我知道,如果我在任何時候完全錯誤的方向進行。話雖如此,假設我想測試下面的函數foo。如何測試輸出依賴於另一個函數的函數?
int foo(int i) {
//Lots of code here
i = bar();
//Some more changes to i happen here, conditional on what bar returned
return i;
}
在這個例子中,foo和bar都是自己編寫的函數,我已經測試過了。
由於foo的輸出是以bar的輸出爲條件的,我假設爲了測試foo,我需要創建一個模擬條。爲了做到這一點,並假設bar的定義保存在與foo不同的源文件中,我可以創建一個新的源文件,包含該文件,而不是發現bar的實際定義的源文件,並將模擬在該文件中的酒吧。
int bar(void) {
return HARD_CODED_VALUE;
}
然而,存在2個問題與該方法:
1),會發生什麼,如果杆返回多個值(例如作爲錯誤代碼或實際值)和I需要確保FOO正確地反應對於每種可能性?我無法爲欄創建多個定義。我曾經想過的一個想法是在bar中創建一個靜態int,然後每次調用bar時都會增加它。然後我只是有一個條件這個int,多次調用欄,從而返回多個值。不過,我不確定是否引入更復雜的邏輯成模擬功能是很好的做法,或者有更好的方式來實現這一點:如果酒吧是相同的源文件中foo
int bar(void) {
static int i = 0;
i++;
if(i == 1) {
return HARD_CODED_VALUE_1
}
else if(i == 2) {
return HARD_CODED_VALUE_2
}
else {
fprintf(stderr, "You called bar too many times\n");
exit(1);
}
}
2)會發生什麼?我不能重新定義酒吧,也不能在不改變我的源代碼的情況下分開foo和bar,這將是一個真正的痛苦。
foo函數可以在沒有模擬條功能的情況下進行單元測試嗎?如果是這樣,只需創建一個涵蓋foo和bar的組合功能的單元測試。 – 2011-02-05 12:46:50