從戴維ž恩斯坦教數千軟體開發者們如何更有效地以測試驅動開發的10年來,他學會了掌握測試驅動開發的3個關鍵組成部分:理解它真正是什麼,使**穩定可測,並且獲得實際動手經驗。讓我們看這些因素,找到它在你的專案中為有效地使用測試驅動開發帶來什麼。
在過去10年來,我有教數千個專業軟體開發者如何有效地測試驅動開發的權利。從這些經驗中,我學會了測試驅動開發的3個關鍵因素:理解它真正是什麼,使**確實可測試,並且獲取一手的經驗。讓我們看一看這些因素中的每乙個,去看看使用測試驅動開發能有效地在你的專案中帶來什麼。
1.理解什麼是測試驅動開發
有效的測試驅動開發的第一主要的組成部分是理解它真正是什麼。我發現有很多關於如何恰當地做測試驅動開發的錯誤想法,並且測試驅動開發是那種,如果你做錯了,你會經常付出乙個很高的代價的實踐。
在這篇短的文章中有更多的介紹測試驅動開發,但是我注意到的其中一件事是對人們來講更有挑戰的是人們把測試驅動開發想象成測試或者質量保證的一種形式。我認為在做測試驅動開發時,這是錯誤心態。
qa的思維模式是在思考可能出現的問題並且找到保證它不再發生的方法。開發的思維模式更樂觀,專注於發生的事情,為了事情順利進行。
不考慮將測試驅動開發作為測試**的一種方式,我想把測試驅動開發想成系統特殊行為的一種方式。這引導我創造非常不同的測試種類,它趨向於將來更有彈性地改變,因為我正在驗證行為而不是測試**塊。
術語「單元測試」也有點誤解。假如我們在寫**之前寫測試,那麼它實際上不是一次測試,因為當我們寫它時,沒有可測試的東西。在這個點上叫它一次測試有點奇怪。反之,我想要把它認為是一種假說。當我們在寫**之前寫測試時,我們在假定**將如何執行,我們需要通過什麼,以及將返回什麼。
這類似於我們如何接近科學。我們不能隨機執行實驗。我們經常開始一種假設:我們正在嘗試通過或不通過的東西。我們能想出乙個實驗去通過或者不通過我們的假設。把你的實驗考慮成假設,並且你寫的**是為了使測試作為一種實驗通過,來證明這個假設。
但更大的誤解是,我發現人們在嘗試tdd時真的會掛起**,這是他們認為「單元」的意思。對很多開發來講,當他們在「單元測試」裡看到術語「單元」,他們想到一段**,像乙個方法或者一段宣告,或者甚至一行簡單的**。這不是本文中「單元」的含義。就像我理解它的,術語「單元」被接受成強調乙個功能獨立的單元。
理想情況下,我們後面的行為是對我們正嘗試獲取的驗收標準的間接支援。當單元測試也是驗收測試時,我們自然得到需求可追溯性和可驗證性。
乙個「行為單元」可能包含一些以合作為工作目的的物件。舉個例子,在拍賣中測試投標規則可能需要乙個賣方物件來建立乙個拍賣物件和乙個投標人物件在拍賣中投標。有些人將把它作為一次整合測試,因為它包含一些物件的互動。我把它稱為乙個單元測試,因為我正在測試投標行為的乙個單元。
我經常發現當我們關注於可以滿足驗收標準的附加特性時,我們編寫的**的維護成本要低得多,因為設計更容易理解和擴充套件。
2.使不可測試的**可測
學習測試驅動開發的第二個關鍵因素是掌握一系列使不可測試的**可測試的技術。很多已存在的**是很難測試的,並且當我們不得不和那些**互動時,很難讓它接受測試。
通過我參觀的很多公司,我在**中看到的乙個主要問題是為了使用一項服務,一位顧客將被例項化並且直接呼叫那項服務。從外部來看,服務和服務的客戶端似乎是相同的,不能被拆分。但是,當這一系統在整個系統中反覆進行時,它使系統成為乙個糾纏在一起的**鼠窩,不可能獨立地進行分離和測試。
這個問題的解決方案是一種稱為依賴注入的技術。你可能很熟悉依賴注入框架的獨立性,比如spring。但是你能手動地注入依賴,不使用乙個框架。代替使乙個物件例項化乙個服務然後使用它,我們委託例項化成乙個不同的物件,然後將引用傳遞給使用它的客戶端。
允許對服務的引用傳遞給服務的使用者,當我們測試時讓我們傳入假。它是乙個簡單的概念,對做小的、可測試的單元行為和分開整體的**是相當重要的。
我可以通過幾種虛擬來代替依賴。乙個通過簡單的歸類和覆蓋你的**互動的方法來創造手工模擬的方法。你可以呼叫你的mock的覆蓋方法,而不是呼叫真正的依賴關係,它能返回任何有意義的東西。記住,我們這兒的目標是測試我們的**可互動與外部依賴,而不是它自身的依賴。
3.做測試驅動開發的經驗
擁有編寫良好的行為測試和能夠編寫好的、可測試的**的技能,只是掌握測試驅動開發所需的部分內容。第三和最重要的掌握測試驅動開發的因素是體驗去做它。當開發者做了測試驅動開發並且看到他們的測試如何立即捕捉問題——結果是他們的**有多好——他們開始在專案中做測試驅動開發。
在綠色田野專案中學習測試驅動開發是有用的,因為在遺留**上進行測試驅動開發會有更多複雜性。這本身就是乙個完成的學習領域,在專案中有一些優秀的書。我想每乙個專業軟體開發應該讀馬丁ž福勒的重構:改進已有**的設計。而且如果你正在遺留**上工作,然後你也應該讀麥可ž西ž羽毛的有效率地同老**工作——並且不要忘了檢視一下我的書,在遺留程式之上:9種擴充套件你的軟體生命(和價值)的實踐。
當我首次啟動教軟體開發關於測試——驅動開發,我給他們關於真正的測試驅動開發以及如何使不可測試的**可測試的講座。他們知道該怎麼做,但我們沒有在乙個專案上一起實踐tdd,所以它沒有堅持下去。6個月後我將返回,在團隊中沒有人再做測試驅動開發了。
但是當我開始包括12個小時的實踐練習使用測試驅動開發作為培訓的一部分,我看到人們做了乙個徹底的轉變,因為他們看到了做tdd的好處。這確實是我們學習和得到新行為的唯一的方法:通過做它們並且向我們證明它們是有價值的。你不能從聽別人說乙個話題而獲得經驗。
理解真正的測試驅動開發是什麼,知道如何使不可測試的**可測,在專案中做測試驅動開發獲取實踐經驗的好處是掌握測試驅動開發的3個關鍵因素。我發現當開發有這3個關鍵因素時,他們為測試驅動開發而感到高興,並且在他們的專案中持續做這件事。
OKR失敗的五個關鍵因素
okr是近年來的乙個熱點話題,這種目標管理法在谷歌體現了它非凡的價值,也因此被facebook linkedin等公司所引用。從實踐成功的案例看來,okr確實是一種可以明確公司目標 促進公司發展的有價值值得去嘗試的管理方法。隨著okr的熱潮湧入國內,不少國內企業也開始紛紛嘗試,希望可以借助這種新的管...
亞馬遜成功的四個關鍵因素
隨著亞馬遜 amazon 逐漸成為全球首家市值達數萬億美元的公司,人們開始重新關注可能阻礙其增長的因素。該公司本季度增長有所放緩,股價 11 亞馬遜是創新領域的新事物,他們行動快,實施了很多的新產品 流程和商業模式創新,以至於他們的功能突然成為每個公司衡量自己是否落後的標準。亞馬遜是未來的新模式。亞...
實施資料湖的三個關鍵因素
資料湖的實施可以為分析所有型別的外部和內部資料,提供巨大的靈活性 必需具備三大要素。格雷普韋恩,德克薩斯州 像任何其他工具或技術一樣,資料湖是一種儲存庫和處理引擎,有它的優點和缺點。它的著名優點之一是,可以在不犧牲資料格式的情況下,攝取資料,為資料科學家提供更大的靈活性。將資料湖看作為你的疑問開發環...