測(cè)試驅(qū)動(dòng)的設(shè)計(jì)和開(kāi)發(fā)_第1頁(yè)
測(cè)試驅(qū)動(dòng)的設(shè)計(jì)和開(kāi)發(fā)_第2頁(yè)
測(cè)試驅(qū)動(dòng)的設(shè)計(jì)和開(kāi)發(fā)_第3頁(yè)
測(cè)試驅(qū)動(dòng)的設(shè)計(jì)和開(kāi)發(fā)_第4頁(yè)
測(cè)試驅(qū)動(dòng)的設(shè)計(jì)和開(kāi)發(fā)_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余35頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、測(cè)試驅(qū)動(dòng)的設(shè)計(jì)和開(kāi)發(fā)( Test Driven Design and Development基礎(chǔ)篇)Charles Huang & Watson Tao With contribution by Eric Lao1 Copyright 2002 Chinaxp.s你的代碼工作嗎?“這段代碼很簡(jiǎn)單,不可能出錯(cuò)”“我試過(guò)了,它是正常工作的呀”“我用Debugger測(cè)試過(guò)了,我遍歷了所有程序分支,內(nèi)存中的值都是對(duì)的”最好的方法是寫(xiě)一段另外的代碼來(lái)證明它,讓電腦來(lái)告訴它是工作的。2 Copyright 2002 Chinaxp.sXP中的測(cè)試Unit TestAcceptance Test( Func

2、tional Test )RegresNightly Test Stress TestTest所有的測(cè)試都應(yīng)該獨(dú)立地自動(dòng)的運(yùn)行3 Copyright 2002 Chinaxp.s單元測(cè)試(Unit Test)單元測(cè)試是一段能夠放在批處理中自動(dòng)運(yùn)行的,用來(lái)測(cè)試Classes的程序。單元測(cè)試測(cè)試一小段代碼或一個(gè)足夠小的功能。單元測(cè)試程序調(diào)用這小段代碼或功能,并驗(yàn)證返回的結(jié)果是否符合預(yù)先設(shè)定的結(jié)果。每個(gè)單元測(cè)試至少應(yīng)該有兩個(gè)測(cè)試?yán)? Test Case ):Negativeitive單元測(cè)試是工程的一個(gè)關(guān)鍵部分。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是對(duì)做End-To-End的測(cè)試,衡量是否符合用戶需求的指標(biāo),也就是驗(yàn)收測(cè)試。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就是要重新測(cè)試所有的代碼和功能。RegresTest和Development Test的不同在于RegresTest需要重用已經(jīng)建立的所有的測(cè)試單元(Unit Test )和功能測(cè)試套件 (Functional Test)。RegresTest的基礎(chǔ)是完整的自動(dòng)單元測(cè)試和功

5、能測(cè)試。6 Copyright 2002 Chinaxp.sNightly TestNightly Test就是每晚自動(dòng)運(yùn)行所有的Unit Test和Acceptance Test。Nightly Test是XP中的Continuous Test的一個(gè)練習(xí)(Practice)。Nightly Test可以準(zhǔn)確的反映項(xiàng)目開(kāi)發(fā)的進(jìn)度和質(zhì)量。7 Copyright 2002 Chinaxp.sNightly TestNightly Test是開(kāi)發(fā)中一個(gè)保證開(kāi)發(fā)之質(zhì)量的最有效的方法,也是衡量之質(zhì)量和開(kāi)發(fā)效率的最好的指標(biāo)。Nightly Test就是每天工作結(jié)束,所有的代碼都Check in到Sourc

6、eControl后,自動(dòng)運(yùn)行所有的Unit Test和Function Test。測(cè)試的結(jié)果應(yīng)該自動(dòng)分發(fā)給開(kāi)發(fā)和管理層。兩個(gè)指標(biāo)數(shù)值:測(cè)試?yán)拥耐ㄟ^(guò)率 單元測(cè)試的覆蓋率 單元測(cè)試必須是100%通過(guò)。Functional Test 應(yīng)該按計(jì)劃的通過(guò)。表明有多少Class被測(cè)試過(guò)和測(cè)試的完善程度。8 Copyright 2002 Chinaxp.s測(cè)試優(yōu)先的編程在寫(xiě)任何代碼之前,先寫(xiě)它的Unit Test?!癗ever write a line of functional code without a broken test case” Kent BeckTest-Programming是一種測(cè)試

