你真正需要的代碼測試覆蓋率是多少?
本文是從 How much code coverage do you really need? 這篇文章翻譯而來。
我寫這篇文章的起因是由于看了@unclebobmartin在微博上的一些看起來言之鑿鑿的話語。給那些不認識Uncle Bob的人介紹一下——他是我們軟件產業里最著名的一個專家,是《 Clean Code(代碼整潔之道)》這本著作的作者,是敏捷宣言(Agile Manifesto)的簽署人之一。在上世紀九十年代,他對文獻最佳面向對象實踐方法貢獻了很大的力量。所以,當他說話時,我們一定要關注一下。
他給我們日常的TDD和單元測試制訂了一個最高綱領。我們可以從他的微博里清楚的看到這點:
“兩件事。可重復性和成本。跟自動化測試比起來,手工測試的成本高的可怕。”
“手工測試不是測試;那是在做實驗。只要有人的因素牽涉其中,那結果就必然可疑。”
“你們告訴我的實際意思就是讓我大開方便之門、不去測試某些程序。哼…”
“代碼覆蓋率100%并不是成績,那是最低要求。即使只寫了一行代碼,你也要測試它。”
他接著把軟件測試跟在其它領域里常見的但被認為很關鍵的活動進行了比較:
“戰地外科醫生也許沒有最夠的時間做嚴格的消毒,但這帶來的風險可能是死亡或高昂的治療代價。”
“會計難道只會把80%的數據表做雙份備份嗎?”
“有多少回你們都看到了那些嚴重的宕機事故都是因為一些愚蠢的程序員以為那些愚蠢的代碼不許要經過測試而導致的?“
他的所有這些觀點都很有價值,但他只向我們展示了問題的一面。現實中并不是所有的應用都需要如此謹小慎微的測試。并不是所有的應用都跟戰地手術或巨額資金核算那么重要。(更不要說在很多情況下的為”合理避稅“而做的帳務:))。
一個更重要的原因是,100%的測試覆蓋率并不能保證bug的不出現。就連Uncle Bob自己也承認:
”測試并不能杜絕bug。但測試能保證程序的行為是符合預期的。“
這很顯然指的是:同一個程序員在程序里埋下的概念性或邏輯性錯誤,由他自己測是絕對測不出來的。
最終,所有的問題歸結于ROI(投資收回率)和實用主義。有些應用比其它應用需要更多的測試。有些bug需要比其它bug投入更多的精力去修復。究竟是否需要在自動化測試是投入更多的時間和財力,或多少覆蓋率是合適的還是過分了,這都需要人的主觀判斷。