單元測(cè)試不應(yīng)由開發(fā)者編寫的九大理由
譯文【51CTO.com快譯】單元測(cè)試是一種良好的代碼質(zhì)量快速反饋方式。其類似于對(duì)編譯器的擴(kuò)展,能夠幫助我們識(shí)別業(yè)務(wù)邏輯。功能全面的單元測(cè)試套件能夠防止各類低級(jí)錯(cuò)誤,加速產(chǎn)品發(fā)布并幫助我們更為高效地處理年代久遠(yuǎn)的陳舊代碼。
即使擁有如此可觀的收益,為什么單元測(cè)試不應(yīng)由開發(fā)者編寫?具體理由如下:
1. 因?yàn)槟皇莻€(gè)“碼農(nóng)”
原諒我的表現(xiàn)略有無(wú)禮。不過(guò)必須承認(rèn),相當(dāng)一部分開發(fā)者并沒(méi)有自己的思維與判斷,或者對(duì)除薪酬之外的事物毫不關(guān)心。何謂“碼農(nóng)”?這代表的是那些只知道根據(jù)指示行事的開發(fā)者群體——老板要求試試JavaEE 5?“沒(méi)問(wèn)題。”老板要求使用同樣的IDE?“沒(méi)問(wèn)題。”老板要求編碼標(biāo)準(zhǔn)支持匈牙利符號(hào)?“沒(méi)問(wèn)題。”他們只是在機(jī)械地執(zhí)行上級(jí)下達(dá)的任務(wù)。單元測(cè)試是什么?能幫我增加收入嗎?如果不能,一切免談。
2. 對(duì)于單元測(cè)試并不了解
很多開發(fā)者可能壓根沒(méi)聽說(shuō)過(guò)單元測(cè)試。(這也可能是教育的鍋。我自己擁有計(jì)算機(jī)科學(xué)學(xué)士學(xué)位,但我在工作之前從來(lái)就沒(méi)聽說(shuō)過(guò)‘單元測(cè)試’這個(gè)詞兒。)因此,在將這項(xiàng)任務(wù)交給開發(fā)人員之前,單元測(cè)試工作必須由技能出色且經(jīng)驗(yàn)豐富的***負(fù)責(zé),并由其建立規(guī)范引導(dǎo)各位開發(fā)人員了解并學(xué)習(xí)相關(guān)概念。
3. 開發(fā)者編寫的代碼質(zhì)量太過(guò)恐怖
一部分開發(fā)者并不了解如何在Servlet中編寫低級(jí)JDBC代碼。對(duì)他們來(lái)說(shuō),關(guān)注分離與高內(nèi)聚僅僅是兩個(gè)他們永遠(yuǎn)用不到的計(jì)算機(jī)科學(xué)概念。我猜這類開發(fā)者很少編寫單元測(cè)試,因?yàn)樗麄兊拇a本身壓根無(wú)法進(jìn)行測(cè)試。單單是弄清代碼中的相關(guān)依賴性就足以嚇倒他們,根本不用提編寫測(cè)試方案。另外,某些編碼習(xí)慣也會(huì)影響到代碼的可預(yù)測(cè)性——比如字段注入,有中槍的沒(méi)?
4. 過(guò)分狂妄自大
必須承認(rèn),有時(shí)候我自己也存在這類問(wèn)題。特別是在獨(dú)立工作時(shí),我會(huì)以為自己的代碼編寫精彩優(yōu)異,基本根本不需要進(jìn)行什么單元測(cè)試。當(dāng)然,出于專業(yè)精神,我會(huì)強(qiáng)迫自己進(jìn)行一些測(cè)試,并很快發(fā)現(xiàn)自己的得意之作其實(shí)存在問(wèn)題。在我看來(lái),解決這種狂妄情緒的***方式就是參與團(tuán)隊(duì)合作,通過(guò)高透明度方式接受質(zhì)量指標(biāo)的檢驗(yàn)。只有這時(shí),我們才能真正意識(shí)到測(cè)試機(jī)制的意義。
5. 您更像是“牛仔”還是“顧問(wèn)”?
我們都希望成為編程領(lǐng)域的牛仔或者說(shuō)超級(jí)英雄,憑借一己之力快速解決問(wèn)題,但這同時(shí)往往會(huì)犧牲代碼的嚴(yán)謹(jǐn)性。我們對(duì)于測(cè)試工作不太在意(甚至完全不在意),因?yàn)槠渲荒茯?yàn)證現(xiàn)有應(yīng)用架構(gòu),而非生成功能齊備的軟件。這種浮躁而狂妄的思維會(huì)令我們對(duì)測(cè)試工作不屑一顧,因此即使被迫接受相關(guān)工作,其結(jié)果也可想而知。
6. 您在內(nèi)心中已經(jīng)選擇放棄
也許您目前正在開發(fā)的代碼根本沒(méi)機(jī)會(huì)被納入生產(chǎn)環(huán)境。也許您的用戶群體只是極少數(shù)人。也許企業(yè)的發(fā)展愿景與您的個(gè)人定位有所偏差。無(wú)論出于何種理由,我們都或多或少經(jīng)歷過(guò)這種心灰意冷的狀況。如果對(duì)代碼甚至工作產(chǎn)生了冷漠或者反感情緒,那么單元測(cè)試絕對(duì)不會(huì)被納入議事日程。這里我給大家提個(gè)建議:如果真的出現(xiàn)這種狀況,那么別逼著自己編寫什么單元測(cè)試了——拿這時(shí)間找份新工作吧。
7.企業(yè)文化并不重視單元測(cè)試
項(xiàng)目驅(qū)動(dòng)型企業(yè)往往會(huì)忽視代碼質(zhì)量及可維護(hù)性的重要價(jià)值,因?yàn)槠涿黠@更關(guān)注項(xiàng)目完成時(shí)間及預(yù)算。在這種情況下,請(qǐng)直接放棄,畢竟單元測(cè)試在急功近利的環(huán)境下毫無(wú)生存機(jī)會(huì)。
8.您面對(duì)著令人費(fèi)解的代碼
根據(jù)我的個(gè)人經(jīng)驗(yàn),需要維護(hù)大規(guī)模復(fù)雜代碼庫(kù)的開發(fā)者很少進(jìn)行單元測(cè)試。這很正常,畢竟維護(hù)性團(tuán)隊(duì)中成員的技能水平往往相對(duì)較低,或者說(shuō)付出的成本與回報(bào)不成正比。同樣的,管理層可能也不愿投資擴(kuò)大單元測(cè)試套件。這樣的思維往往導(dǎo)致企業(yè)以短期目標(biāo)作為文化價(jià)值取向,但這也很容易導(dǎo)致開發(fā)人員創(chuàng)建出復(fù)雜的代碼庫(kù)——惡性循環(huán),就是這么回事
9.企業(yè)文化在不知不覺中扼殺了單元測(cè)試
很多項(xiàng)目驅(qū)動(dòng)型企業(yè)往往只在表面上執(zhí)行單元測(cè)試,但并不會(huì)將其與項(xiàng)目期限或者預(yù)算水平一樣納入業(yè)績(jī)考核。另外,某些企業(yè)可能強(qiáng)制要求某些并未參與開發(fā)的人員在規(guī)定期限內(nèi)完成修復(fù)工作。這種方針使得開發(fā)者肆無(wú)忌憚地向生產(chǎn)環(huán)境中投放高風(fēng)險(xiǎn)代碼,畢竟其無(wú)需為后續(xù)錯(cuò)誤負(fù)責(zé)。
總結(jié)
面對(duì)以上理由,單元測(cè)試也許確實(shí)不應(yīng)由開發(fā)者負(fù)責(zé)編寫。但在這里我還要***呼吁一句:請(qǐng)務(wù)必認(rèn)真對(duì)待單元測(cè)試,其對(duì)于企業(yè)的長(zhǎng)期健康發(fā)展至關(guān)重要!
原文標(biāo)題:9 Reasons Why a Developer Wouldn't Write Unit Tests 原文作者:Joe Wolf
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】





















