Martin Fowler:當然(願意花掉一半的時間來寫單元測試)!因為單元測試能夠使你更快地完成工作。無數次的實踐已經證明這一點。你的時間越是緊張,就越是要寫單元測試,它看上去慢,但實際上能夠協助你更快、更舒服地達到目標。
單元測試很重要,但是……
單元測試的重要性,我想再多做一些強調也不為過。但實際情況是我經常聽到Java開發人員抱怨單元測試繁瑣、難寫。雖然勉強為之,卻疲於奔命,並沒有體會到它的好處!最終造成的結果是出現了大量只能運行一次的單元測試。是將責任簡單歸結於開發人員?還是開發流程或制度的不完善?
平心而論,我自己在做TDD或單元測試的時候,有很多時候也確實覺得無趣,尤其是在一些準備測試資料或測試環境的工作上,例如我們經常需要隨機產生特定長度的字串用於測試,需要如下代碼:
public String getRandomAlphabetic(int count) {
count = count <= 0 ? 5 : count; //預設為5
//構建一個包含所有英文字母的字串
String alphabet="abcdefghijklmnopqistuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
StringBuffer sb = new StringBuffer(count);
for (int i = 0; i < count; i++) {
int character=(int)(Math.random()*26);
sb.append(alphabet.substring(character, character+1));
}
return sb.toString();
}
如果用Ruby的話
def random_alphabetic(size=5)
chars = ('a'..'z').to_a + ('A'..'Z').to_a # 構建一個從a到Z的一個字母表數組
(0...size).collect { chars[rand(chars.length)] }.join # 從chars數組中返回指定長度的隨機字元數組(預設5個),調用join方法,將這個數組中的所有元素串連成一個字串
end
對比後大家感覺如何?有經驗的開發人員馬上會挑戰說,我們有現成的commons-lang庫,簡單調用RandomStringUtils.randomAlphabetic(5)就可以完成任務,可我想問的是,如果沒有第三方庫的支援,你更願意用哪種方式?還可以想象構建一個樹狀結構的資料,Ruby的方式
data =<<-EOF
{
"order_id": "xxx-xxxxx-xxx",
"books": [
{"ISBN": "2323-2323", "number": 2, "price": 20.00},
{"ISBN": "2323-2324", "number": 3, "price": 30.00},
{"ISBN": "2323-2325", "number": 2, "price": 20.00},
{"ISBN": "2323-2326", "number": 3, "price": 30.00},
{"ISBN": "2323-2327", "number": 2, "price": 20.00}
]
}
EOF # 該資料為json格式的一段字串
order = JSON.parse(data)
p order['books'][0]['ISBN'] #=> 2323-2323
用Java該怎樣完成,很多人會祭出Java世界中最被濫用的七種武器之首“xml”,即便如此能完成的如此優雅嗎?如果不是簡單的“語言宗教崇拜”,至少我會毫不猶豫的選擇用Ruby的方式完成任務。省點時間,早點下班陪陪老婆也好啊!:)