如何說服你的同事使用TDD

2021-08-14 11:14:52 字數 3432 閱讀 5500

tdd(test-driven development),也就是我們常說的「測試驅動開發」,是由 kent beck

在2023年提出的概念。tdd這個術語,經常被人掛在嘴邊,然而真正在專案實施,卻寥寥無幾。

是tdd對開發者要求太高?還是tdd根本就不值得去做?

非也。為了讓大家對tdd有乙個具體而親切的認識,我先給大家舉乙個在程式設計中使用tdd進行開發的實際例子。

這是一道計算保齡球比賽一局總得分的程式設計題,保齡球的計分規則非常簡單:

題目要求我們提供乙個名字為game的類,這個類有兩個方法:

下面開始使用tdd來完成這個程式設計訓練。

如果此時你已經在開始構思要如何實現,請打住!因為這不是tdd的風格。

記住,先別想著怎麼去實現,先寫測試用例,也就是先把你呼叫這個game類的**寫下來。

首先,我們建立乙個bowlinggametest類:

import

junit.framework.testcase

;public

class

bowlinggametest

extends

testcase

接著新增第乙個測試用例:

當我們剛剛new了乙個game物件時,編譯器就提示錯誤了,此時暫停測試用例的編寫,開始編寫產品**!(這麼做似乎有點過於耿直,不過對於加深對tdd的印象還是很有幫助的)

我們建立了game類,此時編譯通過,執行所有單元測試,綠條!

接著我們在第乙個單元測試中呼叫roll方法和score方法,同樣的,我們遇到編譯不通過的問題,再依次給game加上對應方法後,我們得到了下面這段**:

我們心裡很清楚,這個**是經不住考驗的,我們隨便新增乙個單元測試,都可以讓測試用例不通過。比如我們讓乙個保齡球世界排名倒數第一的球手去比賽,每輪他都只擊倒乙個球瓶,測試用例毫不猶豫地失敗了:

於是我們要修改一下邏輯,在每次roll的時候,加上分數。細心的讀者可能還發現了,下面這段**還對測試**進行了重構,把每個單元測試都要做的new game()操作抽取到了setup方法中:

接著我們又發現我們經常要模擬很多次擊倒相同數量球瓶的操作,因此我們把這個操作抽取成乙個rollmany方法:

我們的**到這裡還完成不到1/3,但是我們已經做了兩次重構,沒錯,tdd的過程,也是不斷小步重構的過程。

接下來,我們測試一下spare的場景,這一次測試用例又理所當然的失敗了(不要擔心一次次失敗會打擊自信心,因為這些都是我們刻意製造的失敗,人們面對意料之中的失敗往往更有激情)。而當我們準備動手修改產品**時,卻發現了乙個**設計層面的問題,那就是我們在roll方法裡面做了roll不應該做的事情,roll意味著扔球,而我們卻在裡面修改了得分:

此時我們需要把新增的用例暫時遮蔽掉,然後對產品**進行重構,roll專心做它的事,把計算得分的活交給score來做:

接下來,就是繼續放開我們之前遮蔽掉的測試用例,繼續修改產品**,讓測試用例通過,然後再新增strike的測試場景、新增更多的測試場景…… 這些過程就不再贅述了,因為作為乙個tdd的例子,前面這幾個步驟,已經足夠讓大家對tdd有乙個比較深刻地理解了。

上面的保齡球訓練中,我們一直在遵循著tdd的三項法則:

遵循著三項法則,我們開發的過程就是下面這五個步驟不斷迴圈、小步迭進的過程:

新增測試用例。

編寫產品**。

重構。返回第一步,繼續迴圈。

tdd帶來的最大好處是提高了單元測試的覆蓋率。 傳統的先寫產品**,再寫單元測試,有兩個弊端:

那麼提高了單元測試的覆蓋率對產品有什麼好處呢?健康的單元測試覆蓋率是在90%以上,為什麼要那麼高?高覆蓋率帶來的好處主要有以下三點:

