Junit單元測試管理_第1頁
Junit單元測試管理_第2頁
Junit單元測試管理_第3頁
Junit單元測試管理_第4頁
Junit單元測試管理_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1會計學(xué)Junit單元測試管理單元測試管理單元測試的意義單元測試的意義l基本思想: 在開發(fā)功能代碼之前,先編寫測試代碼。 在明確要開發(fā)某個功能后,首先想如何對這個功能進(jìn)行測試,并完成測試代碼的編寫,然后編寫相關(guān)的代碼滿足這些測試用例。再循環(huán)進(jìn)行添加其他功能,直到完全部功能的開發(fā)。l基本過程: 明確當(dāng)前要完成的功能; 針對此功能的測試用例編寫; 測試代碼編譯不通過; 編寫對應(yīng)的功能代碼; 測試通過; 對代碼進(jìn)行重構(gòu),并保證測試通過; 循環(huán)完成所有功能的開發(fā)。 單元測試過程Junit測試流程 4.0以上版本可以用注釋(test)的方式來進(jìn)行標(biāo)注Juint在eclipse的使用JUnit的使用Ass

2、ert 斷言 JUnit為我們提供了一些輔助函數(shù),它們用來幫助我們確定被測試的方法是否按照預(yù)期的效果正常工作,通常,把這些輔助函數(shù)稱為斷言。常用斷言assertEquals(a, b)assertFalse(a)assertTrue(a)assertNotNull(a)assertNull(a)fail(String message)JUnit 4 : /value : 接下來想要測試的變量值;matcher statement : 使用 Hamcrest 匹 配符來表達(dá)的對前面變量所期望的值的聲明,如果 value 值與 matcher statement 所表達(dá)的期望值相符,則測試成功,否

