【前言】概念方面的東西。
單元測(cè)試(unit testing),是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證。對(duì)于單元測(cè)試中單元的含義,一般來(lái)說(shuō),要根據(jù)實(shí)際情況去判定其具體含義,如C語(yǔ)言中單元指一個(gè)函數(shù),Java里單元指一個(gè)類(lèi),圖形化的軟件中可以指一個(gè)窗口或一個(gè)菜單等??偟膩?lái)說(shuō),單元就是人為規(guī)定的最小的被測(cè)功能模塊。
寫(xiě)了個(gè)類(lèi),要給別人用,會(huì)不會(huì)有bug?怎么辦?測(cè)試一下。
用main方法測(cè)試好不好?不好!
80各類(lèi)難道需要寫(xiě)80個(gè)main方法累死你。其中修改了20各類(lèi),難道我們還得在跑一邊。
重用測(cè)試,應(yīng)付將來(lái)的實(shí)現(xiàn)的變化。
以后基于我現(xiàn)在這個(gè)類(lèi)寫(xiě)出來(lái)的其他代碼,會(huì)更加有正確性。
提高士氣,明確知道我的東西是沒(méi)問(wèn)題的。
成本:開(kāi)發(fā),測(cè)試,部署,維護(hù)。那個(gè)階段哈udeqianshi最多的-----------維護(hù)。?。。≌?0%=è降低后期的成本
說(shuō)了一句:保證方法是正確的。
很多公司都不寫(xiě)junit測(cè)試。為啥嘞,因?yàn)橹袊?guó)公司有的太簡(jiǎn)單,增刪改差。有的給政府做,無(wú)所謂。呵呵。
最終提高軟件的質(zhì)量。
引出junit。單元測(cè)試的一個(gè)工具,就是junit
前言:Eclipse是直接對(duì)junit進(jìn)行了集成的。我們可以直接用。?。」?/p>
下面是建一個(gè)junit的步驟。
1.new project
新建一個(gè)包,不是新建一個(gè)類(lèi)哦。
包名:com.bjsxt.junit4.test。我們需要專(zhuān)門(mén)見(jiàn)一個(gè)junit的的包。跟java源碼的包并列即可。如圖所示u。
2.建立類(lèi)(生成測(cè)試類(lèi))
建類(lèi)的名字。被測(cè)類(lèi)名Test。這么構(gòu)成。比如TTest。
可以選擇對(duì)那個(gè)類(lèi)進(jìn)行測(cè)試??梢赃x擇對(duì)類(lèi)的哪個(gè)方法進(jìn)行測(cè)試。
Eclipse自帶了junit包的,默認(rèn)就行。一會(huì)兒再說(shuō),如果不用自帶的jar包應(yīng)該怎么導(dǎo)入外部的包。
構(gòu)建完了。
import static org.junit.Assert.*;
發(fā)現(xiàn)有這么一句代碼。
這個(gè)靜態(tài)類(lèi),里面有很多靜態(tài)的方法,可以直接用。
jdk5出現(xiàn)的新語(yǔ)法。靜態(tài)引入。哈哈。
3.建立testcase
其實(shí)上一部已經(jīng)建立了testcase的框框吧。我們繼續(xù)完善。
剛才的狀態(tài):
按照之前的測(cè)試步驟,我們需要寫(xiě)完程序,用print打印出來(lái),看結(jié)果對(duì)不對(duì)。但是junit的assert類(lèi)給我們提供了方法。
【引言】assert:翻譯,斷言。其實(shí)就是判斷的意思。
assert有很多方法。提供給我們。
Assert.assertEquals(expected,actual);
期望值是8,實(shí)際值是z。自己進(jìn)行判斷。
keeps the bar green ,to keeps the code clean.
程序自動(dòng)判斷有什么好處呢?:
并不是真的放棄舊的assert。只是提出一種新的統(tǒng)一的assertThat。用那種都可以。后者必須用到hamcrest包。
讀junit網(wǎng)址??梢韵螺d最新想junit來(lái)使用。
讀文檔??雌饋?lái)跟jdk幫助文檔一樣。
試一下assert的其他方法:
幾乎所有的assert方法都有一個(gè)重載 的形式。也即是前面有一個(gè)字符串參數(shù)。作用是:當(dāng)斷言沒(méi)有通過(guò)的時(shí)候,會(huì)提示這個(gè)字符串。
在junit4之后,加入了assertThat方法??梢蕴娲械腶ssert方法。
使用方法:
assertThat(actual,matcher)
matcher:規(guī)則匹配器。
只用例子:
這個(gè)方法需要hamcrest這個(gè)包。需要自己下載。
將hamcrest的兩個(gè)jar包加入我們的項(xiàng)目。引入。
可能會(huì)報(bào)錯(cuò):ClassLoader的錯(cuò)誤。說(shuō)明我們引入的包有沖突(他們用到classloader用到不是同一個(gè))。之前講過(guò)類(lèi)似問(wèn)題
原因:Eclipse自帶的junit.jar與hamcrest又沖突。
解決:移除原來(lái)的junit.jar,自己import最新的junit.jar即可。
2.使用hamcrest的匹配方法(唯一優(yōu)點(diǎn))
a) 更自然
3.示例
a) assertThat( n, allOf( greaterThan(1), lessThan(15) ) );滿足左右條件 assertThat( n, anyOf( greaterThan(16), lessThan(8) ) );滿足其中一個(gè)條件
assertThat( n, anything() );
assertThat( str, is( "bjsxt" ) );
assertThat( str, not( "bjxxt" ) );
b) assertThat( str, containsString( "bjsxt" ) );
assertThat( str, endsWith("bjsxt" ) );
assertThat( str, startsWith( "bjsxt" ) );
assertThat( n, equalTo( nExpected ) );
assertThat( str, equalToIgnoringCase( "bjsxt" ) ); assertThat( str, equalToIgnoringWhiteSpace( "bjsxt" ) );
c) assertThat( d, closeTo( 3.0, 0.3 ) );
assertThat( d, greaterThan(3.0) );
assertThat( d, lessThan (10.0) );
assertThat( d, greaterThanOrEqualTo (5.0) );
assertThat( d, lessThanOrEqualTo (16.0) );
d) assertThat( map, hasEntry( "bjsxt", "bjsxt" ) );
assertThat( iterable, hasItem ( "bjsxt" ) );
assertThat( map, hasKey ( "bjsxt" ) );
assertThat( map, hasValue ( "bjsxt" ) );
2.Error是指測(cè)試程序本身出錯(cuò)(一個(gè)測(cè)試單元,出現(xiàn)error就不會(huì)再報(bào)failure了!有優(yōu)先級(jí)的。)
在junit4中,新建Junit Test類(lèi)是之前講過(guò)的方法。但是在已有的類(lèi)中添加新的測(cè)試方法,只需要寫(xiě)一個(gè)符合語(yǔ)法的方法,再在前面加上注解:@Test
a) (expected=XXException.class)期望拋出某種異常,拋出的話不影響測(cè)試是否通過(guò)。
b) (timeout=xxx)如圖:期望在一定時(shí)間內(nèi)結(jié)束本方法的測(cè)試,否則失敗。、
2.@Ignore: 被忽略的測(cè)試方法
該測(cè)試方法在本次測(cè)試中暫時(shí)不執(zhí)行。
3.@Before: 每一個(gè)測(cè)試方法之前運(yùn)行
4.@After: 每一個(gè)測(cè)試方法之后運(yùn)行
上面兩個(gè)annotation用在情況:測(cè)試方法需要打開(kāi)文件,我們就在before中打開(kāi)文件。在after中關(guān)閉文件。
5.@BeforeClass: 所有測(cè)試開(kāi)始之前運(yùn)行
6.@AfterClass: 所有測(cè)試結(jié)束之后運(yùn)行
這個(gè)是所有測(cè)試方法開(kāi)始之前使用的。
beforeClass取得比較耗時(shí)的資源。搭載比較耗時(shí)間的環(huán)境的時(shí)候。
jiazai 配置文件,什么連接數(shù)據(jù)庫(kù)的連接池各種??偛荒苊總€(gè)測(cè)試方法都執(zhí)行一遍這些操作吧,費(fèi)時(shí)也沒(méi)必要。
afterClass資源釋放掉,環(huán)境卸載
新建一個(gè)java類(lèi)。
新建一個(gè)Junit類(lèi)。
run-configruation-Test—Run
all tests
甚至有人提出來(lái),先把測(cè)試junit類(lèi)寫(xiě)出啦。TDD:Test Drive Development 測(cè)試驅(qū)動(dòng)開(kāi)發(fā)。一個(gè)新的開(kāi)發(fā)思想。
其實(shí)最開(kāi)始創(chuàng)建Junit Test類(lèi)的時(shí)候就已經(jīng)按照這個(gè)約定在創(chuàng)建了。
結(jié)構(gòu)上是:建一個(gè)包,與java源碼的包并列。
命名:類(lèi)名需要XXXTest;方法名XXXtestMethod
a) 關(guān)于包:類(lèi)放在test包中
b) 關(guān)于測(cè)試類(lèi):類(lèi)名用XXXTest結(jié)尾
c) 關(guān)于測(cè)試方法:方法用testMethod命名
除了junit測(cè)試框架之外,還有別的測(cè)試框架:比如TestNG
ant的使用場(chǎng)合:
積累業(yè)務(wù)經(jīng)驗(yàn)是關(guān)鍵啦。而不是編碼經(jīng)驗(yàn)嘍。。。
聯(lián)系客服