日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
詳解設(shè)計(jì)測(cè)試驅(qū)動(dòng)開發(fā)TDD技術(shù)總體流程

我們談到的TDD技術(shù)主要是從設(shè)計(jì)的角度談起,對(duì)于測(cè)試的全過(guò)程進(jìn)行分析與總結(jié),希望通過(guò)本文能對(duì)大家有所幫助。

創(chuàng)新互聯(lián)公司長(zhǎng)期為千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為東河企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站建設(shè),東河網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

測(cè)試驅(qū)動(dòng)開發(fā)(TDD)是極限編程的重要特點(diǎn),它以不斷的測(cè)試推動(dòng)代碼的開發(fā),既簡(jiǎn)化了代碼,又保證了軟件質(zhì)量。本文從開發(fā)人員使用的角度,介紹了TDD技術(shù)優(yōu)勢(shì)、原理、過(guò)程、原則、測(cè)試技術(shù)、Tips 等方面。

背景

一個(gè)高效的軟件開發(fā)過(guò)程對(duì)軟件開發(fā)人員來(lái)說(shuō)是至關(guān)重要的,決定著開發(fā)是痛苦的掙扎,還是不斷進(jìn)步的喜悅。國(guó)人對(duì)軟件藍(lán)領(lǐng)的不屑,對(duì)繁瑣冗長(zhǎng)的傳統(tǒng)開發(fā)過(guò)程的不耐,使大多數(shù)開發(fā)人員無(wú)所適從。最近興起的一些軟件開發(fā)過(guò)程相關(guān)的技術(shù),提供一些比較高效、實(shí)用的軟件過(guò)程開發(fā)方法。其中比較基礎(chǔ)、關(guān)鍵的一個(gè)技術(shù)就是測(cè)試驅(qū)動(dòng)開發(fā)(Test-Driven Development)。雖然TDD光大于極限編程,但測(cè)試驅(qū)動(dòng)開發(fā)完全可以單獨(dú)應(yīng)用。下面就從開發(fā)人員使用的角度進(jìn)行介紹,使開發(fā)人員用最少的代價(jià)盡快理解、掌握、應(yīng)用這種技術(shù)。下面分優(yōu)勢(shì),原理,過(guò)程,原則,測(cè)試技術(shù),Tips等方面進(jìn)行討論。

1. 優(yōu)勢(shì)

TDD技術(shù)的基本思路就是通過(guò)測(cè)試來(lái)推動(dòng)整個(gè)開發(fā)的進(jìn)行。而測(cè)試驅(qū)動(dòng)開發(fā)技術(shù)并不只是單純的測(cè)試工作。

需求向來(lái)就是軟件開發(fā)過(guò)程中感覺(jué)最不好明確描述、易變的東西。這里說(shuō)的需求不只是指用戶的需求,還包括對(duì)代碼的使用需求。很多開發(fā)人員最害怕的就是后期還要修改某個(gè)類或者函數(shù)的接口進(jìn)行修改或者擴(kuò)展,為什么會(huì)發(fā)生這樣的事情就是因?yàn)檫@部分代碼的使用需求沒(méi)有很好的描述。測(cè)試驅(qū)動(dòng)開發(fā)就是通過(guò)編寫測(cè)試用例,先考慮代碼的使用需求(包括功能、過(guò)程、接口等),而且這個(gè)描述是無(wú)二義的,可執(zhí)行驗(yàn)證的。

通過(guò)編寫這部分代碼的測(cè)試用例,對(duì)其功能的分解、使用過(guò)程、接口都進(jìn)行了設(shè)計(jì)。而且這種從使用角度對(duì)代碼的設(shè)計(jì)通常更符合后期開發(fā)的需求。可測(cè)試的要求,對(duì)代碼的內(nèi)聚性的提高和復(fù)用都非常有益。因此測(cè)試驅(qū)動(dòng)開發(fā)也是一種代碼設(shè)計(jì)的過(guò)程。

開發(fā)人員通常對(duì)編寫文檔非常厭煩,但要使用、理解別人的代碼時(shí)通常又希望能有文檔進(jìn)行指導(dǎo)。而測(cè)試驅(qū)動(dòng)開發(fā)過(guò)程中產(chǎn)生的測(cè)試用例代碼就是對(duì)代碼的最好的解釋。

