0

說我有三個方法,都非常相似,但不同的輸入類型:單元測試應該是黑盒測試還是白盒測試?

void printLargestNumber(int a, int b) { ... } 
void printLargestNumber(double a, double b) { ... } 
void printLargestNumber(String numberAsString, String numberAsString) { ... } 

三者都使用相同的基本邏輯。例如:也許double版本是唯一一個比較數字的版本,另外兩個版本只是將其輸入轉換爲double

我們可以想象幾個不同的單元測試:第一個輸入較大,二是大,兩個輸入爲負,等

我的問題

如果所有這三種方法有全套測試(黑盒子,因爲我們不承擔核心實現是一樣的)

應該只在double版本會被嚴重測試,另外兩個測試會輕微驗證參數轉換(白盒測試,因爲我們知道它們共享相同的實現,並且已經在double測試中進行了測試)?

+0

Hrm ...這可能是一個愚蠢的http://stackoverflow.com/questions/203075/should-i-use-glass-box-testing-when-it-leads-to-fewer-tests – 2010-12-01 23:05:58

回答

2

如果所有這些方法都是公開的,也就是說可以被外界調用,我肯定會用全套測試來測試它們。一個很好的理由是,白盒測試比黑盒測試更脆弱;如果實施變更,公共合同可能會因某些方法而發生變化。

2

這取決於。

您是否認爲實施可能會改變?如果是這樣,那就去黑盒測試吧。

如果您可以保證實施不會改變白盒子。但是,您能夠保證這一點的機率不是100%。

您可能會妥協並進行一些黑盒測試,特別是在邊界條件附近。但是,編寫測試應該很容易 - 所以從這個角度來看,沒有任何理由對而不是進行全黑盒測試。唯一的限制因素是運行測試所需的時間。

也許你應該研究並行運行測試的可能性。

+0

+ 1爲「寫測試應該很容易」。確實,它們都是非常相似和易於編寫的,如果實現發生變化(這是測試的目的!),這將會有所幫助。感謝你的回答! – 2010-12-01 23:01:44

+1

你不能保證實現不會改變。不是50%,不是20%,不是1%。你不能。一切都可能在某個時候改變。如果你只測試了代碼的一部分,「因爲我知道這實際上是這個代碼的別名」,那麼當它發生變化時(如果你沒有馬上意識到)就停止測試代碼的一部分。不好。 總是假設一切都可以,並且它的大部分*會在某個時刻改變。相應地測試。 – 2013-02-24 23:19:26

2

有一組測試明確行使公共接口。我會將這些視爲黑盒測試。

還有第二組測試可以看作是實施的角落案例。這是白盒測試,肯定在單元測試中佔有一席之地。沒有白盒實施知識,你無法知道有趣的路徑。我會特別注意字符串的情況下,因爲接口允許字符串,可能不會乾淨地轉換爲雙打,推動精度等邊界

我會削減整數情況下的幾個角落?我知道我在雙重案件中推動了道路,可能在時間壓力下不​​會好起來。