




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、測試驅動的設計和開發(fā)( Test Driven Design and Development基礎篇)Charles Huang & Watson Tao With contribution by Eric Lao1 Copyright 2002 Chinaxp.s你的代碼工作嗎?“這段代碼很簡單,不可能出錯”“我試過了,它是正常工作的呀”“我用Debugger測試過了,我遍歷了所有程序分支,內存中的值都是對的”最好的方法是寫一段另外的代碼來證明它,讓電腦來告訴它是工作的。2 Copyright 2002 Chinaxp.sXP中的測試Unit TestAcceptance Test( Func
2、tional Test )RegresNightly Test Stress TestTest所有的測試都應該獨立地自動的運行3 Copyright 2002 Chinaxp.s單元測試(Unit Test)單元測試是一段能夠放在批處理中自動運行的,用來測試Classes的程序。單元測試測試一小段代碼或一個足夠小的功能。單元測試程序調用這小段代碼或功能,并驗證返回的結果是否符合預先設定的結果。每個單元測試至少應該有兩個測試例子( Test Case ):Negativeitive單元測試是工程的一個關鍵部分。4 Copyright 2002 Chinaxp.sAcceptance TestAc
3、ceptance Test are programs or scripts configured to testpackages (groups of clusters of classes) meet external requirements and achieve goals, such as performance. Theytinclude screen-driving programst test GUIs from without.Acceptance Test是對做End-To-End的測試,衡量是否符合用戶需求的指標,也就是驗收測試。5 Copyright 2002 Chin
4、axp.sRegresTest“Regrestesting is the pros of validating modified parts ofthe software and ensuringpreviously tested code.”t nerrors areroducedo一句話,Regresstion Test就是要重新測試所有的代碼和功能。RegresTest和Development Test的不同在于RegresTest需要重用已經建立的所有的測試單元(Unit Test )和功能測試套件 (Functional Test)。RegresTest的基礎是完整的自動單元測試和功
5、能測試。6 Copyright 2002 Chinaxp.sNightly TestNightly Test就是每晚自動運行所有的Unit Test和Acceptance Test。Nightly Test是XP中的Continuous Test的一個練習(Practice)。Nightly Test可以準確的反映項目開發(fā)的進度和質量。7 Copyright 2002 Chinaxp.sNightly TestNightly Test是開發(fā)中一個保證開發(fā)之質量的最有效的方法,也是衡量之質量和開發(fā)效率的最好的指標。Nightly Test就是每天工作結束,所有的代碼都Check in到Sourc
6、eControl后,自動運行所有的Unit Test和Function Test。測試的結果應該自動分發(fā)給開發(fā)和管理層。兩個指標數值:測試例子的通過率 單元測試的覆蓋率 單元測試必須是100%通過。Functional Test 應該按計劃的通過。表明有多少Class被測試過和測試的完善程度。8 Copyright 2002 Chinaxp.s測試優(yōu)先的編程在寫任何代碼之前,先寫它的Unit Test。“Never write a line of functional code without a broken test case” Kent BeckTest-Programming是一種測試
7、技術嗎?Test-Programming首先是一種分析方法。它迫使程序員仔細思考要做什么和不要做什么(而不是如何具體的實現)。特別是各種例外的情況,并用程序語言正式的寫下來。這就好像在程序員的任務和程序員之間簽訂了一個清晰的正式合同。Test-Programming是一種設計方法。Unit Test測試的事程序,而不是一個想法。程序員必須清晰的定義程序的界面才能寫出它的Unit Test。而這時程序員是不知道(也不需要知道)里面的具體邏輯是如何實現的。程序員只需要考慮Class的界面和功能(Responsibility)。啊,你在做OO設計了。Test-Programming是一種質量控制方法
8、( Quality Control )。如何控制質量呢?如何知道程序是否運行呢?我會不會漏了什么?運行一下Unit Test。Test-Programming是一種重構和優(yōu)化的方法??傁M约旱拇a可以漂亮,運行的效率高,所以會不斷地去改進。如何保證改進和優(yōu)化后的質量呢?會不會越改越還是Unit Test。糟?Test- Test-Programming不是通常意義上的測試技術,它的目的也不是僅僅用來測試你的代碼。Programming是一種面象的開發(fā)方法。9 Copyright 2002 Chinaxp.sTest-Driven Design (TDD)Test-Driven Design是
9、一種開發(fā)風格,它要求程序員做到:在寫產品代碼之前,先寫它的單元測試( Unit Tests )沒有單元測試的Class不允許作為產品代碼單元測試例子決定了如何寫產品代碼不斷地成功運行所有的單元測試例子不斷的完善單元測試例子Test-Driven Design是把需求分析,設計,質量控制量化的過程!10 Copyright 2002 Chinaxp.s為什么會出現TDD現實中的設計(Design)和測試(Testing):面對一個新的開發(fā)任務,往往第一個念頭就是如何去實現它呢?“好像是這樣做的” 感覺上差不多了。抓起任務就開始編碼,一邊寫,一邊修改和設計。哎,時間很緊。我先把任務實現了,然后再好
10、好測試。還是不工作,時間不多了。做個快速但再來重新整理這些代碼吧。的修改吧。等有空來用Debugger運行幾次代碼,走完所有的我認為可能的分支。我感覺這些代碼應該行了。提交吧。哎,我也知道該寫一些自動的單元測試來把剛才在Debugger中的測試走一遍。那是很多的活啊。這種情況要作自動測試太復雜了。還是手工作一下測試好了。11 Copyright 2002 Chinaxp.s為什么會出現TDD(Continue)程序員心中的測試:很郁悶的工作。對啊,程序員該做些新的,有創(chuàng)意的東西嘛。寫一些新的功能會更有趣些。我知道這些代碼會工作的。經驗和感覺都這樣告訴我。只要沒人亂改了。代碼,應該就沒問題。再說
11、這些邊緣情況幾乎不可能出現測試是QA的工作。時間(我要趕Deadline),不值得。自動測試12 Copyright 2002 Chinaxp.s如何面對這些現實和想法Test-Driven Design and Development真的能行?試一試!13 Copyright 2002 Chinaxp.s如何做Test Driven Design and Development再開發(fā)一個新的功能之前首先確定你要做什么(不是要如何做?。┍热缯f一個加一個用戶:的增加用戶的功能,需要又一個method來增public void addAccount( Account account )當然包括成功
12、增加一個用戶(在數據庫中一條)還包括如果已經由一個相同的用戶,應該返回一個用戶已存在的消息OK,知道這個method中的這段代碼要做什么,而且這段代碼也足夠簡單。14 Copyright 2002 Chinaxp.s如何做Test Driven Design and Development(Continue )然后為這個功能(Method)寫單元測試例子( Unit Test )單元測試例子要覆蓋這個Method的 “做什么”。所以至少有了兩個測試例子:Test Case 1: 測試成功增加一個用戶Test Case 2: 測試增加一個已存在的用戶其他邊緣情況測試:Test Case 3: 傳
13、入的Account對象為NULL15 Copyright 2002 Chinaxp.s如何做Test Driven Design and Development(Continue )寫Production代碼清楚知道這段代碼需要做什么。因為那里,清晰的表明這段代碼的Contracts。有另一段代碼擺在不用多,也不能少,只需要能實現再Unit Test中的Contracts和能夠通過它的Unit Test。16 Copyright 2002 Chinaxp.s如何做Test Driven Design and Development(Continue )運行Unit Test如果順利通過,你已經
14、很好的完成了你的任務。 如果沒通過,修補代碼直到能通過Unit Test為止。如果出現在Unit Test中沒預先設定的結果,在Unit Test中增加一個Test Case,修補代碼直到通過所有的Test Case為止。17 Copyright 2002 Chinaxp.sTDD和PSPal Software Pros的DevelopmentysisDesignCodeBuildTestTest-Driven Design and DevelopmentBuildRun TestysisDesignCode Unit TestCode18 Copyright 2002 Chinaxp.sXP
15、采用了TDDTDD是Extreme Programming中必須遵行的一個方法。TDD是XP中Pair Programming的工作模式。XP中把測試驅動的設計和開發(fā)做到極致。TDD的整個流程由兩個程序員一起執(zhí)行。XP正是因為采用了TDD才能夠做到每天的代碼都是Production Code和每個小的Release都能提供具備Production質量的代碼并投入使用。有了TD有了TD有了TD有了TD才能降低風險,去擁抱變化。才能在計劃的時間內完成計劃質量的代碼。才能減少CodeFix環(huán)節(jié),從而減少項目成本。Team才能對自己的工作充滿自信。19 Copyright 2002 Chinaxp.s
16、TDD防止Over-Engineering在開發(fā)中采用TDD,可以有效的避免過度設計和開發(fā)。如果程序員不愿為一個Method寫測試例子或者認為現在沒有必要測試改Method,那這個Method多半是現在不需要的。20 Copyright 2002 Chinaxp.sTDD,程序員和管理層對程序員來說,通過運行Unit Test和Functional Test,每天下班的時可以清楚的知道自己的代碼是work的。對管理層來說,通過Nightly Test的結果,每天一早都清楚的知道項目的質量和開發(fā)進度。21 Copyright 2002 Chinaxp.sXP中寫TestsDeveloper:Un
17、it TestAcceptance Test( Functional Test )Customer:Acceptance TestCustomer為每一個User Story寫Functional Test。但通常用戶并不具備設計和開發(fā)Functional Test的能力,需要程序員的幫助。22 Copyright 2002 Chinaxp.s什么時候寫Tests?如果你要寫一個新的功能,請先寫測試例子如果你要在沒有經過測試的代碼上寫新的功能,請先寫目前代碼的測試例子如果你要Fix一個Bug,請先為這個Bug寫一個測試例子如果你要Refactor沒有測試過的代碼,請先寫一個測試例子如果你發(fā)現一
18、個邊緣例外值,請為她寫一個測試例子23 Copyright 2002 Chinaxp.sExtreme UnitJava Class的測試Framework Java Swing app的測試FrameworkJava Server Side( EJB, Servlet )的測試Framework Html Page的測試FrameworkHtml Page的測試Framework C+測試Framework.Net app的測試FrameworkJunit JFCUnit CatusHTMitHTTPUnit CPPUnit.NetUnit24 Copyright 2002 Chinaxp.
19、sJunit( A sle)Junit是由kent Beck和Erich Gamma 編寫的一個open source的測試框架,用來編寫可重復的測試例子。中的增加用戶method測試public class Account/* Add a user account*implements Account* param Account - A account objectt contains the user info,like userName,*/password,public void addAccount( final Account account ) throws SQLExcept
20、ion,AccountAlreadyExistException25 Copyright 2002 Chinaxp.sJunit( A sle)1.為對應的Java Class建立一個TestCase。Unit Test Case應該放在和Business Class相同的Package中,但在不同的的物理位置。package.redsoft.forum.import junit.framework.TestCase; import junit.framework.TestSuite;import junit.framework.Test;public class Accountpublic
21、Account super(name);Test extends TestCase Test(String name) 26 Copyright 2002 Chinaxp.sJunit( A sle)2. Override setUp() and tearDown()如果需要,可以在setUp()中初始化需要的全局變量,資源等(比如Database Connection, File I/O或Mock Objects等)相應的,可以在tearDown()中I/O和Mock Objects等)資源(Database Connection,Filepublic class Account priva
22、teTest extends TestCase FixtureFixtureIns = newFixture();public void setUp() throws Exception FixtureIns.setUp();public void tearDown() throws Exception FixtureIns.tearDown();27 Copyright 2002 Chinaxp.sJunit( A s3.為被測試的Method寫Test Casepublic void testAddAccountNormal()le)Account= new Account();Accou
23、nt account = new Account(USER_NAME,charles,charl try.addAccount( account ););Account account_new =.findByUserName( account.getUserName() );assertEquals(Expecting charles,account.getUserName(),account_new.getUserName() ); assertEquals(Expecting charles,account.getPassword(),account_new.getPassword()
24、); assertEquals(Expectingc,account.get(),account_new.get() );.removeAccount( account.getUserName() );catch( final Exception e )e.prStackTrace();fail(Unexpected exception: + e.toString();28 Copyright 2002 Chinaxp.sJunit( A spublic void testAddAccountAlreadyExist()le)AccountAccount account = null; try
25、= null;/ Add an Account .addAccount( account ); fail(AccountAlreadyExistException expected);catch( final SQLException e )e.prStackTrace();fail(Unexpected exception: + e.toString();catch( final AccountNotFoundException notFound )notFound.prStackTrace();fail(Unexpected exception: + notFound.toString()
26、 );catch( final AccountAlreadyExistException ex )/ Pass try.removeAccount( account.getUserName() );catch( final SQLException sql )sql.prStackTrace();fail(Unexpected exception );29 Copyright 2002 Chinaxp.sJunit( A Sle)運行這個Unit Test。Junit提供兩種運行界面:Swing(junit.swingui.TestRunner)C:sandboxforumjava -clas
27、spath ./classes;./lib/junit.jar;./lib/_jdbc.jar;./lib/Tidy.jar;./lib/struts.jarjunit.swingui.TestRunner.redsoft.forum.AccountTest30 Copyright 2002 Chinaxp.sJunit( A SText界面( junit.textui.TestRunner )le)31 Copyright 2002 Chinaxp.sJunit Test SuiteTest Suite用來運行所有的Unit Tests Test Suite的數型結構:.redsoft.fo
28、rum.AllTest|.redsoft.forum.|.AllTest.redsoft.forum.AllTest.redsoft.forum.util.AllTest每個Package Level都由一個AllTest Test Suite在每個Test Suite中,加入在本package level中的所有單元測試例子( Unit Test Cases )加入子Package level中的所有AllTest Suite32 Copyright 2002 Chinaxp.sJunit Test Suitepackage.redsoft.forum.;public class AllTe
29、sts public sic void main(String args) junit.textui.TestRunner.run(suite();public sic Test suite() TestSuite suite = new TestSuite();/ 加入子package中的AllTest suitesuite.addTest(.redsoft.forum.AllTestite();/ 加入本package level中的Unit Test casesuite.addTestSuite(DataSourceTest.class);return suite;/EOC33 Copy
30、right 2002 Chinaxp.sJFC Unit一個Junit的Exten一個最簡單的S,用來測試Swing-based的Application。le:測試一個Login Screen34 Copyright 2002 Chinaxp.sJFC Unit代碼片斷:測試圖形界面JDialog dialog; JButton exitButton= ( JButton ) h代碼片斷:設置測試環(huán)境privaoginScreen loginScreen = null; private TestHelper helper = null; public LoginScreenTest( Stri
31、ng name ) super( name ); protected void setUp( ) throws Exceptionsuper.setUp( );helper = new JFCTestHelper( ); loginScreen = newLoginScreen( LoginScreenTest: +getName( ) );loginScreen.setVisible( true );ponent( ExitButton,loginScreen, 0 );assertNotNull( Could not find the Exit button, exitButton ); JButton enterButton= ( JButton ) hponent( EnterButton,loginScreen, 0 );assertNotNull( Could not find the Enter button, enterButton ); JTextField userNameField= ( JTextField ) hponent( LoginNameTextField,loginScreen, 0 );assertNotNull( Could not find
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2020-2021深圳寶安區(qū)展華實驗學校小學三年級數學下期末第一次模擬試題(含答案)
- 2020-2021北京第一零五中學小學三年級數學下期末一模試題(及答案)
- 單軌空中列車施工方案
- 2025年新高考地理全真模擬試卷 5套(含答案解析)
- 2024年河南省中考滿分作文《不畏困難勇攀高峰》
- 專題01 地球和地圖-2025年中考地理一輪復習知識清單(背誦版)
- 個人購買柴油合同范例
- 財務業(yè)務合規(guī)程序計劃
- 手工制作社團活動計劃
- 學習困難學生幫扶方案計劃
- 靜脈留置針完整版課件
- 人力資源課件 -非人力資源經理的人力資源管理
- GB/T 24475-2023電梯遠程報警系統
- 衢州市建筑工程質量通病防治措施
- 《中式面點技藝(第二版)》教案(高教版)
- 《神經梅毒》教學課件
- 六年級下冊數學同步學堂
- 【電氣專業(yè)】15D501建筑物防雷設施安裝
- 通信施工安全生產培訓(登高作業(yè)施工專題)
- 四位數乘四位數乘法題500道
- 企業(yè)生產管理-9S現場管理培訓PPT課件教材講義
評論
0/150
提交評論