7、技術(shù)嗎?Test-Programming首先是一種分析方法。它迫使程序員仔細(xì)思考要做什么和不要做什么(而不是如何具體的實(shí)現(xiàn))。特別是各種例外的情況,并用程序語(yǔ)言正式的寫(xiě)下來(lái)。這就好像在程序員的任務(wù)和程序員之間簽訂了一個(gè)清晰的正式合同。Test-Programming是一種設(shè)計(jì)方法。Unit Test測(cè)試的事程序,而不是一個(gè)想法。程序員必須清晰的定義程序的界面才能寫(xiě)出它的Unit Test。而這時(shí)程序員是不知道(也不需要知道)里面的具體邏輯是如何實(shí)現(xiàn)的。程序員只需要考慮Class的界面和功能(Responsibility)。啊,你在做OO設(shè)計(jì)了。Test-Programming是一種質(zhì)量控制方法

8、( Quality Control )。如何控制質(zhì)量呢?如何知道程序是否運(yùn)行呢?我會(huì)不會(huì)漏了什么?運(yùn)行一下Unit Test。Test-Programming是一種重構(gòu)和優(yōu)化的方法。總希望自己的代碼可以漂亮,運(yùn)行的效率高,所以會(huì)不斷地去改進(jìn)。如何保證改進(jìn)和優(yōu)化后的質(zhì)量呢?會(huì)不會(huì)越改越還是Unit Test。糟?Test- Test-Programming不是通常意義上的測(cè)試技術(shù),它的目的也不是僅僅用來(lái)測(cè)試你的代碼。Programming是一種面象的開(kāi)發(fā)方法。9 Copyright 2002 Chinaxp.sTest-Driven Design (TDD)Test-Driven Design是

9、一種開(kāi)發(fā)風(fēng)格,它要求程序員做到:在寫(xiě)產(chǎn)品代碼之前,先寫(xiě)它的單元測(cè)試( Unit Tests )沒(méi)有單元測(cè)試的Class不允許作為產(chǎn)品代碼單元測(cè)試?yán)記Q定了如何寫(xiě)產(chǎn)品代碼不斷地成功運(yùn)行所有的單元測(cè)試?yán)硬粩嗟耐晟茊卧獪y(cè)試?yán)覶est-Driven Design是把需求分析,設(shè)計(jì),質(zhì)量控制量化的過(guò)程!10 Copyright 2002 Chinaxp.s為什么會(huì)出現(xiàn)TDD現(xiàn)實(shí)中的設(shè)計(jì)(Design)和測(cè)試(Testing):面對(duì)一個(gè)新的開(kāi)發(fā)任務(wù),往往第一個(gè)念頭就是如何去實(shí)現(xiàn)它呢?“好像是這樣做的” 感覺(jué)上差不多了。抓起任務(wù)就開(kāi)始編碼,一邊寫(xiě),一邊修改和設(shè)計(jì)。哎,時(shí)間很緊。我先把任務(wù)實(shí)現(xiàn)了,然后再好

10、好測(cè)試。還是不工作,時(shí)間不多了。做個(gè)快速但再來(lái)重新整理這些代碼吧。的修改吧。等有空來(lái)用Debugger運(yùn)行幾次代碼,走完所有的我認(rèn)為可能的分支。我感覺(jué)這些代碼應(yīng)該行了。提交吧。哎,我也知道該寫(xiě)一些自動(dòng)的單元測(cè)試來(lái)把剛才在Debugger中的測(cè)試走一遍。那是很多的活啊。這種情況要作自動(dòng)測(cè)試太復(fù)雜了。還是手工作一下測(cè)試好了。11 Copyright 2002 Chinaxp.s為什么會(huì)出現(xiàn)TDD(Continue)程序員心中的測(cè)試:很郁悶的工作。對(duì)啊,程序員該做些新的,有創(chuàng)意的東西嘛。寫(xiě)一些新的功能會(huì)更有趣些。我知道這些代碼會(huì)工作的。經(jīng)驗(yàn)和感覺(jué)都這樣告訴我。只要沒(méi)人亂改了。代碼,應(yīng)該就沒(méi)問(wèn)題。再說(shuō)