除了提高單元測試的覆蓋率,tdd還能夠促成良好的**設計。由於你先寫測試**,你會盡可能的讓**呼叫起來更加簡單方便,這也就促使你去考慮如何更好的設計**。如果不先寫測試,最後很有可能就會出現乙個函式裡實現的功能過多,或者和其他**過於耦合而無法測試的情況。

在學習一項技術時,總是要提醒自己——「沒有銀彈」,任何技術都有其侷限性。然而,由於用tdd的人實在不多,在網上搜了很久,也看不到什麼特別有建設性的觀點。下面是我找到的一些關於tdd侷限性的看法:

回到這篇文章的主題,「如何說服你的同事使用tdd」,首先,你被我說服了麼?

如果你的回答是yes,你被我說服了,你打算開始使用tdd,好,下面我給出一些練習和使用tdd的建議。

1)tdd katas 訓練 

先不要急著在工作中去使用tdd,bob大叔的**上還有很多跟保齡球訓練類似的題目,你可以去練習一下。而且,相同的練習可以反覆訓練,bob大叔在他的《程式設計師的職業素養》裡是這麼說的:

和習武者一樣,程式設計師應該懂得很多種不同的卡塔,並定期練習,確保不會淡化或遺忘…

真正的挑戰是把乙個卡塔練習到爐火純青,你可以窺見其中的規律。要做到這一點可不容易。

下面是bob大叔推薦的卡塔:

bob大叔的主頁上還有很多其他的kata,大家可以上去探索探索。

3)面試時使用tdd

面試時,如果面試官讓你在紙上寫**,那就給面試官show一下tdd吧,將紙張一分為二,一半寫測試用例,一半寫實際**,當然,你可以先寫偽碼,因為總免不了要重構,全部寫完再用實際**寫一遍,交給面試官。

同樣的,tdd可以緩解你一行**都寫不出來的緊張心情。

好了,我似乎又走題了,到底「如何說服你的同事使用tdd」,很簡單,用實際行動告訴他們!如果你在使用了tdd之後,確實提公升了**質量,降低了**缺陷率,那麼請理直氣壯地和他們分享你使用tdd的心得。

tdd是專業人士的選擇,它是一項能夠提公升**確定性,給程式設計師激勵、降低**缺陷率、優化文件和設計的原則。對tdd的各項嘗試表明,不使用tdd就說明你可能還不夠專業。 —— bob,《程式設計師的職業素養》

如何說服他人 說服的藝術

在生活工作中,你有好的建議需要別人去配合,這樣的話就必須讓別人了解做這件事的原因,效果,不實行,將會帶來的影響,必須互相進行溝通。以下內容分別是從網上摘錄下來的片段 1.建議研讀 管理 溝通與談判 書上寫得比較清楚。2.在管理工作中,說服和指揮方法上的選擇,主要是對何事,其次是在何時。只有搞清楚事情...

培訓機構的小姐姐是如何說服你的。。。

秋招已經接近尾聲,我在成都也已經找了好多家公司面試了,但都不是很順利。歸根結底,還是自己的技術能力不夠吧,在有了生存的壓迫之下,自己的學習才能夠有緊迫性,希望抓緊時間。但是今天我主要想說的確實另外的一件事。前天到一家公司面試,說起奇怪,這家公司的位址給我的感覺跟其他的不一樣,我以前面試的公司一般都是...

Unity 之 專案中如何坑害你的同事

維護根本不存在的,讓他們知道你就這個專案的上帝,你寫的不是 你寫的是密碼!加密性很高的密碼!只要你離開,專案就會分崩離析,而且你也是遊走在崩潰的邊緣,就是這麼6,玩的就是心跳 我們宗旨是 前人挖坑,後人埋雷,最後乙個被炸飛!1.預製體名稱字尾加空格 載入的時候明明和預製體名稱一致但是無法找到,是不是...