![測試驅(qū)動(dòng)開發(fā)—測試驅(qū)動(dòng)開發(fā)簡介_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/12/56d924a7-3f3b-4dad-a462-fea6bedf0df7/56d924a7-3f3b-4dad-a462-fea6bedf0df71.gif)
![測試驅(qū)動(dòng)開發(fā)—測試驅(qū)動(dòng)開發(fā)簡介_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/12/56d924a7-3f3b-4dad-a462-fea6bedf0df7/56d924a7-3f3b-4dad-a462-fea6bedf0df72.gif)
![測試驅(qū)動(dòng)開發(fā)—測試驅(qū)動(dòng)開發(fā)簡介_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/12/56d924a7-3f3b-4dad-a462-fea6bedf0df7/56d924a7-3f3b-4dad-a462-fea6bedf0df73.gif)
![測試驅(qū)動(dòng)開發(fā)—測試驅(qū)動(dòng)開發(fā)簡介_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/12/56d924a7-3f3b-4dad-a462-fea6bedf0df7/56d924a7-3f3b-4dad-a462-fea6bedf0df74.gif)
![測試驅(qū)動(dòng)開發(fā)—測試驅(qū)動(dòng)開發(fā)簡介_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/12/56d924a7-3f3b-4dad-a462-fea6bedf0df7/56d924a7-3f3b-4dad-a462-fea6bedf0df75.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 2002 IBM Corporation測試驅(qū)動(dòng)開發(fā)1.1測試驅(qū)動(dòng)開發(fā)簡介Jan 2010 張文勝xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY2主題 測試驅(qū)動(dòng)開發(fā)的基本概念 測試驅(qū)動(dòng)的基本流程 測試驅(qū)動(dòng)的所采用的技術(shù)及工具 DEMOxianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY3本章目標(biāo) 掌握測試驅(qū)動(dòng)開發(fā)的基本概念 掌握驅(qū)動(dòng)的基本流程 掌握測試驅(qū)動(dòng)的所采用的技術(shù)及工具xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY41-1 基本概念 為什么會(huì)出現(xiàn)測試驅(qū)動(dòng)開發(fā)?l
2、 當(dāng)有一個(gè)新的開發(fā)任務(wù)時(shí),往往第一個(gè)念頭就是如何去實(shí)現(xiàn)當(dāng)有一個(gè)新的開發(fā)任務(wù)時(shí),往往第一個(gè)念頭就是如何去實(shí)現(xiàn) 它呢?它呢?l “應(yīng)該是這么做的吧,嗯,差不多就是這樣的應(yīng)該是這么做的吧,嗯,差不多就是這樣的” ” 。l 抓起任務(wù)就開始編碼,一邊寫,一邊修改和設(shè)計(jì)。抓起任務(wù)就開始編碼,一邊寫,一邊修改和設(shè)計(jì)。l 時(shí)間這么緊!我還是先實(shí)現(xiàn)任務(wù)吧,然后再好好測試。時(shí)間這么緊!我還是先實(shí)現(xiàn)任務(wù)吧,然后再好好測試。l 還是不工作,時(shí)間不多了。不管了,還是先做個(gè)實(shí)現(xiàn),以后還是不工作,時(shí)間不多了。不管了,還是先做個(gè)實(shí)現(xiàn),以后再來整理代碼吧。再來整理代碼吧。l 我已經(jīng)單步調(diào)試了好幾次了,遍歷了所有可能的分支,應(yīng)該
3、我已經(jīng)單步調(diào)試了好幾次了,遍歷了所有可能的分支,應(yīng)該不會(huì)有問題了,提交,今天可以好好休息一下了。不會(huì)有問題了,提交,今天可以好好休息一下了。l 要不要寫單元測試把我剛才單步調(diào)試的步驟寫下來?。磕菢右灰獙憜卧獪y試把我剛才單步調(diào)試的步驟寫下來???那樣是很好,但工作量很大哦。是很好,但工作量很大哦。l 這樣的情況要作自動(dòng)測試太復(fù)雜了。還是手工測試一下吧。這樣的情況要作自動(dòng)測試太復(fù)雜了。還是手工測試一下吧。l 程序員應(yīng)該做些有創(chuàng)意的東西,這樣才有趣啊。程序員應(yīng)該做些有創(chuàng)意的東西,這樣才有趣啊。l 測試是測試是QAQA的事,我為什么要做啊,我做了他們干什么啊。的事,我為什么要做啊,我做了他們干什么啊。
4、xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY51-1 基本概念 為什么會(huì)出現(xiàn)測試驅(qū)動(dòng)開發(fā)?l 奇怪了,怎么代碼跟開發(fā)文檔上有這么大的差別啊。奇怪了,怎么代碼跟開發(fā)文檔上有這么大的差別啊。l 這段代碼究竟想表達(dá)什么意思?這段代碼究竟想表達(dá)什么意思? l 代碼現(xiàn)在越來越亂了,我都不敢修改代碼了,修改了這個(gè)地方,代碼現(xiàn)在越來越亂了,我都不敢修改代碼了,修改了這個(gè)地方,天曉得會(huì)引起多少別的地方出錯(cuò)啊天曉得會(huì)引起多少別的地方出錯(cuò)啊! !l 這個(gè)地方的代碼怎么好象在那個(gè)地方看到過???這個(gè)程序里怎這個(gè)地方的代碼怎么好象在那個(gè)地方看到過啊?這個(gè)程序里怎么會(huì)有這么多
5、的重復(fù)代碼呢?么會(huì)有這么多的重復(fù)代碼呢?l 開發(fā)部在干什么啊,開發(fā)部在干什么啊,BUGBUG怎么這么多,他們有沒有自己先測試怎么這么多,他們有沒有自己先測試一下啊。一下啊。l 這下好了,讓他們修改了一個(gè)這下好了,讓他們修改了一個(gè)BUGBUG,現(xiàn)在一下子來了這么多的,現(xiàn)在一下子來了這么多的BUGBUG。l他們到底在搞什么啊,有沒有從用戶的角度考慮啊,我新增一他們到底在搞什么啊,有沒有從用戶的角度考慮啊,我新增一個(gè)采購訂單,訂單項(xiàng)竟然可以輸入負(fù)數(shù)。個(gè)采購訂單,訂單項(xiàng)竟然可以輸入負(fù)數(shù)。 xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY61-1 基本概念有辦法
6、可以解決上面的矛盾嗎?xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY71-1 基本概念什么是測試驅(qū)動(dòng)?測試驅(qū)動(dòng)是一種開發(fā)形式:測試驅(qū)動(dòng)是一種開發(fā)形式:1.1.首先要編寫測試代碼首先要編寫測試代碼2.2.除非存在相關(guān)測試,否則不編寫任何的產(chǎn)品代碼除非存在相關(guān)測試,否則不編寫任何的產(chǎn)品代碼3.3.由測試來決定需要編寫什么樣的代碼由測試來決定需要編寫什么樣的代碼4.4.要求維護(hù)一套詳盡的測試集要求維護(hù)一套詳盡的測試集xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY81-1 基本概念 測試驅(qū)動(dòng)所要達(dá)到的目標(biāo)clean
7、 code that workclean code that work 測試驅(qū)動(dòng)所追求的目標(biāo)就是代碼整潔可用,其實(shí)測試驅(qū)動(dòng)所追求的目標(biāo)就是代碼整潔可用,其實(shí)現(xiàn)的規(guī)則就是:現(xiàn)的規(guī)則就是:1.1.只有測試失敗時(shí),我們才寫代碼只有測試失敗時(shí),我們才寫代碼2.2.消除重復(fù)設(shè)計(jì),優(yōu)化設(shè)計(jì)結(jié)構(gòu)消除重復(fù)設(shè)計(jì),優(yōu)化設(shè)計(jì)結(jié)構(gòu)xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY91-2 基本流程 測試驅(qū)動(dòng)開發(fā)的基本流程l定義應(yīng)用程序的要求定義應(yīng)用程序的要求l熟悉應(yīng)用程序的功能區(qū)域,確定要使用的單項(xiàng)功能項(xiàng)或功能要求熟悉應(yīng)用程序的功能區(qū)域,確定要使用的單項(xiàng)功能項(xiàng)或功能要求l創(chuàng)建驗(yàn)
8、證要求的測試列表創(chuàng)建驗(yàn)證要求的測試列表l為功能或要求定義接口和類為功能或要求定義接口和類l編寫測試代碼編寫測試代碼l運(yùn)行測試運(yùn)行測試l根據(jù)測試生成產(chǎn)品代碼根據(jù)測試生成產(chǎn)品代碼l重新運(yùn)行測試,根據(jù)測試修改產(chǎn)品代碼,直到所有測試都通過重新運(yùn)行測試,根據(jù)測試修改產(chǎn)品代碼,直到所有測試都通過l整理代碼整理代碼l重復(fù)上面的步驟重復(fù)上面的步驟xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY101-2 基本流程 測試驅(qū)動(dòng)開發(fā)的基本流程xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY111-3 技術(shù)及工具 技術(shù)及工具介紹Ecl
9、ipseEclipse是一個(gè)集成開發(fā)工具的通用平臺(tái),因是一個(gè)集成開發(fā)工具的通用平臺(tái),因?yàn)槿魏稳硕伎梢悦赓M(fèi)獲得源碼以及軟件本身為任何人都可以免費(fèi)獲得源碼以及軟件本身的方便,因此成為許多人的喜愛,的方便,因此成為許多人的喜愛,junitjunit是供是供JavaJava編碼人員做單元測試之用,在編碼人員做單元測試之用,在eclipseeclipse中中使用使用junitjunit測試測試JavaJava程序能夠體現(xiàn)測試驅(qū)動(dòng)開程序能夠體現(xiàn)測試驅(qū)動(dòng)開發(fā)的測試思想,本課通過實(shí)例對(duì)在發(fā)的測試思想,本課通過實(shí)例對(duì)在eclipseeclipse中中使用使用junitjunit測試的方法進(jìn)行了分析。測試的方法進(jìn)
10、行了分析。 xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY121-3 技術(shù)及工具 Eclipse介紹Eclipse Eclipse 是是IBMIBM投入巨資開發(fā)的替代投入巨資開發(fā)的替代IBM IBM Visual Age for Java Visual Age for Java 的下一代的下一代IDEIDE開發(fā)環(huán)境,在開開發(fā)環(huán)境,在開發(fā)結(jié)束以后發(fā)結(jié)束以后IBMIBM把該軟件贈(zèng)與了國際開放源代碼團(tuán)體,把該軟件贈(zèng)與了國際開放源代碼團(tuán)體,任何人都能輕易地下載到任何人都能輕易地下載到EclipseEclipse的源代碼。軟件可的源代碼。軟件可以集成很多軟件開
11、發(fā)工具供應(yīng)商的產(chǎn)品,任何開發(fā)工以集成很多軟件開發(fā)工具供應(yīng)商的產(chǎn)品,任何開發(fā)工具廠商都可以將開發(fā)工具或許主件加入到具廠商都可以將開發(fā)工具或許主件加入到EclipseEclipse平平臺(tái),用戶可以通過相同的接口使用不同的工具,也就臺(tái),用戶可以通過相同的接口使用不同的工具,也就是在一個(gè)集成環(huán)境中使用不同的開發(fā)工具。是在一個(gè)集成環(huán)境中使用不同的開發(fā)工具。 xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY131-3 技術(shù)及工具 JUnit介紹JUnitJUnit是一款由是一款由Erich GammaErich Gamma(設(shè)計(jì)模式設(shè)計(jì)模式的的作者)和作者)和Ke
12、nt BeckKent Beck(極限編程的提出者)編寫的開(極限編程的提出者)編寫的開源的回歸測試框架,供源的回歸測試框架,供JavaJava編碼人員做單元測試之用,編碼人員做單元測試之用,可以從網(wǎng)站上免費(fèi)獲得??梢詮木W(wǎng)站上免費(fèi)獲得。因?yàn)閮煞N軟件的源碼都能從網(wǎng)上免費(fèi)下載,因因?yàn)閮煞N軟件的源碼都能從網(wǎng)上免費(fèi)下載,因此受到越來越多的開發(fā)人員、測試人員的喜愛。此受到越來越多的開發(fā)人員、測試人員的喜愛。 xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY141-4 DEMO -一個(gè)簡單的測試 TDDTDD意味著您不僅需要為每一段代碼編寫測試用例,而且意味著您不
13、僅需要為每一段代碼編寫測試用例,而且意味著測試優(yōu)先。測試用例用來定義代碼需要做什么。在意味著測試優(yōu)先。測試用例用來定義代碼需要做什么。在完成相應(yīng)的代碼之后,運(yùn)行測試用例來保證代碼確實(shí)符合完成相應(yīng)的代碼之后,運(yùn)行測試用例來保證代碼確實(shí)符合測試用例的規(guī)定。測試用例的規(guī)定。 創(chuàng)建一個(gè)簡單的創(chuàng)建一個(gè)簡單的JavaJava類類 創(chuàng)建一個(gè)測試類來執(zhí)行這個(gè)創(chuàng)建一個(gè)測試類來執(zhí)行這個(gè)JavaJava類類 使用使用JUnitJUnit框架框架 學(xué)習(xí)構(gòu)造函數(shù)學(xué)習(xí)構(gòu)造函數(shù) 重構(gòu)您所寫的代碼重構(gòu)您所寫的代碼xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY151-4 DEMO -
14、一個(gè)簡單的測試 StudentTest StudentTest將創(chuàng)建將創(chuàng)建StudentStudent類的對(duì)象,發(fā)送消息給這些對(duì)象,類的對(duì)象,發(fā)送消息給這些對(duì)象,并且證明一旦所有的消息被發(fā)送出去,一切都能像預(yù)期的那樣。并且證明一旦所有的消息被發(fā)送出去,一切都能像預(yù)期的那樣。因而因而StudentTestStudentTest類依賴于類依賴于StudentStudent類,如圖中的有向關(guān)聯(lián)所表類,如圖中的有向關(guān)聯(lián)所表達(dá)的意思。相反,達(dá)的意思。相反,StudentStudent不依賴于不依賴于StudentTestStudentTest:生產(chǎn)類對(duì)為生產(chǎn)類對(duì)為它編寫的測試一無所知。它編寫的測試一無所
15、知。xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY161-4 DEMO -一個(gè)簡單的測試 TDD意味著您不僅需要為每一段代碼編寫測試用例,而且意味著測試優(yōu)先。 一、創(chuàng)建項(xiàng)目一、創(chuàng)建項(xiàng)目 啟動(dòng)啟動(dòng)EclipseEclipse,選擇工作區(qū),選擇,選擇工作區(qū),選擇filefile菜單下的菜單下的newnew創(chuàng)建創(chuàng)建project,project,選擇類別為選擇類別為Java projectJava project,我們?yōu)轫?xiàng)目起名為,我們?yōu)轫?xiàng)目起名為Drive_Test,Drive_Test,保存項(xiàng)目文件。保存項(xiàng)目文件。xianzws Jan 2010 20
16、10 XIAN EURASIA UNIVERSITY171-4 DEMO -一個(gè)簡單的測試 二、寫測試用例二、寫測試用例獲取學(xué)生信息是初始的需求。為了表達(dá)這個(gè)需求,開始獲取學(xué)生信息是初始的需求。為了表達(dá)這個(gè)需求,開始創(chuàng)建一個(gè)用作測試用例的類。創(chuàng)建一個(gè)用作測試用例的類。首先,在您的機(jī)器上新建一個(gè)包,然后在這個(gè)包里面創(chuàng)首先,在您的機(jī)器上新建一個(gè)包,然后在這個(gè)包里面創(chuàng)建一個(gè)文件建一個(gè)文件StudentTest.javaStudentTest.java。在編輯器中輸入代碼:。在編輯器中輸入代碼: StudentTestStudentTest將從獲得或是繼承所有的將從獲得或是繼承所有的能力(行為)和數(shù)據(jù)
17、(屬性能力(行為)和數(shù)據(jù)(屬性) 必須指定該類為必須指定該類為public類型,這樣類型,這樣JUnit測試框架才能識(shí)別它測試框架才能識(shí)別它xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY181-4 DEMO -一個(gè)簡單的測試 UML UML類圖展示了類圖展示了StudentTest StudentTest 和和 之間的繼承關(guān)系?,F(xiàn)在之間的繼承關(guān)系?,F(xiàn)在StudentTestStudentTest同時(shí)依賴于同時(shí)依賴于和和StudentStudent。請(qǐng)記住表示不同依賴關(guān)。請(qǐng)記住表示不同依賴關(guān)系的箭頭有所區(qū)別:封閉的箭頭表示繼承關(guān)系。系的箭頭有所區(qū)別:封
18、閉的箭頭表示繼承關(guān)系。 xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY191-4 DEMO -一個(gè)簡單的測試 二、寫測試用例二、寫測試用例配置配置EclipseEclipse,在構(gòu)建路徑中添加,在構(gòu)建路徑中添加JUnitJUnit類庫。在工具條類庫。在工具條上點(diǎn)擊項(xiàng)目上點(diǎn)擊項(xiàng)目-屬性,選擇屬性,選擇JavaJava構(gòu)建路徑,庫,選擇添加構(gòu)建路徑,庫,選擇添加外部外部JARJAR,瀏覽,瀏覽JunitJunit被存儲(chǔ)的目錄,選擇被存儲(chǔ)的目錄,選擇junit.jarjunit.jar,點(diǎn),點(diǎn)擊打開。將會(huì)看見擊打開。將會(huì)看見JUnitJUnit出現(xiàn)在庫的列
19、表中。點(diǎn)擊確定,出現(xiàn)在庫的列表中。點(diǎn)擊確定,讓讓EclipseEclipse重建路徑。重建路徑。 xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY201-4 DEMO -一個(gè)簡單的測試 二、寫測試用例二、寫測試用例 也可以這樣建立測試,在也可以這樣建立測試,在Drive_TestDrive_Test的標(biāo)題上面點(diǎn)擊的標(biāo)題上面點(diǎn)擊右鍵,選擇新建右鍵,選擇新建-其他,展開其他,展開“Java”Java”選項(xiàng),選擇選項(xiàng),選擇JUnitJUnit。在右邊的欄目對(duì)話框中選擇測試案例,然后下一步。在右邊的欄目對(duì)話框中選擇測試案例,然后下一步。 xianzws Jan
20、 2010 2010 XIAN EURASIA UNIVERSITY211-4 DEMO -一個(gè)簡單的測試 三、執(zhí)行測試用例三、執(zhí)行測試用例 當(dāng)成功編譯了當(dāng)成功編譯了StudentTest, StudentTest, 可以在可以在JUnitJUnit中執(zhí)行中執(zhí)行它。它。JUnitJUnit提供了兩個(gè)提供了兩個(gè)GUIGUI界面和一個(gè)文本界面。界面和一個(gè)文本界面。 點(diǎn)擊點(diǎn)擊Run- JUnit TestRun- JUnit Test按鈕可以執(zhí)行這個(gè)測試,按鈕可以執(zhí)行這個(gè)測試,會(huì)看到一根紅條從窗口的一邊快速到達(dá)另一邊。會(huì)看到一根紅條從窗口的一邊快速到達(dá)另一邊。 實(shí)際上,實(shí)際上,JUnitJUnit的
21、紅條表示發(fā)生了錯(cuò)誤。紅條下方的的紅條表示發(fā)生了錯(cuò)誤。紅條下方的摘要說明有一個(gè)失敗。摘要說明有一個(gè)失敗?!癊rros and Failures”Erros and Failures”列表解釋列表解釋了發(fā)生的錯(cuò)誤:在這個(gè)例子中,了發(fā)生的錯(cuò)誤:在這個(gè)例子中,JUnitJUnit抱怨抱怨“在在StudentTestStudentTest中沒有任何測試中沒有任何測試”。所以作為。所以作為TDDTDD程序員,首要任務(wù)是檢查程序員,首要任務(wù)是檢查JUnitJUnit中的錯(cuò)誤,然后快速更正它們。中的錯(cuò)誤,然后快速更正它們。xianzws Jan 2010 2010 XIAN EURASIA UNIVERSIT
22、Y221-4 DEMO -一個(gè)簡單的測試 四、增加一個(gè)測試四、增加一個(gè)測試 編輯編輯StudentTestStudentTest類,增加一個(gè)測試,如下:類,增加一個(gè)測試,如下: public void testCreate() xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY231-4 DEMO -一個(gè)簡單的測試 四、增加一個(gè)測試四、增加一個(gè)測試 方法方法testCreate testCreate 沒有返回任何值給沒有返回任何值給JUnitJUnit,當(dāng),當(dāng)然然JUnitJUnit也不需要這樣的信息。一個(gè)方法不返回任何也不需要這樣的信息。一個(gè)方法不返回
23、任何信息,那么它的返回值為空類型。信息,那么它的返回值為空類型。 方法名方法名testCreatetestCreate,暗示這是一個(gè)測試方法。對(duì),暗示這是一個(gè)測試方法。對(duì)JavaJava而言,而言,這不過是個(gè)方法名。但是這不過是個(gè)方法名。但是JUnitJUnit根據(jù)名稱來識(shí)別一個(gè)測試方根據(jù)名稱來識(shí)別一個(gè)測試方法,所以測試方法的命名要遵從下面的標(biāo)準(zhǔn):法,所以測試方法的命名要遵從下面的標(biāo)準(zhǔn): 方法必須聲明為方法必須聲明為publicpublic 方法的返回值必須為方法的返回值必須為voidvoid 方法的名字必須以小寫方法的名字必須以小寫testtest為前綴為前綴 方法不能接受任何參數(shù)方法不能接
24、受任何參數(shù)xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY241-4 DEMO -一個(gè)簡單的測試 五、編譯您的代碼,并且重新運(yùn)行五、編譯您的代碼,并且重新運(yùn)行JUnitJUnit。 JUnit JUnit執(zhí)行成功(顯示一根綠條),對(duì)測試類執(zhí)行成功(顯示一根綠條),對(duì)測試類StudentTestStudentTest,JUnitJUnit顯示成功地執(zhí)行了一個(gè)測試方顯示成功地執(zhí)行了一個(gè)測試方法,沒有任何錯(cuò)誤和失敗。法,沒有任何錯(cuò)誤和失敗。 請(qǐng)記住在請(qǐng)記住在testCreatetestCreate中沒有任何代碼。中沒有任何代碼。JUnitJUnit執(zhí)執(zhí)行成功
25、表明空的測試方法一定可以通過。行成功表明空的測試方法一定可以通過。xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY251-4 DEMO -一個(gè)簡單的測試 六、創(chuàng)建六、創(chuàng)建 StudentStudent對(duì)象對(duì)象 在在testCreatetestCreate方法中增加一行代碼:方法中增加一行代碼: public void testCreate() new Student(Jane Doe); 當(dāng)測試框架調(diào)用當(dāng)測試框架調(diào)用testCreatetestCreate方法時(shí),方法時(shí),JavaJava會(huì)執(zhí)行增加的這會(huì)執(zhí)行增加的這行語句。一旦行語句。一旦JavaJav
26、a執(zhí)行完這行語句,就把控制權(quán)交回給調(diào)用執(zhí)行完這行語句,就把控制權(quán)交回給調(diào)用testCreatetestCreate的測試框架。的測試框架。 testCreate testCreate方法中新增的這行語句告訴方法中新增的這行語句告訴JavaJava去創(chuàng)建去創(chuàng)建StudentStudent類的對(duì)象。類的對(duì)象。 把關(guān)鍵字把關(guān)鍵字newnew放在類名的前面,類名的后面是參數(shù)列表。放在類名的前面,類名的后面是參數(shù)列表。參數(shù)列表包含了為了實(shí)例化一個(gè)參數(shù)列表包含了為了實(shí)例化一個(gè)StudentStudent對(duì)象所要的信息。當(dāng)對(duì)象所要的信息。當(dāng)JavaJava虛擬機(jī)執(zhí)行到虛擬機(jī)執(zhí)行到newnew操作符時(shí),操作符
27、時(shí),JavaJava虛擬機(jī)分配一塊內(nèi)存來虛擬機(jī)分配一塊內(nèi)存來存儲(chǔ)這個(gè)存儲(chǔ)這個(gè)StudentStudent對(duì)象。對(duì)象。JavaJava虛擬機(jī)根據(jù)虛擬機(jī)根據(jù)StudentStudent類的定義來決類的定義來決定內(nèi)存分配的大小。定內(nèi)存分配的大小。 xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY261-4 DEMO -一個(gè)簡單的測試 七、創(chuàng)建七、創(chuàng)建 StudentStudent類類 編譯您的代碼,并且重新運(yùn)行編譯您的代碼,并且重新運(yùn)行JUnitJUnit。因?yàn)橹痪帉憽R驗(yàn)橹痪帉懥藴y試類了測試類StudentTestStudentTest,所以會(huì)發(fā)現(xiàn)有錯(cuò)誤。
28、,所以會(huì)發(fā)現(xiàn)有錯(cuò)誤。StudentTestStudentTest引用了引用了StudentStudent類,然而還沒有創(chuàng)建后者。類,然而還沒有創(chuàng)建后者。 我們期望編譯錯(cuò)誤。編譯時(shí)發(fā)現(xiàn)錯(cuò)誤可以在整個(gè)開我們期望編譯錯(cuò)誤。編譯時(shí)發(fā)現(xiàn)錯(cuò)誤可以在整個(gè)開發(fā)過程中向我們提供反饋,這是好事情。您可以把編發(fā)過程中向我們提供反饋,這是好事情。您可以把編譯錯(cuò)誤看作編寫測試后,得到的第一個(gè)反饋:您編寫代譯錯(cuò)誤看作編寫測試后,得到的第一個(gè)反饋:您編寫代碼是否用了正確的碼是否用了正確的JavaJava語法,使得測試可以被正確執(zhí)行?語法,使得測試可以被正確執(zhí)行? xianzws Jan 2010 2010 XIAN EUR
29、ASIA UNIVERSITY271-4 DEMO -一個(gè)簡單的測試 七、創(chuàng)建七、創(chuàng)建 StudentStudent類類 xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY281-4 DEMO -一個(gè)簡單的測試 七、創(chuàng)建七、創(chuàng)建 StudentStudent類類 為了消除目前的錯(cuò)誤。我們創(chuàng)建一個(gè)新類為了消除目前的錯(cuò)誤。我們創(chuàng)建一個(gè)新類Student.javaStudent.java。輸入下面的代碼:輸入下面的代碼: class Student xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY291-4 DEMO
30、-一個(gè)簡單的測試 七、創(chuàng)建構(gòu)造函數(shù)七、創(chuàng)建構(gòu)造函數(shù) 您會(huì)看到一個(gè)新的類似的報(bào)錯(cuò)。編譯器再一次沒能找到一個(gè)符號(hào),您會(huì)看到一個(gè)新的類似的報(bào)錯(cuò)。編譯器再一次沒能找到一個(gè)符號(hào),但這一次指到了關(guān)鍵字但這一次指到了關(guān)鍵字newnew。同時(shí),編譯器指出該符號(hào)尋找一個(gè)以。同時(shí),編譯器指出該符號(hào)尋找一個(gè)以StringString為參數(shù)的構(gòu)造函數(shù)。為參數(shù)的構(gòu)造函數(shù)。 現(xiàn)在構(gòu)造函數(shù)對(duì)傳入的姓名字符串不作任何事情。傳入的字符串好像現(xiàn)在構(gòu)造函數(shù)對(duì)傳入的姓名字符串不作任何事情。傳入的字符串好像消失在了大氣中。消失在了大氣中。 class Student Student(String name) 類名作為構(gòu)造函數(shù)的名字類名
31、作為構(gòu)造函數(shù)的名字 ,不能從構(gòu)不能從構(gòu)造函數(shù)返回值,甚至不能返回空值。造函數(shù)返回值,甚至不能返回空值。 xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY301-4 DEMO -一個(gè)簡單的測試 八、局部變量八、局部變量 操作符操作符newnew返回對(duì)象在內(nèi)存的地址的引用,可以通過返回對(duì)象在內(nèi)存的地址的引用,可以通過賦值操作符(賦值操作符(= =)來存儲(chǔ)如下引用。修改)來存儲(chǔ)如下引用。修改StudentTestStudentTest:創(chuàng)建了一個(gè)名字叫創(chuàng)建了一個(gè)名字叫studentstudent的的StudentStudent類型的引用。類型的引用。 pub
32、lic void testCreate() Student student = new Student(Jane Doe); xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY311-4 DEMO -一個(gè)簡單的測試 八、從方法返回一個(gè)值八、從方法返回一個(gè)值 向測試中創(chuàng)建的向測試中創(chuàng)建的StudentStudent對(duì)象請(qǐng)求學(xué)生的姓名。消息發(fā)送的對(duì)象請(qǐng)求學(xué)生的姓名。消息發(fā)送的名字是名字是getNamegetName,并且這個(gè)消息不需要任何額外信息(參數(shù))。,并且這個(gè)消息不需要任何額外信息(參數(shù))。 public void testCreate() Stude
33、nt student = new Student(Jane Doe);String studentName = student.getName(); xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY321-4 DEMO -一個(gè)簡單的測試 九、九、StudentStudent類定義中添加類定義中添加getNamegetName方法方法 編譯所有的源文件。編譯錯(cuò)誤表明編譯器無法找到編譯所有的源文件。編譯錯(cuò)誤表明編譯器無法找到StudentStudent類中的類中的getNamegetName方法。往方法。往StudentStudent類定義中添加類定義中添
34、加getNamegetName方法,方法,就可以消除這個(gè)錯(cuò)誤。就可以消除這個(gè)錯(cuò)誤。 class Student public Student(String name) public String getName() return ; return return語句返回了一個(gè)空語句返回了一個(gè)空StringString對(duì)象。對(duì)象。再次編譯,就不會(huì)有任何編譯錯(cuò)誤了??梢栽俅尉幾g,就不會(huì)有任何編譯錯(cuò)誤了。可以再次用再次用JUnitJUnit運(yùn)行這個(gè)測試。運(yùn)行這個(gè)測試。 xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY331-4 DEMO -一個(gè)簡單的測試 十、
35、斷言十、斷言 現(xiàn)在,現(xiàn)在,testCreatetestCreate有了完整的內(nèi)容:第一行測試語句用指定的姓名創(chuàng)有了完整的內(nèi)容:第一行測試語句用指定的姓名創(chuàng)建了一個(gè)建了一個(gè)StudentStudent對(duì)象,第二行語句從這個(gè)對(duì)象,第二行語句從這個(gè)StudentStudent對(duì)象請(qǐng)求獲得姓名?,F(xiàn)在對(duì)象請(qǐng)求獲得姓名?,F(xiàn)在您需要做的就是證明學(xué)生姓名和預(yù)期的一樣,也就是說學(xué)生姓名和通過構(gòu)造您需要做的就是證明學(xué)生姓名和預(yù)期的一樣,也就是說學(xué)生姓名和通過構(gòu)造函數(shù)傳遞給函數(shù)傳遞給StudentStudent對(duì)象的姓名一樣。對(duì)象的姓名一樣。 public void testCreate() Student stu
36、dent = new Student(Jane Doe);String studentName = student.getName(); assertEquals(Jane Doe, studentName); 是一個(gè)斷言,斷言的第一個(gè)參數(shù)要和第是一個(gè)斷言,斷言的第一個(gè)參數(shù)要和第二個(gè)參數(shù)相同。二個(gè)參數(shù)相同。 xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY341-4 DEMO -一個(gè)簡單的測試 十、斷言十、斷言 重新編譯并運(yùn)行測試,重新編譯并運(yùn)行測試,JUnitJUnit顯示一根紅條,表示有一個(gè)錯(cuò)誤。并且顯示一根紅條,表示有一個(gè)錯(cuò)誤。并且在第一個(gè)列表框
37、中告訴您出錯(cuò)原因:在第一個(gè)列表框中告訴您出錯(cuò)原因:Failure: testCreate(StudentTest): expected: but was:Failure: testCreate(StudentTest): expected: but was:。 xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY351-4 DEMO -一個(gè)簡單的測試 十、斷言十、斷言 assertEqualsassertEquals方法比較兩個(gè)對(duì)象,如果不相同就返回失敗。方法比較兩個(gè)對(duì)象,如果不相同就返回失敗。JUnitJUnit將第將第一個(gè)參數(shù)一個(gè)參數(shù)“Jane Doe
38、”Jane Doe”視為預(yù)期值。第二個(gè)參數(shù)視為預(yù)期值。第二個(gè)參數(shù)studentNamestudentName變量,作為實(shí)際值。變量,作為實(shí)際值。您期望實(shí)際值也是您期望實(shí)際值也是“Jane Doe”Jane Doe”,然而,然而studentNamestudentName是空字符串,因?yàn)槟鷱氖强兆址驗(yàn)槟鷱膅etNamegetName方法中返回一個(gè)空字符串。方法中返回一個(gè)空字符串。class Student public Student(String name) public String getName() return Jane Doe ; 修改代碼非常簡單,改變修改代碼非常簡單,改變g
39、etNamegetName方法,方法,返回字符串返回字符串“Jane Doe” Jane Doe” xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY361-4 DEMO -一個(gè)簡單的測試 十、實(shí)例變量十、實(shí)例變量 您已經(jīng)編寫了第一個(gè)測試和相應(yīng)的類。使用您已經(jīng)編寫了第一個(gè)測試和相應(yīng)的類。使用StudentTestStudentTest來幫助來幫助您以一種漸增的方式來構(gòu)建您以一種漸增的方式來構(gòu)建StudentStudent類。該測試也用來保證未來的任何改類。該測試也用來保證未來的任何改變不會(huì)影響已經(jīng)完成的代碼。變不會(huì)影響已經(jīng)完成的代碼。不幸的是,前面的代碼
40、并不十分完善。假如您創(chuàng)建了更多的學(xué)生對(duì)不幸的是,前面的代碼并不十分完善。假如您創(chuàng)建了更多的學(xué)生對(duì)象,所有的學(xué)生對(duì)象都會(huì)說自己名字叫象,所有的學(xué)生對(duì)象都會(huì)說自己名字叫“Jane Doe”Jane Doe”,來響應(yīng),來響應(yīng)getNamegetName消息。消息。通過解決這個(gè)問題,您將使通過解決這個(gè)問題,您將使StudentTestStudentTest類和類和StudentStudent類趨于成熟。類趨于成熟。您可以證明:每個(gè)您可以證明:每個(gè)StudentStudent對(duì)象會(huì)通過對(duì)象會(huì)通過testCreatetestCreate方法,并返回自己的名字方法,并返回自己的名字“Jane Doe”“Ja
41、ne Doe”。添加代碼創(chuàng)建第二個(gè)。添加代碼創(chuàng)建第二個(gè)studentstudent對(duì)象:對(duì)象:xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY371-4 DEMO -一個(gè)簡單的測試 十、實(shí)例變量十、實(shí)例變量 public void testCreate() Student student = new Student(Jane Doe); String studentName = student.getName(); assertEquals(Jane Doe, studentName); Student secondStudent = new Stud
42、ent(Joe Blow); String secondStudentName = secondStudent.getName(); assertEquals(Joe Blow, secondStudentName); xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY381-4 DEMO -一個(gè)簡單的測試 十、實(shí)例變量十、實(shí)例變量 很明顯,由于很明顯,由于getNamegetName方法總是返回方法總是返回“Jane Doe”Jane Doe”,所以第二個(gè),所以第二個(gè)assertEqualsassertEquals語句會(huì)使測試失敗。語句會(huì)使測試失敗。
43、問題是把學(xué)生姓名傳給問題是把學(xué)生姓名傳給StudentStudent類的構(gòu)造函數(shù),但是構(gòu)造函數(shù)對(duì)姓名類的構(gòu)造函數(shù),但是構(gòu)造函數(shù)對(duì)姓名不作任何處理。如果后面打算使用姓名,不作任何處理。如果后面打算使用姓名,StudentStudent類要負(fù)責(zé)存儲(chǔ)姓名。類要負(fù)責(zé)存儲(chǔ)姓名。 需要把學(xué)生姓名作為需要把學(xué)生姓名作為studentstudent的一個(gè)屬性,這是一個(gè)被的一個(gè)屬性,這是一個(gè)被studentstudent對(duì)象保對(duì)象保存的信息。存的信息。JavaJava中表現(xiàn)屬性最直接的方式是將其定義為成員變量,也叫實(shí)例中表現(xiàn)屬性最直接的方式是將其定義為成員變量,也叫實(shí)例變量。在表示類的開始和結(jié)束的花括號(hào)對(duì)之間來
44、定義成員變量。成員變量可變量。在表示類的開始和結(jié)束的花括號(hào)對(duì)之間來定義成員變量。成員變量可以出現(xiàn)在方法以外的類定義的任何地方。不過根據(jù)約定,您最好把成員變量以出現(xiàn)在方法以外的類定義的任何地方。不過根據(jù)約定,您最好把成員變量放在類的開始或者結(jié)束的地方。放在類的開始或者結(jié)束的地方。 就像局部變量,成員變量也有類型。這里定義了就像局部變量,成員變量也有類型。這里定義了StringString類型的成員變量類型的成員變量 myNamemyName。 xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY391-4 DEMO -一個(gè)簡單的測試 十、實(shí)例變量十、實(shí)例變量
45、 class Student class Student String myName;String myName;public Student(String name) public Student(String name) myName = name;myName = name; public String getName() public String getName() return return myName;myName; 定義定義StringString類型的成員變量類型的成員變量 myName myName 在構(gòu)造函數(shù)中,把參數(shù)在構(gòu)造函數(shù)中,把參數(shù)namename賦值賦值給給my
46、Name myName 從從getNamegetName方法中返回方法中返回myNamemyName,而不是返回字符串而不是返回字符串“Jane Doe” Jane Doe” xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY401-4 DEMO -一個(gè)簡單的測試 十、實(shí)例變量十、實(shí)例變量 為了進(jìn)一步支持?jǐn)嘌裕跍y試方法的最后增加一行代碼,從而確保您可以正確獲取第一個(gè)為了進(jìn)一步支持?jǐn)嘌?,在測試方法的最后增加一行代碼,從而確保您可以正確獲取第一個(gè)studentstudent對(duì)象的姓名。測試成功表明對(duì)象的姓名。測試成功表明studentstudent和和se
47、condStudentsecondStudent指向兩個(gè)不同的對(duì)象。指向兩個(gè)不同的對(duì)象。 public void testCreate() Student student = new Student(Jane Doe); String studentName = student.getName(); assertEquals(Jane Doe, studentName); Student secondStudent = new Student(Joe Blow); String secondStudentName = secondStudent.getName(); assertEquals(
48、Joe Blow, secondStudentName);assertEquals(Jane Doe, student.getName(); 注意,這里沒有把注意,這里沒有把student.getName()student.getName()的返的返回值賦值給一個(gè)局部變量,而是直接把回值賦值給一個(gè)局部變量,而是直接把student.getName()student.getName()作為了作為了assertEqualsassertEquals的第二的第二個(gè)參數(shù)。個(gè)參數(shù)。 xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY411-4 DEMO -一個(gè)簡單的
49、測試 總結(jié)總結(jié) 在良好設(shè)計(jì)的面向?qū)ο笤诹己迷O(shè)計(jì)的面向?qū)ο驤avaJava編碼中,大多數(shù)語句是創(chuàng)建新的編碼中,大多數(shù)語句是創(chuàng)建新的對(duì)象、發(fā)送消息給其它對(duì)象、或者將對(duì)象地址賦值(用對(duì)象、發(fā)送消息給其它對(duì)象、或者將對(duì)象地址賦值(用newnew創(chuàng)建創(chuàng)建對(duì)象,或者從消息發(fā)送返回對(duì)象)給對(duì)象引用。對(duì)象,或者從消息發(fā)送返回對(duì)象)給對(duì)象引用。xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY421-4 DEMO -一個(gè)簡單的測試 十一、重構(gòu)十一、重構(gòu) 軟件開發(fā)中的一個(gè)主要問題是代碼維護(hù)的高成本。原因之一是匆忙行動(dòng)軟件開發(fā)中的一個(gè)主要問題是代碼維護(hù)的高成本。原因之一是匆忙
50、行動(dòng)或者純粹疏忽導(dǎo)致的代碼混亂。軟件開發(fā)的主要任務(wù)是讓軟件可以工作,或者純粹疏忽導(dǎo)致的代碼混亂。軟件開發(fā)的主要任務(wù)是讓軟件可以工作,可以通過在編碼之前先編寫測試代碼來應(yīng)對(duì)這個(gè)挑戰(zhàn)。其次,您的工作要可以通過在編碼之前先編寫測試代碼來應(yīng)對(duì)這個(gè)挑戰(zhàn)。其次,您的工作要確保代碼是干凈的??梢酝ㄟ^兩種機(jī)制來實(shí)現(xiàn):確保代碼是干凈的??梢酝ㄟ^兩種機(jī)制來實(shí)現(xiàn):1 1保證在系統(tǒng)中沒有重復(fù)的代碼。保證在系統(tǒng)中沒有重復(fù)的代碼。2 2保證代碼是干凈的,并且富有表現(xiàn)力,可以清晰地體現(xiàn)程序員的意圖。保證代碼是干凈的,并且富有表現(xiàn)力,可以清晰地體現(xiàn)程序員的意圖。 貫穿敏捷貫穿敏捷JavaJava的進(jìn)程,經(jīng)常停下來反思剛剛寫下
51、的代碼。任何不符合的進(jìn)程,經(jīng)常停下來反思剛剛寫下的代碼。任何不符合這兩條簡單準(zhǔn)則的代碼都需要立刻重新處理,或者重構(gòu)。即使設(shè)計(jì)非常完這兩條簡單準(zhǔn)則的代碼都需要立刻重新處理,或者重構(gòu)。即使設(shè)計(jì)非常完美,糟糕的代碼實(shí)現(xiàn)同樣會(huì)給修改它帶來非常頭痛的體驗(yàn)。美,糟糕的代碼實(shí)現(xiàn)同樣會(huì)給修改它帶來非常頭痛的體驗(yàn)。 在您前進(jìn)的時(shí)候,越是持續(xù)雕琢改進(jìn)您的代碼,您遇到需要付出高昂代在您前進(jìn)的時(shí)候,越是持續(xù)雕琢改進(jìn)您的代碼,您遇到需要付出高昂代價(jià)才能解決代碼錯(cuò)誤的可能性就越小。原則是永遠(yuǎn)不能讓代碼比開始時(shí)的價(jià)才能解決代碼錯(cuò)誤的可能性就越小。原則是永遠(yuǎn)不能讓代碼比開始時(shí)的狀況要差。狀況要差。 xianzws Jan 2
52、010 2010 XIAN EURASIA UNIVERSITY431-4 DEMO -一個(gè)簡單的測試 十一、重構(gòu)十一、重構(gòu) 第一步要清除不必要的局部變量:第一步要清除不必要的局部變量:studentNamestudentName和和secondStudentNamesecondStudentName。它們絲毫無助于對(duì)方法的理解,它們可以被它們絲毫無助于對(duì)方法的理解,它們可以被studentstudent對(duì)象的查詢所替代,對(duì)象的查詢所替代,就像最后一個(gè)就像最后一個(gè)assertEqualsassertEquals。 當(dāng)您完成這樣的修改后,應(yīng)重新編譯和在當(dāng)您完成這樣的修改后,應(yīng)重新編譯和在JUni
53、tJUnit中運(yùn)行測試,以確保中運(yùn)行測試,以確保沒有不好的影響。您的代碼看起來像這樣:沒有不好的影響。您的代碼看起來像這樣:xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY441-4 DEMO -一個(gè)簡單的測試 十一、重構(gòu)十一、重構(gòu)-第一步第一步 public void testCreate() Student student = new Student(Jane Doe); assertEquals(Jane Doe, student.getName() ); Student secondStudent = new Student(Joe Blow)
54、; assertEquals(Joe Blow, secondStudent.getName(); xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY451-4 DEMO -一個(gè)簡單的測試 十一、重構(gòu)十一、重構(gòu) 第二步:代碼中到處嵌入字符串被視作不良的編程習(xí)慣。一個(gè)原因是,如果每第二步:代碼中到處嵌入字符串被視作不良的編程習(xí)慣。一個(gè)原因是,如果每個(gè)字符串所代表的意義不清晰的話,將很難理解這樣的代碼。個(gè)字符串所代表的意義不清晰的話,將很難理解這樣的代碼。 在這個(gè)例子中,您違背了不能有重復(fù)代碼的準(zhǔn)則。每個(gè)字符串都出現(xiàn)了兩次。在這個(gè)例子中,您違背了不能有重復(fù)代
55、碼的準(zhǔn)則。每個(gè)字符串都出現(xiàn)了兩次。如果您不得不改變其中之一的話,您將不得不改變另一個(gè)。這樣工作量就更多了。如果您不得不改變其中之一的話,您將不得不改變另一個(gè)。這樣工作量就更多了。而且意味這樣的可能性:改變了一個(gè),沒有改變另一個(gè),從而代碼中引入了缺陷。而且意味這樣的可能性:改變了一個(gè),沒有改變另一個(gè),從而代碼中引入了缺陷。 消除此類冗余的方法是用字符串常量來替代一個(gè)字符串。消除此類冗余的方法是用字符串常量來替代一個(gè)字符串。 final String firstStudentName = Jane Doe; final String firstStudentName = Jane Doe; 這條語
56、句創(chuàng)建了這條語句創(chuàng)建了StringString類型類型firstStudentNamefirstStudentName,并賦給其初始值,并賦給其初始值“Jane Doe”Jane Doe”。語句開頭的關(guān)鍵字語句開頭的關(guān)鍵字finalfinal,表明這個(gè)字符串引用是不可修改的,其它對(duì)象不可賦值給這,表明這個(gè)字符串引用是不可修改的,其它對(duì)象不可賦值給這個(gè)引用。您從來沒有被要求指定個(gè)引用。您從來沒有被要求指定finalfinal,但這被認(rèn)為是一種好的形式,可以幫助記住,但這被認(rèn)為是一種好的形式,可以幫助記住firstStudentNamefirstStudentName將像常量一樣去工作。將像常量一
57、樣去工作。 xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY461-4 DEMO -一個(gè)簡單的測試 十一、重構(gòu)十一、重構(gòu)-第二步第二步 public void testCreate() final String firstStudentName = Jane Doe; Student firstStudent = new Student(firstStudentName); assertEquals(firstStudentName, firstStudent.getName(); final String secondStudentName = Jo
58、e Blow; Student secondStudent = new Student(secondStudentName); assertEquals(secondStudentName, secondStudent.getName(); xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY471-4 DEMO -一個(gè)簡單的測試 十一、重構(gòu)十一、重構(gòu) 您的開發(fā)循環(huán)是:您的開發(fā)循環(huán)是: 編寫一個(gè)小的測試,來斷言某些功能正確與否。編寫一個(gè)小的測試,來斷言某些功能正確與否。 運(yùn)行測試,如果結(jié)果是失敗。運(yùn)行測試,如果結(jié)果是失敗。 編寫代碼,使測試通過。編寫代碼,
59、使測試通過。 重構(gòu)測試和代碼,清除重復(fù)的概念,確保代碼富于表現(xiàn)力。重構(gòu)測試和代碼,清除重復(fù)的概念,確保代碼富于表現(xiàn)力。這樣的循環(huán),會(huì)很快成為一種根深蒂固、自然的開發(fā)流程。這樣的循環(huán),會(huì)很快成為一種根深蒂固、自然的開發(fā)流程。xianzws Jan 2010 2010 XIAN EURASIA UNIVERSITY481-4 DEMO -一個(gè)簡單的測試 十二、十二、thisthis 審視審視StudentStudent類的代碼,看看是否有可以改進(jìn)的地方。類的代碼,看看是否有可以改進(jìn)的地方。 代碼看起來干凈,但是成員變量代碼看起來干凈,但是成員變量myNamemyName的命名過于學(xué)生氣。用一個(gè)更好的名字的命名過于學(xué)生氣。用一個(gè)更好的名字來體現(xiàn)您的專業(yè)素養(yǎng)。第一個(gè)想法可能是把成員變量命名為來體現(xiàn)您的專業(yè)素養(yǎng)。第一個(gè)想法可能是把成員變量命名為studentNamestudentName。但是,。但是,這樣將導(dǎo)致命名重復(fù),因?yàn)樵摮蓡T變量定義在這樣將導(dǎo)致命名重復(fù),因?yàn)樵摮蓡T變量定義在StudentStudent類中,所以很清楚這個(gè)成員類中,所以很清楚這個(gè)成員變量表示的就是變量表示的就是studentstudent的姓名。的姓名。 而且,您還需要重新命名針對(duì)這個(gè)成員變量的而且,您還需要重新命名針對(duì)這個(gè)成
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《課題導(dǎo)線截面及高低壓電囂選擇》課件
- 2025年鄭州貨運(yùn)從業(yè)資格試題題庫答案
- 微課教學(xué)的應(yīng)用思路探討研究論文
- 綠色手繪風(fēng)年中總結(jié)主題
- 咨詢能力述職報(bào)告模板
- 小學(xué)數(shù)學(xué)興趣與思維的關(guān)聯(lián)
- 審計(jì)學(xué)教學(xué)設(shè)計(jì)改革創(chuàng)新培養(yǎng)途徑研究論文
- 中止審理 申請(qǐng)書
- 農(nóng)村改廁申請(qǐng)書
- 三位數(shù)除以兩位數(shù)過關(guān)練習(xí)試題大全附答案
- 《水電站繼電保護(hù)》課件
- 沈陽市第一屆“舒心傳技 莘紳向陽”職業(yè)技能大賽技術(shù)工作文件-27-全媒體運(yùn)營師
- 2025年三方運(yùn)輸合作協(xié)議經(jīng)典版(三篇)
- 2025年《贏在執(zhí)行》心得體會(huì)(4篇)
- 2025年華潤燃?xì)馔顿Y中國有限公司招聘筆試參考題庫含答案解析
- 2025年多彩貴州航空有限公司招聘筆試參考題庫含答案解析
- 安全生產(chǎn)網(wǎng)格員培訓(xùn)
- 部編高教版2023·職業(yè)模塊 中職語文 2.《寧夏閩寧鎮(zhèn):昔日干沙灘今日金沙灘》 課件
- 心肺復(fù)蘇術(shù)課件2024新版
- 學(xué)校開學(xué)安全隱患自查表
- 2024新人教版初中英語單詞表匯總(七-九年級(jí))中考復(fù)習(xí)必背
評(píng)論
0/150
提交評(píng)論