快樂(lè)工作的基礎(chǔ)就是對(duì)自己有信心,對(duì)自己的工作成果有信心。當(dāng)前很多開發(fā)人員卻經(jīng)常在擔(dān)心:“代碼是否正確?”“辛苦編寫的代碼還有沒(méi)有嚴(yán)重bug?”“修改的新代碼對(duì)其他部分有沒(méi)有影響?”。這種擔(dān)心甚至導(dǎo)致某些代碼應(yīng)該修改卻不敢修改的地步。測(cè)試驅(qū)動(dòng)開發(fā)提供的測(cè)試集就可以作為你信心的來(lái)源。

當(dāng)然測(cè)試驅(qū)動(dòng)開發(fā)最重要的功能還在于保障代碼的正確性,能夠迅速發(fā)現(xiàn)、定位bug。而迅速發(fā)現(xiàn)、定位bug是很多開發(fā)人員的夢(mèng)想。針對(duì)關(guān)鍵代碼的測(cè)試集,以及不斷完善的測(cè)試用例,為迅速發(fā)現(xiàn)、定位bug提供了條件。

我的一段功能非常復(fù)雜的代碼使用TDD開發(fā)完成,真實(shí)環(huán)境應(yīng)用中只發(fā)現(xiàn)幾個(gè)bug,而且很快被定位解決。您在應(yīng)用后,也一定會(huì)為那種自信的開發(fā)過(guò)程,功能不斷增加、完善的感覺(jué),迅速發(fā)現(xiàn)、定位bug的能力所感染,喜歡這個(gè)技術(shù)的。

那么是什么樣的原理、方法提供上面說(shuō)的這些好處哪?下面我們就看看TDD的原理。

2. 原理

測(cè)試驅(qū)動(dòng)開發(fā)的基本思想就是在開發(fā)功能代碼之前,先編寫測(cè)試代碼。也就是說(shuō)在明確要開發(fā)某個(gè)功能后,首先思考如何對(duì)這個(gè)功能進(jìn)行測(cè)試,并完成測(cè)試代碼的編寫,然后編寫相關(guān)的代碼滿足這些測(cè)試用例。然后循環(huán)進(jìn)行添加其他功能,直到完全部功能的開發(fā)。

我們這里把這個(gè)技術(shù)的應(yīng)用領(lǐng)域從代碼編寫擴(kuò)展到整個(gè)開發(fā)過(guò)程。應(yīng)該對(duì)整個(gè)開發(fā)過(guò)程的各個(gè)階段進(jìn)行測(cè)試驅(qū)動(dòng),首先思考如何對(duì)這個(gè)階段進(jìn)行測(cè)試、驗(yàn)證、考核,并編寫相關(guān)的測(cè)試文檔,然后開始下一步工作,最后再驗(yàn)證相關(guān)的工作。下圖是一個(gè)比較流行的測(cè)試模型:V測(cè)試模型。

【圖 V測(cè)試模型】

在開發(fā)的各個(gè)階段,包括需求分析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編碼過(guò)程中都應(yīng)該考慮相對(duì)應(yīng)的測(cè)試工作,完成相關(guān)的測(cè)試用例的設(shè)計(jì)、測(cè)試方案、測(cè)試計(jì)劃的編寫。這里提到的開發(fā)階段只是舉例,根據(jù)實(shí)際的開發(fā)活動(dòng)進(jìn)行調(diào)整。相關(guān)的測(cè)試文檔也不一定是非常詳細(xì)復(fù)雜的文檔,或者什么形式,但應(yīng)該養(yǎng)成測(cè)試驅(qū)動(dòng)的習(xí)慣。

關(guān)于測(cè)試模型,還有X測(cè)試模型。這個(gè)測(cè)試模型,我認(rèn)為,是對(duì)詳細(xì)階段和編碼階段進(jìn)行建模,應(yīng)該說(shuō)更詳細(xì)的描述了詳細(xì)設(shè)計(jì)和編碼階段的開發(fā)行為。及針對(duì)某個(gè)功能進(jìn)行對(duì)應(yīng)的測(cè)試驅(qū)動(dòng)開發(fā)。

【圖 X測(cè)試模型】

基本原理應(yīng)該說(shuō)非常簡(jiǎn)單,那么如何進(jìn)行實(shí)際操作哪,下面對(duì)開發(fā)過(guò)程進(jìn)行詳細(xì)的介紹。

3. 過(guò)程

軟件開發(fā)其他階段的測(cè)試驅(qū)動(dòng)開發(fā),根據(jù)測(cè)試驅(qū)動(dòng)開發(fā)的思想完成對(duì)應(yīng)的測(cè)試文檔即可。下面針對(duì)詳細(xì)設(shè)計(jì)和編碼階段進(jìn)行介紹。

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

