說起單元測試的好處相信大家都能列舉出不少,可是很多時候,開發人員面對自己產品的**,想寫單元測試卻無從下手,久而久之,便會有人大喊:「我討厭單元測試。」資深敏捷諮詢師騰振宇(daniel teng)在gtug-topgeek開發工程管理沙龍就以此為題,結合最近的乙個專案,和大家分享了他對單元測試的一些看法。
daniel先介紹了下最近的乙個專案,雖然不是遺留系統,但**已經慘不忍睹,而且缺乏必要的測試保障,要修改**可謂舉步維艱。例如,一段**和結對夥伴讀了半小時沒讀懂,找來原作者看著注釋又想了10分鐘,終於才搞明白這段**是做什麼的。根據二八原則,先找到那20%的點,修改它帶來80%的價值。最直接的做法就是尋找**庫里最常被修改的檔案,一般的檔案只有幾次修改,有的檔案則被修改了幾十次,每個人都在往複雜的**裡加入新的東西,但沒有人往裡面加測試,於是第一步就是為它增加測試。
很多開發者會說老專案就算了,如果新啟動乙個專案,我就會寫單元測試了,daniel認為這是乙個「美好的夢想」,很多原因會打破它:
究其根本原因,是開發者根本不會寫單元測試!滿足什麼標準的測試才是單元測試呢?根據《修改**的藝術》,需要訪問資料庫的測試不是單元測試,需要訪問網路的測試不是單元測試,需要訪問檔案系統的測試不是單元測試……
為了更方便地進行單元測試,業務**應避免以下情況:
例如,在**中存在硬編碼,或者是直接建立了乙個資料庫連線,這種做法都是比較危險的,因為在測試時沒有辦法「偷梁換柱」。
想要寫好單元測試,學會重構是很重要的,重構的過程類似於清理廚房,雖然和做飯沒太大關係,但可以讓您下次做飯更方便,心情更好。可以重構的地方包括,在待測試類與其依賴之間增加一層test fixture;將建立邏輯與業務邏輯分開等等。重構可以採取以下策略:
最後,daniel還為大家提了一些建議:
隨後有人提問,如何評估乙個單元測試的質量,用**行覆蓋率是否可行。daniel認為沒必要去追求**行覆蓋率,真正要覆蓋的是邏輯,而不是**行。通過結對程式設計可以減少低質量的單元測試,人都喜歡改變,但沒人喜歡被改變,不要強求結對程式設計,讓他看到好處,嚐到甜頭,吸引他來做結對程式設計,沒有人喜歡落後,比如50%的人在做結對了,剩下的人自然會想嘗試。
當被問及單元測試是否是必須的時候,daniel回答這並不是必要的,而是需要進行綜合的衡量,比如你的競爭對手一周前推出了乙個產品,你需要在一周內完成產品研發並上線,這時可以選擇寫或者不寫單元測試,對於沒有寫過單元測試的人,一開始是需要上手的成本的。
我討厭單元測試 滕振宇談如何進行單元測試
說起單元測試的好處相信大家都能列舉出不少,可是很多時候,開發人員面對自己產品的 想寫單元測試卻無從下手,久而久之,便會有人大喊 我討厭單元測試。資深敏捷諮詢師騰振宇 daniel teng 在gtug topgeek開發工程管理沙龍就以此為題,結合最近的乙個專案,和大家分享了他對單元測試的一些看法。...
我討厭單元測試 滕振宇談如何進行單元測試
本文首發於infoq中文站 說起單元測試的好處相信大家都能列舉出不少,可是很多時候,開發人員面對自己產品的 想寫單元測試卻無從下手,久而久之,便會有人大喊 我討厭單元測試。資深敏捷諮詢師騰振宇 daniel teng 在gtug topgeek開發工程管理沙龍 就以此為題,結合最近的乙個專案,和大家...
我討厭單元測試 滕振宇談如何進行單元測試
說起單元測試的好處相信大家都能列舉出不少,可是很多時候,開發人員面對自己產品的 想寫單元測試卻無從下手,久而久之,便會有人大喊 我討厭單元測試。資深敏捷諮詢師騰振宇 daniel teng 在gtug topgeek開發工程管理沙龍就以此為題,結合最近的乙個專案,和大家分享了他對單元測試的一些看法。...