3、則測試失敗。 assertThat( value, matcher statement)JUnit的使用/ is匹配符表明如果前面待測的object等于后面給出的object,則測試通過 assertThat( testedObj, is( object) ); / containsString匹配符表明如果測試的字符串包含指定的子字符串則測試通過 assertThat( testedString, containsString( developerWorks ) );/ greaterThan匹配符表明如果所測試的數(shù)值testedNumber大于16.0則測試通過 assertThat( t

4、estedNumber, greaterThan(16.0) ); / closeTo匹配符表明如果所測試的浮點(diǎn)型數(shù)testedDouble在20.00.5范圍之內(nèi)則測試通過 assertThat( testedDouble, closeTo( 20.0, 0.5 ) );/hasItem匹配符表明被測的迭代對象含有元素element項則測試通過assertThat(iterableObject, hasItem (element);TestCase生命周期單元測試應(yīng)用 對我們比較有用的一些建議 用并行樹的方式存放測試代碼; 面向測試的設(shè)計 要如何對代碼進(jìn)行測試呢?要如何對代碼進(jìn)行測試呢? 以

5、前沒有寫過單元測試的代碼怎么辦? 對于后面新寫的代碼符合寫單元測試的條件,就應(yīng)該編寫單元測試; 老代碼如果需要重構(gòu),則可以優(yōu)先考慮添加測試代碼; 用單元測試來防止已捕捉的bug再次發(fā)生,也為借用maven等工具能進(jìn)行持續(xù)的構(gòu)建與測試。Junit測試實踐組測試TestSuitesl組測試TestSuites;l異常測試;lMock在單元測試中的應(yīng)用;lSpring對單元測試的支持。實踐-組測試TestSuitespublic class AllTests public static void main(String args) junit.textui.TestRunner.run(AllTes

6、ts.suite();public static Test suite() TestSuite suite = new TestSuite(Test for junitdemo);suite.addTestSuite(StringTest.class);suite.addTestSuite(CalucatorTest.class);return suite;實踐-Exception測試實踐-Mock Objects允許你測試依賴于其它對象的方法,但那個對象非常難實例化或是太慢如資源類的等。例1 要測試Servlet的doGet()請求:HttpRequest,HttpResponse可以使用M

7、ock;例2 要測試Service層的邏輯,但dao層要依賴數(shù)據(jù)庫或是dao層只提供一個接口沒有實現(xiàn)類;實踐-Mock:轉(zhuǎn)帳實例實踐-Mock:轉(zhuǎn)帳實例 public void testTransferOk()final Account senderAccount = new Account(1, 200);final Account beneficiaryAccount = new Account(2, 100);Mockery context = new Mockery();/使用MockAccountManagerfinal AccountManager mockAccountManag

8、er = context.mock(AccountManager.class);context.checking(new Expectations() one(mockAccountManager).findAccountForUser(1);will(returnValue(senderAccount);one(mockAccountManager).findAccountForUser(2);will(returnValue(beneficiaryAccount);one(mockAccountManager).updateAccount(senderAccount);one(mockAc

9、countManager).updateAccount(beneficiaryAccount););AccountService accountService = new AccountService();accountService.setAccountManager(mockAccountManager);/轉(zhuǎn)帳操作accountService.transfer(1, 2, 50); /驗證assertEquals(150, senderAccount.getBalance();assertEquals(150, beneficiaryAccount.getBalance();實踐-Spi

10、ng單元測試lWeb mocklJndi mockl數(shù)據(jù)庫測試實踐-Sping:webMockHttpServletRequest,MockHttpServletResponse,MockHttpSession:public void final testGettingToDetails throws ExceptionMyController myController = new MyController(); myController.setDetailsView( detailsViewName );MockHttpServletRequest request = new MockHtt

11、pServletRequest();MockHttpServletResponse response = new MockHttpServletResponse();request.setMethod(POST);request.addParameter(viewDetails, true);ModelAndView modelAndView = myController.handleRequest(request, response);assertEquals(Incorrect view name, detailsViewName,modelAndView.getViewName();實踐

12、-Sping:jndi mockprivate ClassPathXmlApplicationContext context;public void testJndi( ) throws Exception context=new ClassPathXmlApplicationContext(springFiles);SimpleNamingContextBuilder builder =SimpleNamingContextBuilder.emptyActivatedContextBuilder();DataSource ds = (DataSource) context.getBean(d

13、ataSource);builder.bind(jndi:jdbc/DataSource, ds);/ 現(xiàn)在你的數(shù)據(jù)源就是 jndi:jdbc/DataSource了實踐-Sping:數(shù)據(jù)庫測試public class MyTransactualControllerTest extends AbstractTransactionalSpringContextTests protected String getConfigLocations() return new String classpath:/test/spring-context.xml; public void testCorrec

14、tBehavior() throws Exception /運(yùn)行該事務(wù)性方法 myTransactualController.submitPayment( new Payment( 100 ) ); assertTrue( myTransactualController.isValid() ); Junit4的寫法:RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(locations = classpath:app-config.xml, classpath:mvc-config.xml) Transactional pub

15、lic class AccountServiceTest1 Test public void testGetAcccountById() Account acct = Account.getAccount(1, user01, 18, M); service.insertIfNotExist(acct); Account acct2 = service.getAccountById(1); assertEquals(acct,acct2); Junit4的新特性u兼容以往版本兼容以往版本u不用強(qiáng)制繼承不用強(qiáng)制繼承TestCase類類u使用注解使用注解(Annotation)來標(biāo)注測試來標(biāo)注測試

16、u對異常對異常(exception)測試改進(jìn)測試改進(jìn)public class Junit4Test Before public void init() throws Exception System.out.println(init();Before public void setUp() throws Exception System.out.println(“setUp()”);/兩個BeforeAfter public void destroy() throws Exception System.out.println(destroy();/增加Test表示為測試方法Test publi

17、c void replace() String result = abc.replace(a, b); assertEquals(bbc,result);Test(expected=ArithmeticException.class) public void divide() int num = 9/0; /異常測試開發(fā)規(guī)范開發(fā)規(guī)范需要單元測試的代碼需要單元測試的代碼1、邏輯復(fù)雜的功能;2、容易出錯的代碼;3、不易理解的代碼,即可能過段時間后自己也不易理解的代碼,而單元測試代碼有助于理解代碼的功能和需求;4、后期需求變更可能性相對比較大的,這樣后期需求更變修改代碼之后就不用太擔(dān)心寫的代碼對不對

18、以及是否破壞既存代碼邏輯了;5、項目團(tuán)隊根據(jù)行業(yè)慣例判斷,需要進(jìn)行單元測試的代碼。管理要求:管理要求:1、項目經(jīng)理在安排開發(fā)計劃時,對需要做單元測試的功能做出明確要求,在要求必須開展單元測試的同時預(yù)留足夠的單元測試時間;2、開發(fā)人員在開發(fā)過程中,如果發(fā)現(xiàn)功能需要做單元測試時,應(yīng)積極主動的開展單元測試工作,并告知項目經(jīng)理。監(jiān)監(jiān) 督:督:1、項目經(jīng)理有責(zé)任監(jiān)督項目組成員的單元工作是否按要求開展;2、技術(shù)經(jīng)理有責(zé)任監(jiān)督項目組是否有開展適當(dāng)?shù)膯卧獪y試工作。開發(fā)規(guī)范開發(fā)規(guī)范考考 評:評:1、單元測試工作將與季度考評中的以下考評內(nèi)容相關(guān)聯(lián): a、質(zhì)量:按照公司或部門工作規(guī)范開展工作如:管理規(guī)范、技術(shù)規(guī)范(

19、2分); b、質(zhì)量:工作成果滿足相應(yīng)的工作質(zhì)量要求如:需求、設(shè)計、代碼(3分); c、質(zhì)量:系統(tǒng)提交前有開展單元測試關(guān)鍵功能、集成測試、系統(tǒng)測試以及AB角測試(1分);2、項目經(jīng)理根據(jù)單元測試監(jiān)督結(jié)果對項目組成員進(jìn)行考評;3、技術(shù)經(jīng)理監(jiān)督各項目組的單元測試工作,主要核查項目組是否正確開展單元測試工作,并提供事實依據(jù)給部門負(fù)責(zé)人對項目經(jīng)理進(jìn)行考評。開發(fā)規(guī)范開發(fā)規(guī)范結(jié)束Q&AJunit測試流程 4.0以上版本可以用注釋(test)的方式來進(jìn)行標(biāo)注實踐-Mock Objects允許你測試依賴于其它對象的方法,但那個對象非常難實例化或是太慢如資源類的等。例1 要測試Servlet的doGet(

20、)請求:HttpRequest,HttpResponse可以使用Mock;例2 要測試Service層的邏輯,但dao層要依賴數(shù)據(jù)庫或是dao層只提供一個接口沒有實現(xiàn)類;實踐-Mock:轉(zhuǎn)帳實例實踐-Mock:轉(zhuǎn)帳實例 public void testTransferOk()final Account senderAccount = new Account(1, 200);final Account beneficiaryAccount = new Account(2, 100);Mockery context = new Mockery();/使用MockAccountManagerfina

21、l AccountManager mockAccountManager = context.mock(AccountManager.class);context.checking(new Expectations() one(mockAccountManager).findAccountForUser(1);will(returnValue(senderAccount);one(mockAccountManager).findAccountForUser(2);will(returnValue(beneficiaryAccount);one(mockAccountManager).update

22、Account(senderAccount);one(mockAccountManager).updateAccount(beneficiaryAccount););AccountService accountService = new AccountService();accountService.setAccountManager(mockAccountManager);/轉(zhuǎn)帳操作accountService.transfer(1, 2, 50); /驗證assertEquals(150, senderAccount.getBalance();assertEquals(150, beneficiaryAccount.getBalance();實踐-

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論