11、這些邊緣情況幾乎不可能出現(xiàn)測(cè)試是QA的工作。時(shí)間(我要趕Deadline),不值得。自動(dòng)測(cè)試12 Copyright 2002 Chinaxp.s如何面對(duì)這些現(xiàn)實(shí)和想法Test-Driven Design and Development真的能行?試一試!13 Copyright 2002 Chinaxp.s如何做Test Driven Design and Development再開(kāi)發(fā)一個(gè)新的功能之前首先確定你要做什么(不是要如何做!)比如說(shuō)一個(gè)加一個(gè)用戶:的增加用戶的功能,需要又一個(gè)method來(lái)增public void addAccount( Account account )當(dāng)然包括成功

12、增加一個(gè)用戶(在數(shù)據(jù)庫(kù)中一條)還包括如果已經(jīng)由一個(gè)相同的用戶,應(yīng)該返回一個(gè)用戶已存在的消息OK,知道這個(gè)method中的這段代碼要做什么,而且這段代碼也足夠簡(jiǎn)單。14 Copyright 2002 Chinaxp.s如何做Test Driven Design and Development(Continue )然后為這個(gè)功能(Method)寫(xiě)單元測(cè)試?yán)? Unit Test )單元測(cè)試?yán)右采w這個(gè)Method的 “做什么”。所以至少有了兩個(gè)測(cè)試?yán)?Test Case 1: 測(cè)試成功增加一個(gè)用戶Test Case 2: 測(cè)試增加一個(gè)已存在的用戶其他邊緣情況測(cè)試:Test Case 3: 傳

13、入的Account對(duì)象為NULL15 Copyright 2002 Chinaxp.s如何做Test Driven Design and Development(Continue )寫(xiě)Production代碼清楚知道這段代碼需要做什么。因?yàn)槟抢?,清晰的表明這段代碼的Contracts。有另一段代碼擺在不用多,也不能少,只需要能實(shí)現(xiàn)再Unit Test中的Contracts和能夠通過(guò)它的Unit Test。16 Copyright 2002 Chinaxp.s如何做Test Driven Design and Development(Continue )運(yùn)行Unit Test如果順利通過(guò),你已經(jīng)

14、很好的完成了你的任務(wù)。 如果沒(méi)通過(guò),修補(bǔ)代碼直到能通過(guò)Unit Test為止。如果出現(xiàn)在Unit Test中沒(méi)預(yù)先設(shè)定的結(jié)果,在Unit Test中增加一個(gè)Test Case,修補(bǔ)代碼直到通過(guò)所有的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中必須遵行的一個(gè)方法。TDD是XP中Pair Programming的工作模式。XP中把測(cè)試驅(qū)動(dòng)的設(shè)計(jì)和開(kāi)發(fā)做到極致。TDD的整個(gè)流程由兩個(gè)程序員一起執(zhí)行。XP正是因?yàn)椴捎昧薚DD才能夠做到每天的代碼都是Production Code和每個(gè)小的Release都能提供具備Production質(zhì)量的代碼并投入使用。有了TD有了TD有了TD有了TD才能降低風(fēng)險(xiǎn),去擁抱變化。才能在計(jì)劃的時(shí)間內(nèi)完成計(jì)劃質(zhì)量的代碼。才能減少CodeFix環(huán)節(jié),從而減少項(xiàng)目成本。Team才能對(duì)自己的工作充滿自信。19 Copyright 2002 Chinaxp.s