1) 明確當(dāng)前要完成的功能??梢杂涗洺梢粋€(gè) TODO 列表。

2) 快速完成針對(duì)此功能的測(cè)試用例編寫。

3) 測(cè)試代碼編譯不通過(guò)。

4) 編寫對(duì)應(yīng)的功能代碼。

5) 測(cè)試通過(guò)。

6) 對(duì)代碼進(jìn)行重構(gòu),并保證測(cè)試通過(guò)。

7) 循環(huán)完成所有功能的開發(fā)。

為了保證整個(gè)測(cè)試過(guò)程比較快捷、方便,通??梢允褂脺y(cè)試框架組織所有的測(cè)試用例。一個(gè)免費(fèi)的、優(yōu)秀的測(cè)試框架是 Xunit 系列,幾乎所有的語(yǔ)言都有對(duì)應(yīng)的測(cè)試框架。我曾經(jīng)寫過(guò)一篇文章介紹CppUnit的文章( http://www.ibm.com/developerworks/cn/linux/l-cppunit/index.html)。

開發(fā)過(guò)程中,通常把測(cè)試代碼和功能代碼分開存放,這里提供一個(gè)簡(jiǎn)單的測(cè)試框架使用例子,您可以通過(guò)它了解測(cè)試框架的使用。下面是文件列表。

 
 
 
 
  1. project/                項(xiàng)目主目錄  
  2.     project/test            測(cè)試項(xiàng)目主目錄  
  3.     project/test/testSeq.cpp        測(cè)試seq_t 的測(cè)試文件,對(duì)其他功能文件的測(cè)試文件復(fù)制后修改即可  
  4.     project/test/testSeq.h  
  5.     project/test/Makefile           測(cè)試項(xiàng)目的 Makefile   
  6.     project/test/main.cpp           測(cè)試項(xiàng)目的主文件,不需要修改  
  7.     project/main.cpp                   項(xiàng)目的主文件  
  8.     project/seq_t.h         功能代碼,被測(cè)試文件  
  9.     project/Makefile                   項(xiàng)目的 Makefile 
主要流程基本如此,但要讓你的代碼很容易的進(jìn)行測(cè)試,全面又不繁瑣的進(jìn)行測(cè)試,還是有很多測(cè)試原則和技術(shù)需要考慮。

4. 原則

測(cè)試隔離。不同代碼的測(cè)試應(yīng)該相互隔離。對(duì)一塊代碼的測(cè)試只考慮此代碼的測(cè)試,不要考慮其實(shí)現(xiàn)細(xì)節(jié)(比如它使用了其他類的邊界條件)。

一頂帽子。開發(fā)人員開發(fā)過(guò)程中要做不同的工作,比如:編寫測(cè)試代碼、開發(fā)功能代碼、對(duì)代碼重構(gòu)等。做不同的事,承擔(dān)不同的角色。開發(fā)人員完成對(duì)應(yīng)的工作時(shí)應(yīng)該保持注意力集中在當(dāng)前工作上,而不要過(guò)多的考慮其他方面的細(xì)節(jié),保證頭上只有一頂帽子。避免考慮無(wú)關(guān)細(xì)節(jié)過(guò)多,無(wú)謂地增加復(fù)雜度。

測(cè)試列表。需要測(cè)試的功能點(diǎn)很多。應(yīng)該在任何階段想添加功能需求問(wèn)題時(shí),把相關(guān)功能點(diǎn)加到測(cè)試列表中,然后繼續(xù)手頭工作。然后不斷的完成對(duì)應(yīng)的測(cè)試用例、功能代碼、重構(gòu)。一是避免疏漏,也避免干擾當(dāng)前進(jìn)行的工作。

測(cè)試驅(qū)動(dòng)。這個(gè)比較核心。完成某個(gè)功能,某個(gè)類,首先編寫測(cè)試代碼,考慮其如何使用、如何測(cè)試。然后在對(duì)其進(jìn)行設(shè)計(jì)、編碼。

先寫斷言。測(cè)試代碼編寫時(shí),應(yīng)該首先編寫對(duì)功能代碼的判斷用的斷言語(yǔ)句,然后編寫相應(yīng)的輔助語(yǔ)句。

可測(cè)試性。功能代碼設(shè)計(jì)、開發(fā)時(shí)應(yīng)該具有較強(qiáng)的可測(cè)試性。其實(shí)遵循比較好的設(shè)計(jì)原則的代碼都具備較好的測(cè)試性。比如比較高的內(nèi)聚性,盡量依賴于接口等。

及時(shí)重構(gòu)。無(wú)論是功能代碼還是測(cè)試代碼,對(duì)結(jié)構(gòu)不合理,重復(fù)的代碼等情況,在測(cè)試通過(guò)后,及時(shí)進(jìn)行重構(gòu)。關(guān)于重構(gòu),我會(huì)另撰文詳細(xì)分析。

小步前進(jìn)。軟件開發(fā)是個(gè)復(fù)雜性非常高的工作,開發(fā)過(guò)程中要考慮很多東西,包括代碼的正確性、可擴(kuò)展性、性能等等,很多問(wèn)題都是因?yàn)閺?fù)雜性太大導(dǎo)致的。極限編程提出了一個(gè)非常好的思路就是小步前進(jìn)。把所有的規(guī)模大、復(fù)雜性高的工作,分解成小的任務(wù)來(lái)完成。對(duì)于一個(gè)類來(lái)說(shuō),一個(gè)功能一個(gè)功能的完成,如果太困難就再分解。每個(gè)功能的完成就走測(cè)試代碼-功能代碼-測(cè)試-重構(gòu)的循環(huán)。通過(guò)分解降低整個(gè)系統(tǒng)開發(fā)的復(fù)雜性。這樣的效果非常明顯。幾個(gè)小的功能代碼完成后,大的功能代碼幾乎是不用調(diào)試就可以通過(guò)。一個(gè)個(gè)類方法的實(shí)現(xiàn),很快就看到整個(gè)類很快就完成啦。本來(lái)感覺(jué)很多特性需要增加,很快就會(huì)看到?jīng)]有幾個(gè)啦。你甚至?xí)檫@個(gè)速度感到震驚。(我理解,是大幅度減少調(diào)試、出錯(cuò)的時(shí)間產(chǎn)生的這種速度感)

