作者:Daniel Lebrero
原文地址:http://labs.ig.com/code-coverage-100-percent-tragedy
人世間的事總不乏喜劇的反轉(zhuǎn)广恢。14年來我一直布道TDD(測試驅(qū)動開發(fā)元暴,或者更早的名字:測試先行方法),或者至少勸說開發(fā)者去寫單元測試。然而苛茂,最近我卻發(fā)現(xiàn)自己越來越多的說:“你為啥寫這個測試免绿?”祠丝,而非:“你應(yīng)該寫個測試呀年碘。”
到底發(fā)生了什么工腋?
當我在辦公室溜達時姨丈,一個開發(fā)者叫我去幫他寫一些單元測試∩醚看起來他正苦于用Mockito來測試下面這段代碼:
當我說:“你不用測它”蟋恬,我覺得他吃了一驚。
“不趁冈,我必須要測歼争!”他說,“不然我怎么知道這段代碼正常工作渗勘?沐绒!”
“這段代碼很明了。沒條件語句旺坠,沒循環(huán)乔遮,沒數(shù)據(jù)轉(zhuǎn)換,啥也沒价淌。這段代碼就是一點點老套普通的膠水代碼而已申眼÷鹘颍”
“但是如果沒用測試蝉衣,阿貓阿狗都可以來改點東西括尸,結(jié)果代碼壞了!”
“你想想看病毡,如果真有個邪惡或者無腦的程序猿把這么簡單的代碼搞砸了濒翻。你覺得他看到個單元測試失敗了會怎么辦?當然是把單元測試刪了啦膜∮兴停”
“那要是你必須得測試它,你會怎么寫僧家?”
“如果這樣的話雀摘,我會寫成這樣:”
“但是你沒用Mockito呀!”
“沒用又怎么樣呢八拱?Mockito在這兒幫不上啥忙阵赠。相反還會讓你的測試更加復(fù)雜和難懂〖〉荆”
“不過我們已經(jīng)決定所有的測試都要用Mockito!"
我:“……”
第二次我再碰到他的時候清蚀,他驕傲的告訴我他已經(jīng)搞定怎么用Mockito寫那個測試了。
盡管我可以理解搞定問題帶來的精神滿足爹谭,但是這仍讓我悲哀枷邪。
第二個例子
我被一個程序員拽去,他正興奮于新程序的高覆蓋率诺凡,以及新的最愛东揣,BDD(行為驅(qū)動設(shè)計)。翻了翻代碼腹泌,我們看到了下面的Cucumber測試:
如果你曾經(jīng)用過Cucumber嘶卧,你一定不會驚訝于這個測試需要下面這些支持代碼:
而所有這一堆就是為了測這段代碼:
你沒看錯,一個簡單的map lookup真屯。我和這程序員很熟了脸候,所以坦率的說:“這完全是浪費時間“竽瑁”
“但是我老板期望所有的類都有測試”运沦,他回答。
“以什么樣的代價呢配深?”
“代價携添?”
“好吧,但是這些測試跟BDD一毛錢關(guān)系也沒有篓叶×衣樱”
“我知道羞秤,但是我們決定了,要用Cucumber寫所有的測試左敌●埃”
我:“……”
盡管我可以理解貫徹中意的工具帶來的精神滿足,但是這仍讓我悲哀矫限。
悲劇在哪哺哼?
悲劇的是他們兩個都是很聰明的開發(fā)者(聰明到我愿意跟他們上團隊訪談節(jié)目),卻都把時間浪費在寫這種測試叼风,這種毫無意義而且還會繼續(xù)浪費新一批程序員時間去維護的測試取董。
悲劇的是我們不是為任務(wù)選擇合適的工具,而是堅持不懈的使用錯誤的工具无宿,卻沒用什么實際的原因茵汰。
悲劇的是一旦某個“最佳實踐”成了主流,我們就忘了它的初衷孽鸡,采用它為了什么收益蹂午,更重要的是,使用它的代價梭灿。
相反画侣,我們只是不假思索的應(yīng)用這些“最佳實踐”,這意味著最終我們只能得到非常平庸的效果堡妒,大部分的收益沒有得到配乱,卻付出了所有的甚至更高的代價。以我的經(jīng)驗寫出好的單元測試是相當困難的工作皮迟。
100%覆蓋率是個值得追求的目標么搬泥?
是的,每個人都應(yīng)該達到這個目標 …… 但是一個項目就足夠了伏尼。我的意思是你需要做到極致去知道它的局限是什么忿檩。
我們對于一個極端已經(jīng)很有經(jīng)驗了:完全沒有單元測試的項目,所以我們知道這樣做的痛苦爆阶。而我們往往缺乏另一極端的經(jīng)驗:100%覆蓋率的項目燥透,并且強制所有的事都必須TDD。
單元測試辨图,尤其是測試先行方式班套,是非常好的實踐。但是我們需要學(xué)會哪些測試是有用的故河,哪些是適得其反的吱韭。
請記得沒用什么是免費的,沒有銀彈鱼的。停下來理盆,想一想痘煤。
關(guān)于作者:
Daniel Lebrero 在IG大數(shù)據(jù)團隊擔任技術(shù)架構(gòu)師。作為一個超過15年JAVA經(jīng)驗和4年經(jīng)驗的Clojure程序員猿规,他現(xiàn)在是函數(shù)式編程的忠實擁護者衷快。你可以通過 Twitter, LinkedIn, 或他的個人 blog 找到他.
譯者感言:
自發(fā)采用TDD是令人振奮的,被強制推廣TDD卻可能是非常讓人沮喪的坎拐。
我的一點感覺烦磁,很多問題出在決策者對問題本身毫無興趣养匈,問題只是引出解決方案的短暫前奏而已哼勇。
就像郭德綱的相聲:你有病啊呕乎? 你有藥么;!?
重要的是吃下某個靈丹妙藥猬仁,沒有藥帝璧,病就好像不存在一樣。
然而察覺問題湿刽,才是解決的開端的烁。