[翻譯] 強制100%測試覆蓋率的悲劇

作者: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卻可能是非常讓人沮喪的坎拐。
我的一點感覺烦磁,很多問題出在決策者對問題本身毫無興趣养匈,問題只是引出解決方案的短暫前奏而已哼勇。
就像郭德綱的相聲:你有病啊呕乎? 你有藥么;!?
重要的是吃下某個靈丹妙藥猬仁,沒有藥帝璧,病就好像不存在一樣。
然而察覺問題湿刽,才是解決的開端的烁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市诈闺,隨后出現(xiàn)的幾起案子渴庆,更是在濱河造成了極大的恐慌,老刑警劉巖雅镊,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件襟雷,死亡現(xiàn)場離奇詭異,居然都是意外死亡仁烹,警方通過查閱死者的電腦和手機耸弄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卓缰,“玉大人计呈,你說我怎么就攤上這事≌骰#” “怎么了捌显?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鳍鸵。 經(jīng)常有香客問我苇瓣,道長,這世上最難降的妖魔是什么偿乖? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任击罪,我火速辦了婚禮哲嘲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘媳禁。我一直安慰自己眠副,他們只是感情好,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布竣稽。 她就那樣靜靜地躺著囱怕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪毫别。 梳的紋絲不亂的頭發(fā)上娃弓,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音岛宦,去河邊找鬼台丛。 笑死,一個胖子當著我的面吹牛砾肺,可吹牛的內(nèi)容都是我干的挽霉。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼变汪,長吁一口氣:“原來是場噩夢啊……” “哼侠坎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起裙盾,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤实胸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后闷煤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體童芹,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年鲤拿,在試婚紗的時候發(fā)現(xiàn)自己被綠了假褪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡近顷,死狀恐怖生音,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窒升,我是刑警寧澤缀遍,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站饱须,受9級特大地震影響域醇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一譬挚、第九天 我趴在偏房一處隱蔽的房頂上張望锅铅。 院中可真熱鬧,春花似錦减宣、人聲如沸盐须。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贼邓。三九已至,卻和暖如春闷尿,著一層夾襖步出監(jiān)牢的瞬間塑径,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工悠砚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晓勇,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓灌旧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绰筛。 傳聞我的和親對象是個殘疾皇子枢泰,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 一、百變怪 Mockito Mockito可謂是Java世界的百變怪铝噩,使用它衡蚂,可以輕易的復(fù)制出各種類型的對象,并與...
    羅力閱讀 3,938評論 3 18
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,323評論 25 707
  • The tragedy of 100% code coverage這篇文章前兩天被人推薦到hacknews以后引起...
    武可閱讀 1,296評論 0 4
  • 從走出林琳家大門到將白露送回她所居住的公寓這段路程骏庸,白露和我各懷心事毛甲,一句話都很沒說這種沉默一直持續(xù)到了白露的家門...
    24e2f6668318閱讀 644評論 0 0
  • 一個月前老爸去世 一個月后和男朋友分手 我的愛情 只值三十天
    我不想長大閱讀 264評論 4 3