5. 測(cè)試技術(shù)

5.1. 測(cè)試范圍、粒度

對(duì)哪些功能進(jìn)行測(cè)試?會(huì)不會(huì)太繁瑣?什么時(shí)候可以停止測(cè)試?這些問(wèn)題比較常見(jiàn)。按大師 Kent Benk 的話,對(duì)那些你認(rèn)為應(yīng)該測(cè)試的代碼進(jìn)行測(cè)試。就是說(shuō),要相信自己的感覺(jué),自己的經(jīng)驗(yàn)。那些重要的功能、核心的代碼就應(yīng)該重點(diǎn)測(cè)試。感到疲勞就應(yīng)該停下來(lái)休息一下。感覺(jué)沒(méi)有必要更詳細(xì)的測(cè)試,就停止本輪測(cè)試。

測(cè)試驅(qū)動(dòng)開發(fā)強(qiáng)調(diào)測(cè)試并不應(yīng)該是負(fù)擔(dān),而應(yīng)該是幫助我們減輕工作量的方法。而對(duì)于何時(shí)停止編寫測(cè)試用例,也是應(yīng)該根據(jù)你的經(jīng)驗(yàn),功能復(fù)雜、核心功能的代碼就應(yīng)該編寫更全面、細(xì)致的測(cè)試用例,否則測(cè)試流程即可。

測(cè)試范圍沒(méi)有靜態(tài)的標(biāo)準(zhǔn),同時(shí)也應(yīng)該可以隨著時(shí)間改變。對(duì)于開始沒(méi)有編寫足夠的測(cè)試的功能代碼,隨著bug的出現(xiàn),根據(jù)bug補(bǔ)齊相關(guān)的測(cè)試用例即可。

小步前進(jìn)的原則,要求我們對(duì)大的功能塊測(cè)試時(shí),應(yīng)該先分拆成更小的功能塊進(jìn)行測(cè)試,比如一個(gè)類A使用了類B、C,就應(yīng)該編寫到A使用B、C功能的測(cè)試代碼前,完成對(duì)B、C的測(cè)試和開發(fā)。那么是不是每個(gè)小類或者小函數(shù)都應(yīng)該測(cè)試哪?我認(rèn)為沒(méi)有必要。你應(yīng)該運(yùn)用你的經(jīng)驗(yàn),對(duì)那些可能出問(wèn)題的地方重點(diǎn)測(cè)試,感覺(jué)不可能出問(wèn)題的地方就等它真正出問(wèn)題的時(shí)候再補(bǔ)測(cè)試吧。

5.2. 怎么編寫測(cè)試用例
測(cè)試用例的編寫就用上了傳統(tǒng)的測(cè)試技術(shù)。