16、TDD防止Over-Engineering在開(kāi)發(fā)中采用TDD,可以有效的避免過(guò)度設(shè)計(jì)和開(kāi)發(fā)。如果程序員不愿為一個(gè)Method寫(xiě)測(cè)試?yán)踊蛘哒J(rèn)為現(xiàn)在沒(méi)有必要測(cè)試改Method,那這個(gè)Method多半是現(xiàn)在不需要的。20 Copyright 2002 Chinaxp.sTDD,程序員和管理層對(duì)程序員來(lái)說(shuō),通過(guò)運(yùn)行Unit Test和Functional Test,每天下班的時(shí)可以清楚的知道自己的代碼是work的。對(duì)管理層來(lái)說(shuō),通過(guò)Nightly Test的結(jié)果,每天一早都清楚的知道項(xiàng)目的質(zhì)量和開(kāi)發(fā)進(jìn)度。21 Copyright 2002 Chinaxp.sXP中寫(xiě)TestsDeveloper:Un

17、it TestAcceptance Test( Functional Test )Customer:Acceptance TestCustomer為每一個(gè)User Story寫(xiě)Functional Test。但通常用戶并不具備設(shè)計(jì)和開(kāi)發(fā)Functional Test的能力,需要程序員的幫助。22 Copyright 2002 Chinaxp.s什么時(shí)候?qū)慣ests?如果你要寫(xiě)一個(gè)新的功能,請(qǐng)先寫(xiě)測(cè)試?yán)尤绻阋跊](méi)有經(jīng)過(guò)測(cè)試的代碼上寫(xiě)新的功能,請(qǐng)先寫(xiě)目前代碼的測(cè)試?yán)尤绻阋狥ix一個(gè)Bug,請(qǐng)先為這個(gè)Bug寫(xiě)一個(gè)測(cè)試?yán)尤绻阋猂efactor沒(méi)有測(cè)試過(guò)的代碼,請(qǐng)先寫(xiě)一個(gè)測(cè)試?yán)尤绻惆l(fā)現(xiàn)一

18、個(gè)邊緣例外值,請(qǐng)為她寫(xiě)一個(gè)測(cè)試?yán)?3 Copyright 2002 Chinaxp.sExtreme UnitJava Class的測(cè)試Framework Java Swing app的測(cè)試FrameworkJava Server Side( EJB, Servlet )的測(cè)試Framework Html Page的測(cè)試FrameworkHtml Page的測(cè)試Framework C+測(cè)試Framework.Net app的測(cè)試FrameworkJunit JFCUnit CatusHTMitHTTPUnit CPPUnit.NetUnit24 Copyright 2002 Chinaxp.

19、sJunit( A sle)Junit是由kent Beck和Erich Gamma 編寫(xiě)的一個(gè)open source的測(cè)試框架,用來(lái)編寫(xiě)可重復(fù)的測(cè)試?yán)?。中的增加用戶method測(cè)試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.為對(duì)應(yīng)的Java Class建立一個(gè)TestCase。Unit Test Case應(yīng)該放在和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等)相應(yīng)的,可以在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.為被測(cè)試的Method寫(xiě)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)運(yùn)行這個(gè)Unit Test。Junit提供兩種運(yùn)行界面: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用來(lái)運(yùn)行所有的Unit Tests Test Suite的數(shù)型結(jié)構(gòu):.redsoft.fo

28、rum.AllTest|.redsoft.forum.|.AllTest.redsoft.forum.AllTest.redsoft.forum.util.AllTest每個(gè)Package Level都由一個(gè)AllTest Test Suite在每個(gè)Test Suite中,加入在本package level中的所有單元測(cè)試?yán)? 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一個(gè)Junit的Exten一個(gè)最簡(jiǎn)單的S,用來(lái)測(cè)試Swing-based的Application。le:測(cè)試一個(gè)Login Screen34 Copyright 2002 Chinaxp.sJFC Unit代碼片斷:測(cè)試圖形界面JDialog dialog; JButton exitButton= ( JButton ) h代碼片斷:設(shè)置測(cè)試環(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論