簡體   English   中英

當一個函數調用另一個返回布爾值的函數時,如何進行單元測試?

[英]How to unit test when a function calls another function returning a boolean?

下面是我需要進行單元測試的代碼。 我會為getFoo編寫2個單元測試用例,一個用於true(x==5) ,另一個用於false(x==10) 我的問題是,即使對於true和false情況,即使是convertWrapper我也需要編寫兩個單元測試函數嗎? 我認為,應該確保將來不會有人在convertWrapper中造成更改,而導致回歸。 但是,只是想知道在這種情況下什么被認為是廣泛采用的做法。

public boolean getFoo(int x) {
    return x == 5;
}

public boolean convertWrapper(char ch) {
    int x = (int)ch;
    return getFoo(x);
}

一種選擇:確保convertWrapper調用並返回getFoo的結果,並對getFoo進行單元測試。

模仿者可以幫助進行集成測試。

最佳實踐是一般編寫單元測試。 它們應該簡單易維護。 如果使用多種測試方法是最簡單,最容易維護的方法。 通常,我盡量不要在單元測試中寫太多樣板代碼。

問問自己convertWrapper的一般合同是convertWrapper 如果要為特定輸入返回true,並為其他任何輸入返回false,則測試它是否可以這樣做。 它通過getFoo實現的事實與您如何對其進行單元測試無關。

如果將來有人更改實現,以便對於與以前相同的輸入仍返回true或false,但不使用getFoo則不應破壞測試。

由於getFoo是公共的,因此它應該具有自己的測試。

是的,您可能確實希望編寫單獨的案例,因為您的意見通常是正確的,而恰恰是正確測試旨在避免的情況類型:

我認為,應該確保將來不會有人在convertWrapper中造成更改,而導致回歸。

單元測試應該測試代碼的高級功能。 您的單元測試不了解實現細節,它們僅測試是否符合“合同”的條款。 由於您有兩種可以在較高層次上執行兩項獨立工作的公共方法(我們假設-您的要求沒有陳述或記錄),因此您有兩項單獨的測試。

因為您(作為開發人員)隱式地知道實現是相同的,所以消除了其中一項測試,這突然將有關實現詳細信息的信息帶到了測試領域,這將在將來引起問題和退化。

Dave Newton在他的答案中指出的一個選擇是編寫一個單元測試,該測試實質上確保所有相關ch convertWrapper(ch) == getFoo((int)ch) 這是一個很好的建議,可能非常合適,但convertWrapperconvertWrapper高級要求是“返回與getFoo相同的值”。 同樣,您的測試應反映您的要求。

當然,這並不意味着消除測試在某種程度上是違法的。 如果您這樣做,魔鬼不一定會向您的靈魂求婚(盡管有時我希望那是通常的后果)。 如果您的應用程序很簡單,或者您願意承擔相關的風險,那么即使是簡單的“ @todo Test me”文檔標記也足夠了。 有時可以時不時地使用快捷方式, 但前提是您必須真正理解並接受其中的含義 -只有您才能從自己身上救出來。 :)

但是,在一般情況下,是的,有兩個測試。 然后,您可以“解雇”您的測試,而不必記住將來您制定的規則的特殊例外。

為什么您認為只需要為getFoo編寫兩個單元測試?

當然,您知道該方法實際上只能采用以下兩種方法之一,而調用者則不能。 使用這種瑣碎的方法看似荒謬,但您需要考慮該方法的合同問題。 也許您需要測試5、0,一個負數,然后一個非常高的正數,或者呼叫者希望您能夠處理的其他任何奇怪的情況。

convertWrapper相似。 您知道它調用getFoogetFoo實際上只有兩條路徑,但是您不能讓自己這么想。

最重要的是,您需要為您的方法定義合同,並在確信自己的公共方法滿足該合同的情況下運行足夠的測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM