登錄

測(cè)試驅(qū)動(dòng)開發(fā)

百科 > 軟件項(xiàng)目管理 > 測(cè)試驅(qū)動(dòng)開發(fā)

1.什么是測(cè)試驅(qū)動(dòng)開發(fā)

  測(cè)試驅(qū)動(dòng)開發(fā),英文全稱Test-Driven Development,簡(jiǎn)稱TDD,是一種不同于傳統(tǒng)軟件開發(fā)流程的新型的開發(fā)方法。它要求在編寫某個(gè)功能的代碼之前先編寫測(cè)試代碼,然后只編寫使測(cè)試通過(guò)的功能代碼,通過(guò)測(cè)試來(lái)推動(dòng)整個(gè)開發(fā)的進(jìn)行。這有助于編寫簡(jiǎn)潔可用和高質(zhì)量的代碼,并加速開發(fā)過(guò)程。

2.測(cè)試驅(qū)動(dòng)開發(fā)的本質(zhì)

  TDD將測(cè)試方案設(shè)計(jì)工作提前,在編寫代碼之前先做:從測(cè)試的角度來(lái)驗(yàn)證設(shè)計(jì),推導(dǎo)設(shè)計(jì);同時(shí)將測(cè)試方案當(dāng)作行為的準(zhǔn)繩,有效地利用其檢驗(yàn)代碼編寫的每一步,實(shí)時(shí)驗(yàn)證其正確性。如此循環(huán)迭代,實(shí)現(xiàn)開發(fā)過(guò)程的“小步快走”。

  TDD是一種分析方法。在TDD中,需求將完全表述為測(cè)試代碼。這樣,軟件設(shè)計(jì)師的需求工作就不再是編寫用例規(guī)約來(lái)覆蓋用戶的需要,而是迫使仔細(xì)思考要做什么和不做什么。特別是各種例外的情況,并用程序語(yǔ)言正式的寫下來(lái),即編寫測(cè)試代碼來(lái)捕獲用戶的需要。將需求整理為測(cè)試代碼的形式。只要代碼只要能夠通過(guò)測(cè)試,就代表該代碼設(shè)計(jì)已經(jīng)能夠滿足客戶需求。當(dāng)然,這種肯定是有前提的。即測(cè)試代碼能夠完整的、精確的描述需求。另外,因?yàn)閺氖褂谜叩慕嵌葘懗鰷y(cè)試代碼。除要關(guān)心程序功能的本身外,還要對(duì)接口予以足夠關(guān)注。便于更進(jìn)一步明確需求。

  TDD是一種設(shè)計(jì)方法。它用測(cè)試推進(jìn)設(shè)計(jì)。必須清晰的定義程序的界面才能寫出測(cè)試用例,通過(guò)編寫測(cè)試用例,對(duì)其功能分解、使用過(guò)程、接口都要進(jìn)行了設(shè)計(jì)。而且,這種從易用性的視角的代碼設(shè)計(jì),通常更符合后期開發(fā)的需求可測(cè)試的要求。對(duì)代碼的內(nèi)聚性的提高和復(fù)用都非常有益。這樣的需求總是完整的被體現(xiàn)在了各個(gè)模塊的接口上。即。保證對(duì)接口的使用能夠正確無(wú)誤的進(jìn)行,就保證了這個(gè)模塊的最終質(zhì)量。

  TDD是一種質(zhì)量控制方法。開發(fā)者在項(xiàng)目的壓力下往往忽略測(cè)試,而沒(méi)有測(cè)試的軟件增加了開發(fā)者的壓力,TDD有一套完整的單元測(cè)試作為回歸測(cè)試。保證現(xiàn)在能工作的代碼將來(lái)也能工作,也可作為集成測(cè)試的檢查點(diǎn)。TDD不是通常意義上的測(cè)試技術(shù),它的目的也不是僅僅用來(lái)測(cè)試你的代碼。TDD是把需求分析。設(shè)計(jì),質(zhì)量控制量化的過(guò)程!

  TDD是一種重構(gòu)和優(yōu)化的方法。程序員總希望代碼質(zhì)量高,所以會(huì)不斷地去改進(jìn),TDD確保改進(jìn)和優(yōu)化后的質(zhì)量TDD是一種面向?qū)ο蟮拈_發(fā)方法。程序員必須清晰地定義程序的界面和功能才能寫出單元測(cè)試用例,而不必關(guān)心邏輯是如何實(shí)現(xiàn)。

  TDD是文檔。TDD是通過(guò)寫測(cè)試來(lái)寫代碼,當(dāng)用這個(gè)視角去實(shí)踐TDD時(shí),測(cè)試用例會(huì)細(xì)化到以什么條件和參數(shù)、調(diào)用什么方法及會(huì)有什么返回值等,這就是文檔,產(chǎn)生的測(cè)試用例代碼就是對(duì)代碼的最好的解釋。說(shuō)明了代碼的運(yùn)行機(jī)制,而且這種程序自我編檔的方式也促進(jìn)了交流和反饋。

  TDD提供的測(cè)試集是信心的來(lái)源??鞓?lè)工作的基礎(chǔ)就是對(duì)自己有信心。對(duì)自己的工作成果有信心:不用擔(dān)心代碼是否正確、還有沒(méi)有嚴(yán)重bug、修改對(duì)其他部分有沒(méi)有影響。

3.測(cè)試驅(qū)動(dòng)開發(fā)的基本過(guò)程

  測(cè)試驅(qū)動(dòng)開發(fā)的基本思想就是在開發(fā)功能代碼之前,先編寫測(cè)試代碼,然后只編寫使測(cè)試通過(guò)的功能代碼,從而以測(cè)試來(lái)驅(qū)動(dòng)整個(gè)開發(fā)過(guò)程的進(jìn)行。這有助于編寫簡(jiǎn)潔可用和高質(zhì)量的代碼,有很高的靈活性和健壯性,能快速響應(yīng)變化,并加速開發(fā)過(guò)程。測(cè)試驅(qū)動(dòng)開發(fā)的基本過(guò)程如下:

  ①快速新增一個(gè)測(cè)試

 ?、谶\(yùn)行所有的測(cè)試(有時(shí)候只需要運(yùn)行一個(gè)或一部分),發(fā)現(xiàn)新增的測(cè)試不能通過(guò)

 ?、圩鲆恍┬⌒〉母膭?dòng),盡快地讓測(cè)試程序可運(yùn)行,為此可以在程序中使用一些不合情理的方法

  ④運(yùn)行所有的測(cè)試,并且全部通過(guò)

 ?、葜貥?gòu)代碼,以消除重復(fù)設(shè)計(jì),優(yōu)化設(shè)計(jì)結(jié)構(gòu)

  簡(jiǎn)單來(lái)說(shuō),就是不可運(yùn)行/可運(yùn)行/重構(gòu)——這正是測(cè)試驅(qū)動(dòng)開發(fā)的口號(hào)。

4.測(cè)試驅(qū)動(dòng)開發(fā)的優(yōu)勢(shì)

  測(cè)試驅(qū)動(dòng)開發(fā)不是一種測(cè)試技術(shù),它是一種分析技術(shù)、設(shè)計(jì)技術(shù),更是一種組織所有開發(fā)活動(dòng)的技術(shù)。相對(duì)于傳統(tǒng)的結(jié)構(gòu)化開發(fā)過(guò)程方法,它具有以下優(yōu)勢(shì):

  1)TDD根據(jù)客戶需求編寫測(cè)試用例,對(duì)功能的過(guò)程和接口都進(jìn)行了設(shè)計(jì),而且這種從使用者角度對(duì)代碼進(jìn)行的設(shè)計(jì)通常更符合后期開發(fā)的需求。因?yàn)殛P(guān)注用戶反饋,可以及時(shí)響應(yīng)需求變更,同時(shí)因?yàn)閺氖褂谜呓嵌瘸霭l(fā)的簡(jiǎn)單設(shè)計(jì),也可以更快地適應(yīng)變化。

  2)出于易測(cè)試和測(cè)試獨(dú)立性的要求,將促使我們實(shí)現(xiàn)松耦合的設(shè)計(jì),并更多地依賴于接口而非具體的類,提高系統(tǒng)的可擴(kuò)展性和抗變性。而且TDD明顯地縮短了設(shè)計(jì)決策的反饋循環(huán),使我們幾秒或幾分鐘之內(nèi)就能獲得反饋。

  3)將測(cè)試工作提到編碼之前,并頻繁地運(yùn)行所有測(cè)試,可以盡量地避免和盡早地發(fā)現(xiàn)錯(cuò)誤,極大地降低了后續(xù)測(cè)試及修復(fù)的成本,提高了代碼的質(zhì)量。在測(cè)試的保護(hù)下,不斷重構(gòu)代碼,以消除重復(fù)設(shè)計(jì),優(yōu)化設(shè)計(jì)結(jié)構(gòu),提高了代碼的重用性,從而提高了軟件產(chǎn)品的質(zhì)量。

  4)TDD提供了持續(xù)的回歸測(cè)試,使我們擁有重構(gòu)的勇氣,因?yàn)榇a的改動(dòng)導(dǎo)致系統(tǒng)其他部分產(chǎn)生任何異常,測(cè)試都會(huì)立刻通知我們。完整的測(cè)試會(huì)幫助我們持續(xù)地跟蹤整個(gè)系統(tǒng)的狀態(tài),因此我們就不需要擔(dān)心會(huì)產(chǎn)生什么不可預(yù)知的副作用了。

  5)TDD所產(chǎn)生的單元測(cè)試代碼就是最完美的開發(fā)者文檔,它們展示了所有的API該如何使用以及是如何運(yùn)作的,而且它們與工作代碼保持同步,永遠(yuǎn)是最新的。

  6)TDD可以減輕壓力、降低憂慮、提高我們對(duì)代碼的信心、使我們擁有重構(gòu)的勇氣,這些都是快樂(lè)工作的重要前提。

  7)快速的提高了開發(fā)效率。

5.測(cè)試驅(qū)動(dòng)開發(fā)與傳統(tǒng)測(cè)試

  TDD實(shí)質(zhì)是一種編程技術(shù).它間接地確保代碼能徹底地被單元測(cè)試檢查。但仍然需要參考傳統(tǒng)的一些測(cè)試比如功能測(cè)試、用戶驗(yàn)收測(cè)試、系統(tǒng)集成測(cè)試等等。一個(gè)好的傳統(tǒng)測(cè)試能發(fā)現(xiàn)一個(gè)或多個(gè)漏洞。此理論同樣適用于TDD。當(dāng)一個(gè)測(cè)試失敗時(shí)就必須進(jìn)行改進(jìn),因?yàn)樾枰鉀Q這個(gè)問(wèn)題。更重要的是,當(dāng)測(cè)試不再失敗時(shí).就可以清楚地知道成功了多少。TDD增強(qiáng)了信心因?yàn)樗m應(yīng)了預(yù)先定下的需求。

  像傳統(tǒng)的測(cè)試一樣,項(xiàng)目風(fēng)險(xiǎn)越大,就要更徹底地進(jìn)行測(cè)試,盡可能測(cè)試一切可以測(cè)試的東西『61。傳統(tǒng)測(cè)試和TDD中都不可能為著完美而奮斗,代之的是測(cè)試系統(tǒng)的重要性,應(yīng)該帶著目的去測(cè)試、知道為什么要測(cè)試以及測(cè)試是在什么等級(jí)。TDD的代碼測(cè)試覆蓋率是100%.這是傳統(tǒng)測(cè)試所不能保證的。

  如果為一個(gè)功能值得寫代碼,那么一定值得測(cè)試。如果不值得測(cè)試.那又何必浪費(fèi)時(shí)間去寫一些無(wú)用的代碼呢?TDD不能替代傳統(tǒng)的測(cè)試,相反它定義一種驗(yàn)證方式來(lái)確保單元測(cè)試的有效性。

評(píng)論  |   0條評(píng)論