為什么開源C/C++單元測試框架極昂貴?
三月份,準(zhǔn)備搞一個(gè)C/C++單元測試在線培訓(xùn),草擬了一份課程提綱,發(fā)給一位老朋友(馬工)征求意見,馬工在一家研究院工作,領(lǐng)導(dǎo)一個(gè)近百人的開發(fā)團(tuán)隊(duì),單元測試推廣和實(shí)施都很有經(jīng)驗(yàn),給我的意見只有幾句話:
刪除開源框架部分,這個(gè)太昂貴,用的企業(yè)會(huì)越來越少,講這個(gè)浪費(fèi)聽眾的時(shí)間。我猜你花一大段時(shí)間來講開源框架,目的僅僅是為了減少宣傳商業(yè)工具的嫌疑,課程只要考慮聽眾的真正利益(學(xué)到有用的東西)就行,何必考慮別的。”
課程內(nèi)容刪除開源框架部分,這個(gè)我馬上接受,因?yàn)楫?dāng)初加上這部分內(nèi)容,原因正是馬工所猜的。不過,用“太昂貴”來形容免費(fèi)的開源框架,有些匪夷所思,我知道用開源框架做C/C++單元測試很難且成本很高,但從沒想到“昂貴”這個(gè)詞。在電話里和馬工聊了半天,討論了C/C++單元測試框架“太昂貴”的理由,整理如下。
免費(fèi)的反而“昂貴”,這很平常,比如企業(yè)要派一個(gè)人從成都到北京出差,可以坐飛機(jī)、坐火車、租汽車,也可以借一輛自行車騎過去,前幾種都是要付錢的,騎自行車免費(fèi),毫無疑問,騎自行車是最昂貴的,“昂貴”表現(xiàn)在:費(fèi)錢(不算別的,工資就很嚇人)、費(fèi)力(這種累死人的事誰愿意干?)、誤事(這個(gè)不用解釋吧?)。[點(diǎn)評(píng):我個(gè)比喻我也用過,不過沒那么透徹,真是有實(shí)踐者所見略同]
使用C/C++單元測試框架做單元測試,其結(jié)果跟騎自行車很像,也是費(fèi)錢、費(fèi)力、誤事。
費(fèi)錢:工具可以免費(fèi),人才不能免費(fèi),相反,人才極昂貴,而且越來越最昂貴。一個(gè)程序員,如果月薪1萬,企業(yè)實(shí)際要支付的全部成本為1.5到2萬,折算成每小時(shí)的成本,大概是100元,也就是說,寫1小時(shí)的測試代碼,企業(yè)要付出100元,這是使用開源框架的成本,是不是比自動(dòng)化工具昂貴得多?[反駁:用工資低的實(shí)習(xí)生或初級(jí)程序員來寫測試代碼,成本不就降低了嗎?答:那就別做單元測試了,單元測試是程序員自己做的,要邊開發(fā)邊做,越是重要的程序員越要做(因?yàn)樗麑懙拇a也越重要),事后讓別人做單元測試,那是毫無意義的,除非每個(gè)函數(shù)都有非常詳細(xì)的文檔,可是誰做得到?]
費(fèi)力:程序員為什么不愿“寫”單元測試?請(qǐng)注意,是“寫”單元測試,不是“做”單元測試。程序員不是不知道單元測試的好,而是不愿意寫測試代碼,因?yàn)樘珶┝?。程序員不怕難,最怕煩。創(chuàng)造往往很難,但卻是程序員的***,也是程序員的價(jià)值所在。測試代碼既然用工具都可以生成,自然沒有創(chuàng)造性,程序員怎么可能喜歡寫呢?讓程序員做自己很不喜歡做的事,這是很累人的,特別費(fèi)力。
誤事:誤事表現(xiàn)在三方面:
一、花很多時(shí)間來寫測試代碼,延長了項(xiàng)目的周期,嚴(yán)重時(shí)可能失去市場機(jī)會(huì)。
二、太費(fèi)力,程序員可能消極應(yīng)對(duì),最終做不下去,折騰很長時(shí)間,又回到原點(diǎn)。
三、測試不充分,很多測試點(diǎn),是手工編寫代碼難以達(dá)到的,舉個(gè)簡單的例子,要讓malloc()在***個(gè)用例返回NULL,其他用例正常申請(qǐng)內(nèi)存,手工編寫代碼就很難做到。用開源框架,完成代碼覆蓋都幾乎不可能,而使用合適的商業(yè)工具,完成MCDC覆蓋一點(diǎn)也不困難。