◆操作過(guò)程盡量模擬正常使用的過(guò)程。

◆全面的測(cè)試用例應(yīng)該盡量做到分支覆蓋,核心代碼盡量做到路徑覆蓋。

◆測(cè)試數(shù)據(jù)盡量包括:真實(shí)數(shù)據(jù)、邊界數(shù)據(jù)。

◆測(cè)試語(yǔ)句和測(cè)試數(shù)據(jù)應(yīng)該盡量簡(jiǎn)單,容易理解。

◆為了避免對(duì)其他代碼過(guò)多的依賴,可以實(shí)現(xiàn)簡(jiǎn)單的樁函數(shù)或樁類(Mock Object)。

◆如果內(nèi)部狀態(tài)非常復(fù)雜或者應(yīng)該判斷流程而不是狀態(tài),可以通過(guò)記錄日志字符串的方式進(jìn)行驗(yàn)證。

6. Tips

很多朋友有疑問(wèn),“測(cè)試代碼的正確性如何保障?是寫測(cè)試代碼還是寫測(cè)試文檔?”這樣是不是會(huì)陷入“雞生蛋,蛋生雞”的循環(huán)。其實(shí)是不會(huì)的。通常測(cè)試代碼通常是非常簡(jiǎn)單的,通常圍繞著某個(gè)情況的正確性判斷的幾個(gè)語(yǔ)句,如果太復(fù)雜,就應(yīng)該繼續(xù)分解啦。而傳統(tǒng)的開發(fā)過(guò)程通常強(qiáng)調(diào)測(cè)試文檔。但隨著開發(fā)節(jié)奏的加快,用戶需求的不斷變化,維護(hù)高層(需求、概要設(shè)計(jì))的測(cè)試文檔可以,更低層的測(cè)試文檔的成本的確太大了。而且可實(shí)時(shí)驗(yàn)證功能正確性的測(cè)試代碼就是對(duì)代碼最好的文檔。

軟件開發(fā)過(guò)程中,除了遵守上面提到的測(cè)試驅(qū)動(dòng)開發(fā)的幾個(gè)原則外,一個(gè)需要注意的問(wèn)題就是,謹(jǐn)防過(guò)度設(shè)計(jì)。編寫功能代碼時(shí)應(yīng)該關(guān)注于完成當(dāng)前功能點(diǎn),通過(guò)測(cè)試,使用最簡(jiǎn)單、直接的方式來(lái)編碼。過(guò)多的考慮后期的擴(kuò)展,其他功能的添加,無(wú)疑增加了過(guò)多的復(fù)雜性,容易產(chǎn)生問(wèn)題。應(yīng)該等到要添加這些特性時(shí)在進(jìn)行詳細(xì)的測(cè)試驅(qū)動(dòng)開發(fā)。到時(shí)候,有整套測(cè)試用例做基礎(chǔ),通過(guò)不斷重構(gòu)很容易添加相關(guān)特性。

參考資料

◆推薦 Kent Beck 的書 Test-Driven Development: By Example ,中文版是《測(cè)試驅(qū)動(dòng)開發(fā)》 http://www.china-pub.com/computers/common/info.asp?id=14701

◆免費(fèi)、優(yōu)秀的測(cè)試框架 *unit 系列,包括: Junit http://www.junit.org CppUnit http://cppunit.sourceforge.net/

◆我曾經(jīng)寫的一篇介紹 CppUnit 使用的文章 《便利的開發(fā)工具CppUnit 快速使用指南》 http://www.ibm.com/developerworks/cn/linux/l-cppunit/index.html

◆介紹測(cè)試模型的文章 《This or That, V or X? 》 http://www.sdbestpractices.com/documents/s=8815/sdm0208e/ 中文翻譯見(jiàn) 《軟件測(cè)試:不可忽略的階段》 http://developer.ccidnet.com/pub/disp/Article?columnID=291&articleID=37924&pageNO=1 《軟件測(cè)試:V模型,還是X模型?》 http://developer.ccidnet.com/pub/disp/Article?columnID=291&articleID=37975&pageNO=1

◆《Unit Test 研究報(bào)告》 http://blog.aspcool.com/tim/posts/349.aspx

◆這里搜集了一些相關(guān)的文章 http://www.ihere.org/modules/newbb/viewforum.php?forum=10


網(wǎng)頁(yè)名稱:詳解設(shè)計(jì)測(cè)試驅(qū)動(dòng)開發(fā)TDD技術(shù)總體流程
網(wǎng)站網(wǎng)址:http://www.dlmjj.cn/article/dpccdsp.html