如果你才剛開(kāi)始接觸Java世界,那么要做的第一件事情是,安裝JDK——Java Development Kit(Java開(kāi)發(fā)工具包),它自帶有Java Runtime Environment(JRE)和JVM(Java運(yùn)行時(shí)環(huán)境)。它能讓你在自己的電腦上編譯、運(yùn)行、測(cè)試你的Java程序。
此外,你還需要IDE(集成開(kāi)發(fā)環(huán)境)。選擇有很多,如IntelliJ、Eclipse和NetBeans。
Java Junit測(cè)試框架
1、相關(guān)概念
? JUnit:是一個(gè)開(kāi)發(fā)源代碼的Java測(cè)試框架,用于編寫(xiě)和運(yùn)行可重復(fù)的測(cè)試。它是用于單元測(cè)試框架體系xUnit的一個(gè)實(shí)例(用于java語(yǔ)言)。主要用于白盒測(cè)試,回歸測(cè)試。
? 白盒測(cè)試:把測(cè)試對(duì)象看作一個(gè)打開(kāi)的盒子,程序內(nèi)部的邏輯結(jié)構(gòu)和其他信息對(duì)測(cè)試人
員是公開(kāi)的。
? 回歸測(cè)試:軟件或環(huán)境的修復(fù)或更正后的再測(cè)試,自動(dòng)測(cè)試工具對(duì)這類(lèi)測(cè)試尤其有用。
? 單元測(cè)試:最小粒度的測(cè)試,以測(cè)試某個(gè)功能或代碼塊。一般由程序員來(lái)做,因?yàn)樗枰纼?nèi)部程序設(shè)計(jì)和編碼的細(xì)節(jié)。
2、 單元測(cè)試
2.1、單元測(cè)試的好處
? 提高開(kāi)發(fā)速度,測(cè)試是以自動(dòng)化方式執(zhí)行的,提升了測(cè)試代碼的執(zhí)行效率。
? 提高軟件代碼質(zhì)量,它使用小版本發(fā)布至集成,便于實(shí)現(xiàn)人員除錯(cuò)。同時(shí)引入重構(gòu)概念,讓代碼更干凈和富有彈性。
? 提升系統(tǒng)的可信賴(lài)度,它是回歸測(cè)試的一種。支持修復(fù)或更正后的“再測(cè)試”,可確保代碼的正確性。
2.2、單元測(cè)試的針對(duì)對(duì)象
? 面向過(guò)程的軟件開(kāi)發(fā)針對(duì)過(guò)程。
? 面向?qū)ο蟮能浖_(kāi)發(fā)針對(duì)對(duì)象。
? 可以做類(lèi)測(cè)試,功能測(cè)試,接口測(cè)試(最常用于測(cè)試類(lèi)中的方法)。
2.3、單元測(cè)試工具和框架
目前的最流行的單元測(cè)試工具是xUnit系列框架,常用的根據(jù)語(yǔ)言不同分為JUnit(java),CppUnit(C++),DUnit (Delphi ),NUnit(.net),PhpUnit(PHP )等等。
單元測(cè)試框架的第一個(gè)和最杰出的應(yīng)用就是由Erich Gamma (《設(shè)計(jì)模式》的作者)和Kent Beck(XP(Extreme Programming)的創(chuàng)始人 )提供的開(kāi)放源代碼的JUnit。
3、Junit入門(mén)簡(jiǎn)介
3.1、JUnit的好處和JUnit測(cè)試編寫(xiě)原則
使用JUnit的好處:
? 可以使測(cè)試代碼與產(chǎn)品代碼分開(kāi)。
? 針對(duì)某一個(gè)類(lèi)的測(cè)試代碼通過(guò)較少的改動(dòng)便可以應(yīng)用于另一個(gè)類(lèi)的測(cè)試。
? 易于集成到測(cè)試人員的構(gòu)建過(guò)程中,JUnit和Ant的結(jié)合可以實(shí)施增量開(kāi)發(fā)。
? JUnit是公開(kāi)源代碼的,可以進(jìn)行二次開(kāi)發(fā)。
? 可以方便地對(duì)JUnit進(jìn)行擴(kuò)展。
JUnit測(cè)試編寫(xiě)原則:
? 簡(jiǎn)化測(cè)試的編寫(xiě),這種簡(jiǎn)化包括測(cè)試框架的學(xué)習(xí)和實(shí)際測(cè)試單元的編寫(xiě)。
? 使測(cè)試單元保持持久性。
? 可以利用既有的測(cè)試來(lái)編寫(xiě)相關(guān)的測(cè)試。
3.2、JUnit的特征
? 使用斷言方法判斷期望值和實(shí)際值差異,返回Boolean值。
? 測(cè)試驅(qū)動(dòng)設(shè)備使用共同的初始化變量或者實(shí)例。
? 測(cè)試包結(jié)構(gòu)便于組織和集成運(yùn)行。
? 支持圖型交互模式和文本交互模式。
3.3 JUnit框架組成
? 對(duì)測(cè)試目標(biāo)進(jìn)行測(cè)試的方法與過(guò)程集合,可稱(chēng)為測(cè)試用例(TestCase)。
? 測(cè)試用例的集合,可容納多個(gè)測(cè)試用例(TestCase),將其稱(chēng)作測(cè)試包(TestSuite)。
? 測(cè)試結(jié)果的描述與記錄。(TestResult) 。
? 測(cè)試過(guò)程中的事件監(jiān)聽(tīng)者(TestListener)。
? 每一個(gè)測(cè)試方法所發(fā)生的與預(yù)期不一致?tīng)顩r的描述,稱(chēng)其測(cè)試失敗元素(TestFailure)
? JUnit Framework中的出錯(cuò)異常(AssertionFailedError)。
JUnit框架是一個(gè)典型的Composite模式:TestSuite可以容納任何派生自Test的對(duì)象;當(dāng)調(diào)用TestSuite對(duì)象的run()方法是,會(huì)遍歷自己容納的對(duì)象,逐個(gè)調(diào)用它們的run()方法。3.5 JUnit中常用的接口和類(lèi)
? Test接口:運(yùn)行測(cè)試和收集測(cè)試結(jié)果
Test接口使用了Composite設(shè)計(jì)模式,是單獨(dú)測(cè)試用例(TestCase),聚合測(cè)試模式(TestSuite)及測(cè)試擴(kuò)展(TestDecorator)的共同接口。 它的public int countTestCases()方法,用來(lái)統(tǒng)計(jì)測(cè)試時(shí)有多少個(gè)TestCase。另外一個(gè)方法就是public void run( TestResult ),TestResult是實(shí)例接受測(cè)試結(jié)果, run方法執(zhí)行本次測(cè)試。
? TestCase抽象類(lèi):定義測(cè)試中固定方法
TestCase是Test接口的抽象實(shí)現(xiàn),(不能被實(shí)例化,只能被繼承)其構(gòu)造函數(shù)TestCase(string name)根據(jù)輸入的測(cè)試名稱(chēng)name創(chuàng)建一個(gè)測(cè)試實(shí)例。由于每一個(gè)TestCase在創(chuàng)建時(shí)都要有一個(gè)名稱(chēng),若測(cè)試失敗了,便可識(shí)別出是哪個(gè)測(cè)試失敗。
TestCase類(lèi)中包含的setUp()、tearDown()方法。
setUp()方法集中初始化測(cè)試所需的所有變量和實(shí)例,并且在依次調(diào)用測(cè)試類(lèi)中的每個(gè)測(cè)試方法之前再次執(zhí)行setUp()方法。
tearDown()方法則是在每個(gè)測(cè)試方法之后,釋放測(cè)試程序方法中引用的變量和實(shí)例。
開(kāi)發(fā)人員編寫(xiě)測(cè)試用例時(shí),只需繼承TestCase,來(lái)完成run方法即可,然后JUnit獲得測(cè)試用例,執(zhí)行它的run方法,把測(cè)試結(jié)果記錄在TestResult之中。
? Assert靜態(tài)類(lèi):一系列斷言方法的集合
Assert包含了一組靜態(tài)的測(cè)試方法,用于期望值和實(shí)際值比對(duì)是否正確,即測(cè)試失敗,Assert類(lèi)就會(huì)拋出一AssertionFailedError異常,JUnit測(cè)試框架將這種錯(cuò)誤歸入Failes并加以記錄,同時(shí)標(biāo)志為未通過(guò)測(cè)試。如果該類(lèi)方法中指定一個(gè)String類(lèi)型的傳參則該參數(shù)將被做為AssertionFailedError異常的標(biāo)識(shí)信息,告訴測(cè)試人員改異常的詳細(xì)信息。
JUnit 提供了6大類(lèi)31組斷言方法,包括基礎(chǔ)斷言、數(shù)字?jǐn)嘌?、字符斷言、布爾斷言、?duì)象斷言。其中assertEquals(Object expcted,Object actual)內(nèi)部邏輯判斷使用equals()方法,這表明斷言?xún)蓚€(gè)實(shí)例的內(nèi)部哈希值是否相等時(shí),最好使用該方法對(duì)相應(yīng)類(lèi)實(shí)例的值進(jìn)行比較。
而assertSame(Object expected,Object actual)內(nèi)部邏輯判斷使用了Java運(yùn)算符“==”,這表明該斷言判斷兩個(gè)實(shí)例是否來(lái)自于同一個(gè)引用(Reference),最好使用該方法對(duì)不同類(lèi)的實(shí)例的值進(jìn)行比對(duì)。
asserEquals(String message,String expected,String actual)該方法對(duì)兩個(gè)字符串進(jìn)行邏輯比對(duì),如果不匹配則顯示著兩個(gè)字符串有差異的地方。
ComparisonFailure類(lèi)提供兩個(gè)字符串的比對(duì),不匹配則給出詳細(xì)的差異字符。
? TestSuite測(cè)試包類(lèi)??多個(gè)測(cè)試的組合
TestSuite類(lèi)負(fù)責(zé)組裝多個(gè)Test Cases。待測(cè)得類(lèi)中可能包括了對(duì)被測(cè)類(lèi)的多個(gè)測(cè)試,而TestSuit負(fù)責(zé)收集這些測(cè)試,使我們可以在一個(gè)測(cè)試中,完成全部的對(duì)被測(cè)類(lèi)的多個(gè)測(cè)試。TestSuite類(lèi)實(shí)現(xiàn)了Test接口,且可以包含其它的TestSuites。它可以處理加入Test時(shí)的所有拋出的異常。
TestSuite處理測(cè)試用例有6個(gè)規(guī)約(否則會(huì)被拒絕執(zhí)行測(cè)試)
2 測(cè)試用例必須是公有類(lèi)(Public)
2 用例必須繼承與TestCase類(lèi)
2 測(cè)試用例的測(cè)試方法必須是公有的( Public )
2 測(cè)試用例的測(cè)試方法必須被聲明為Void
2 測(cè)試用例中測(cè)試方法的前置名詞必須是test
2 測(cè)試用例中測(cè)試方法誤任何傳遞參數(shù)
? TestResult結(jié)果類(lèi)和其它類(lèi)與接口
TestResult結(jié)果類(lèi)集合了任意測(cè)試?yán)奂咏Y(jié)果,通過(guò)TestResult實(shí)例傳遞個(gè)每個(gè)測(cè)試的Run()方法。TestResult在執(zhí)行TestCase是如果失敗會(huì)異常拋出。
TestListener接口是個(gè)事件監(jiān)聽(tīng)規(guī)約,可供TestRunner類(lèi)使用。它通知listener的對(duì)象相關(guān)事件,方法包括測(cè)試開(kāi)始startTest(Test test),測(cè)試結(jié)束endTest(Test test),錯(cuò)誤,增加異常addError(Test test,Throwable t)和增加失敗addFailure(Test test,AssertionFailedError t)。
TestFailure失敗類(lèi)是個(gè)“失敗”狀況的收集類(lèi),解釋每次測(cè)試執(zhí)行過(guò)程中出現(xiàn)的異常情況。其toString()方法返回“失敗”狀況的簡(jiǎn)要描述
4、Eclipse中JUnit的使用
測(cè)試對(duì)于保證軟件開(kāi)發(fā)質(zhì)量有著非常重要的作用,單元測(cè)試更是必不可少,JUnit是一個(gè)非常強(qiáng)大的單元測(cè)試包,可以對(duì)一個(gè)/多個(gè)類(lèi)的單個(gè)/多個(gè)方法測(cè)試,還可以將不同的TestCase組合成TestSuit,使測(cè)試任務(wù)自動(dòng)化。
Eclipse同樣集成了JUnit,可以非常方便地編寫(xiě)TestCase。Eclipse自帶了一個(gè)JUnit的插件,不用安裝就可以在你的項(xiàng)目中開(kāi)始測(cè)試相關(guān)的類(lèi),并且可以調(diào)試你的測(cè)試用例和被測(cè)試類(lèi)。
4.1、Eclipse中JUint使用步驟
以下步驟環(huán)境為Eclipse SDK 3.2.2及JUnit3.8.1
? 新建一個(gè)測(cè)試用例或選擇已有的所想測(cè)試的JAVA文件,點(diǎn)擊“File-》New-》…”菜單項(xiàng)或右擊文件,在彈出的“New”對(duì)話(huà)框中選擇“JUnit Test Case”,就進(jìn)入“New JUnit Test Case”對(duì)話(huà)框
? 在“New JUnit TestCase”對(duì)話(huà)框填寫(xiě)相應(yīng)的欄目,主要有Name(測(cè)試用例名),SuperClass(若JUnit的版本是3.8.1,則測(cè)試的超類(lèi)一般默認(rèn)為junit.framework.TestCase; 若JUnit版本是JUnit 4.4,則默認(rèn)超類(lèi)為java.lang.Object。),Class Under Test(被測(cè)試的類(lèi)),Source Folder(測(cè)試用例保存的目錄),Package(測(cè)試用例包名),及是否自動(dòng)生成main,setUp,tearDown方法。在此一般填寫(xiě)NAME及選上復(fù)選上setUpt和teardown即可。
? 點(diǎn)擊“Next》”按鈕,則進(jìn)入Test Methods,在此你可以直接勾選你想測(cè)試的被測(cè)試類(lèi)的方法,Eclipse將自動(dòng)生成與被選方法相應(yīng)的測(cè)試方法,點(diǎn)擊“Fishish”按鈕后一個(gè)測(cè)試用例就創(chuàng)建好了。
? 編寫(xiě)完成測(cè)試用例后,點(diǎn)擊“Run”按鈕就可以看到運(yùn)行結(jié)果了。
補(bǔ)充:要使用JUnit,您必須首先將JUnit JAR保存在項(xiàng)目的Build路徑上并創(chuàng)建一個(gè)測(cè)試類(lèi)。將JUnit保存在項(xiàng)目的Build路徑上的步驟為:
右擊項(xiàng)目—》選擇菜單底部的Properties選擇Java Build Path—》選擇Libraries—》點(diǎn)擊Add Variable按鈕—》查看已有的列表中有無(wú)JUnit文件,若沒(méi)有,則點(diǎn)擊Configure Variable—》New按鈕,輸入JUNIT_LIB作為變量名稱(chēng),編輯該變量并指向解壓后的JUnit目錄中的一個(gè)名為JUnit.jar的文件—》然后在選擇剛才添加的jar文件依次點(diǎn)擊OK即可。
4.2、Eclipse中JUnit應(yīng)用示例
下面我們作一個(gè)在Eclipse中利用JUnit對(duì)HelloWorld的測(cè)試 測(cè)試方法:
? HelloWorld.sayHello()是否執(zhí)行正常,并且結(jié)果也符合要求
? HelloWorld.add()方法是否與我們預(yù)期一樣執(zhí)行
下一步,我們準(zhǔn)備對(duì)這兩個(gè)方法進(jìn)行測(cè)試,確保功能正常。選中HelloWorld.java,右鍵點(diǎn)擊,選擇New-》JUnit Test Case:
進(jìn)入下面這個(gè)頁(yè)面,在此諸多欄目已經(jīng)填好,即是這個(gè)需要測(cè)試的文件的相關(guān)信息,若是想在測(cè)試完之后即刪除測(cè)試文件,也可更改路徑。(本機(jī)在Eclipse已有的JUnit3.8.1的基礎(chǔ)上又添加了一個(gè)新版本JUnit4.4)
點(diǎn)擊Next進(jìn)入Test Methods,在此選擇所要測(cè)試的方法sayHello及add。
點(diǎn)擊Finish,最后編寫(xiě)完成測(cè)試用例代碼如下:
直接運(yùn)行Run-》Run As-》JUnit Test,就可以看到JUnit測(cè)試結(jié)果:
綠色表示測(cè)試通過(guò),只要有1個(gè)測(cè)試未通過(guò),就會(huì)顯示紅色并列出未通過(guò)測(cè)試的方法。
5、后記
從上面的來(lái)看,JUnit的使用并不很難,但關(guān)鍵就是最后一步完成測(cè)試碼,即編寫(xiě)TestCase。要編寫(xiě)一個(gè)好的TestCase卻并非易事。一個(gè)不好的TestCase往往是既浪費(fèi)了時(shí)間,也起不了實(shí)際的作用。相反,一個(gè)好的TestCase,不僅可以很好的指出代碼中存在的問(wèn)題,而且也可以作為代碼更準(zhǔn)確的文檔,同時(shí)還在持續(xù)集成的過(guò)程中起非常重要的作用。我們?cè)谧鳒y(cè)試寫(xiě)TestCase時(shí)需要注意的幾點(diǎn):
? 測(cè)試的獨(dú)立性:一次只測(cè)試一個(gè)對(duì)象,方便定位出錯(cuò)的位置。這有兩層意思:一個(gè)TestCase,只測(cè)試一個(gè)對(duì)象;一個(gè)TestMethod,只測(cè)試這個(gè)對(duì)象中的一個(gè)方法。
? 給測(cè)試方法一個(gè)合適的名字。 一般取名為原來(lái)的方法名后加一個(gè)Test。
? 在assert函數(shù)中給出失敗的原因,如:assertTrue( “… should be true”, ……),方便查錯(cuò)。在這個(gè)例子中,如果無(wú)法通過(guò)assertTrue,那么給出的消息將被顯示。在junit中每個(gè)assert函數(shù)都有第一個(gè)參數(shù)是出錯(cuò)時(shí)顯示消息的函數(shù)原型。
? 測(cè)試所有可能引起失敗的地方,如:一個(gè)類(lèi)中頻繁改動(dòng)的函數(shù)。對(duì)于那些僅僅只含有g(shù)etter/setter的類(lèi),如果是由IDE(如Eclipse)產(chǎn)生的,則可不測(cè);如果是人工寫(xiě),那么最好測(cè)試一下。
? 在setUp和tearDown中的代碼不應(yīng)該是與測(cè)試方法相關(guān)的,而應(yīng)該是全局相關(guān)的。如針對(duì)與測(cè)試方法A和B,在setUp和tearDown中的代碼應(yīng)該是A和B都需要的代碼。
? 測(cè)試代碼的組織:相同的包,不同的目錄。這樣,測(cè)試代碼可以訪問(wèn)被測(cè)試類(lèi)的protected變量/方法,方便測(cè)試代碼的編寫(xiě)。放在不同的目錄,則方便了測(cè)試代碼的管理以及代碼的打包和發(fā)布。
闡述JUnit的測(cè)試流程架構(gòu)。我們將從不同的角度來(lái)詳細(xì)分析這個(gè)圖。
圖 測(cè)試序列圖
TestNG和JUnit是針對(duì)Java語(yǔ)言的兩個(gè)比較常用的測(cè)試框架。JUnit出現(xiàn)的比較早,但是早期的JUnit 3對(duì)測(cè)試代碼有非常多的限制,使用起來(lái)很不方便,后來(lái)的JUnit 4得到很大的改進(jìn)。TestNG的出現(xiàn)介于JUnit 3和JUnit 4,但是TestNG在很多方面還要優(yōu)于JUnit 4。下面從整體上對(duì)TestNG和JUnit 4進(jìn)行比較全面的比較?! estNG與JUnit的相同點(diǎn):1. 使用annotation,且大部分annotation相同。2. 都可以進(jìn)行單元測(cè)試(Unit test)。3. 都是針對(duì)Java測(cè)試的工具。 TestNG與JUnit的不同點(diǎn):1. JUnit只能進(jìn)行單元測(cè)試,TestNG可以進(jìn)行單元測(cè)試(unit test),功能測(cè)試(function test),端到端測(cè)試(e2e test),集成測(cè)試(Integration test)等。2. TestNG需要一個(gè)額外的xml配置文件,配置測(cè)試的class、method甚至package。3. TestNG的運(yùn)行方式更加靈活:命令行、ant和IDE,JUnit只能使用IDE。4. TestNG的annotation更加豐富,比如@ExpectedExceptions、@DataProvider等。5. 測(cè)試套件運(yùn)行失敗,JUnit 4會(huì)重新運(yùn)行整個(gè)測(cè)試套件。TestNG運(yùn)行失敗時(shí),會(huì)創(chuàng)建一個(gè)XML文件說(shuō)明失敗的測(cè)試,利用這個(gè)文件執(zhí)行程序,就不會(huì)重復(fù)運(yùn)行已經(jīng)成功的測(cè)試。 TestNG比JUnit 4靈活性的體現(xiàn):1. JUnit 4中必須把@BeforeClass修飾的方法聲明為public static,這就限制了該方法中使用的變量必須是static。而TestNG中@BeforeClass修飾的方法可以跟普通函數(shù)完全一樣。2. JUnit 4測(cè)試的依賴(lài)性非常強(qiáng),測(cè)試用例間有嚴(yán)格的先后順序。前一個(gè)測(cè)試不成功,后續(xù)所有的依賴(lài)測(cè)試都會(huì)失敗。TestNG 利用@Test 的dependsOnMethods屬性來(lái)應(yīng)對(duì)測(cè)試依賴(lài)性問(wèn)題。某方法依賴(lài)的方法失敗,它將被跳過(guò),而不是標(biāo)記為失敗。3. 對(duì)于n個(gè)不同參數(shù)組合的測(cè)試,JUnit 4要寫(xiě)n個(gè)測(cè)試用例。每個(gè)測(cè)試用例完成的任務(wù)基本是相同的,只是受測(cè)方法的參數(shù)有所改變。TestNG的參數(shù)化測(cè)試只需要一個(gè)測(cè)試用例,然后把所需要的參數(shù)加到TestNG的xml配置文件中。這樣的好處是參數(shù)與測(cè)試代碼分離,非程序員也可以修改參數(shù),同時(shí)修改無(wú)需重新編譯測(cè)試代碼。4. 為了測(cè)試無(wú)法用String或原語(yǔ)值表示的復(fù)雜參數(shù)化類(lèi)型,TestNG提供的@DataProvider使它們映射到某個(gè)測(cè)試方法。5. JUnit 4的測(cè)試結(jié)果通過(guò)Green/Red bar體現(xiàn),TestNG的結(jié)果除了Green/Red bar,還有Console窗口和test-output文件夾,對(duì)測(cè)試結(jié)果的描述更加詳細(xì),方便定位錯(cuò)誤?! 『?jiǎn)單說(shuō)就是TestNG比Junit強(qiáng)大, 但是那些更強(qiáng)大的功能你全部都用不到的話(huà), 那你還是就用junit, 比較簡(jiǎn)單, 國(guó)人用的多, 出了問(wèn)題中文也比較好查。 英文還不錯(cuò)并且有想要了解除了單元測(cè)試以外的測(cè)試的話(huà), 就用TestNG吧。
詳解Java單元測(cè)試Junit框架實(shí)例
主要介紹了Java的異常測(cè)試框架JUnit使用上手指南,JUnit是Java代碼進(jìn)行單元測(cè)試中的常用工具,
問(wèn)題:
1、目前測(cè)試存在的問(wèn)題
2、Junit注意的細(xì)節(jié)
3、Junit使用規(guī)范
4、斷言
5、案例
junit(單元測(cè)試框架)
1、目前存在的問(wèn)題
1、目前的測(cè)試方法如果需要測(cè)試,都需要在main方法上調(diào)用
2、目前的結(jié)果都需要我們?nèi)斯け葘?duì)
2、Junit 注意的細(xì)節(jié)
1、如果使用junit測(cè)試一個(gè)方法的時(shí)候,在junit窗口上顯示綠色那么表示測(cè)試正確,如果顯示了紅色,則代表該方法測(cè)試出現(xiàn)了異常不通過(guò)
2、如果點(diǎn)擊方法名、類(lèi)名、包名、工程名運(yùn)行junit分別測(cè)試的是對(duì)于的方法,類(lèi)、包中的所有類(lèi)的test方法,工程中所有test的方法
3、@Test測(cè)試的方法不能是static修飾與不能帶有形參
4、如果測(cè)試一個(gè)方法的時(shí)候需要準(zhǔn)備測(cè)試的環(huán)境或者是清理測(cè)試的環(huán)境,那么可以@Before、@After、@BeforeClass、@AfterClass 這四個(gè)注釋?zhuān)珸Before、@After 是在每個(gè)測(cè)試方法測(cè)試的時(shí)候都會(huì)調(diào)用一次,@AfterClass、@BeforeClass是在所有的測(cè)試方法測(cè)試之前與之后都會(huì)調(diào)用一次,這個(gè)方法必須是靜態(tài)的
3、junit使用規(guī)范
1、一個(gè)類(lèi)如果需要測(cè)試,那么該類(lèi)就應(yīng)該對(duì)應(yīng)著一個(gè)測(cè)試類(lèi),測(cè)試類(lèi)的命名規(guī)范:被測(cè)試類(lèi)的類(lèi)名+Test
2、一個(gè)被測(cè)試的方法一般對(duì)應(yīng)一個(gè)測(cè)試的方法,測(cè)試的方法的命名規(guī)范是:test+被測(cè)試的方法的方法名
4、斷言
斷言就是不顯示結(jié)果,按照程序運(yùn)行的預(yù)期值和實(shí)際值進(jìn)行比對(duì),顯示運(yùn)行的狀態(tài)。
5Assert.assertSame(5, max); // 底層是用了 ==
Assert.assertSame(new String(“abc”), “abc”);
Assert.assertEquals(new String(“abc”), “abc”); //底層是使用Equals方法比較的
Assert.assertNull(“aa”);
Assert.assertTrue(true);
5、案例
???
28package cn.xlucas.junit;
import java.io.*;
import org.junit.*;
public class JunitDemo1 {
//準(zhǔn)備測(cè)試的環(huán)境
//@Before
@BeforeClass
public static void beforeRead(){
System.out.println(“準(zhǔn)備測(cè)試環(huán)境成功。。?!保?
}
//讀取文件數(shù)據(jù),把把文件數(shù)據(jù)都
@Test
public void readFile() throws IOException{
FileInputStream fileInputStream = newFileInputStream(“F:\\a.txt”);
int content = fileInputStream.read();
System.out.println(“內(nèi)容:”+content);
}
@Test
public void sort(){
System.out.println(“讀取文件數(shù)據(jù)排序。?!保?
}
//清理測(cè)試環(huán)境的方法
// @After
@AfterClass
public static void afterRead(){
System.out.println(“清理測(cè)試環(huán)境。?!保?
}
}
一、JUnit4是JUnit框架有史以來(lái)的最大改進(jìn),其主要目標(biāo)便是利用Java5的Annotation特性簡(jiǎn)化測(cè)試用例的編寫(xiě)。
二、先簡(jiǎn)單解釋一下什么是Annotation,這個(gè)單詞一般是翻譯成元數(shù)據(jù)。元數(shù)據(jù)是什么?元數(shù)據(jù)就是描述數(shù)據(jù)的數(shù)據(jù)。也就是說(shuō),這個(gè)東西在Java里面可以用來(lái)和public、static等關(guān)鍵字一樣來(lái)修飾類(lèi)名、方法名、變量名。修飾的作用描述這個(gè)數(shù)據(jù)是做什么用的,差不多和public描述這個(gè)數(shù)據(jù)是公有的一樣
三、對(duì)Person類(lèi)的方法進(jìn)行測(cè)試:
測(cè)試類(lèi)Person:
?。踛ava] view plain copy
package com.ren.junit;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
測(cè)試該類(lèi)的方法PersonTest:
[java] view plain copy
package com.ren.junit;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
//對(duì)Person類(lèi)進(jìn)行測(cè)試
public class PersonTest {
private Person p;
@BeforeClass
public static void beforeClass() {
System.out.println(“boforeClass”);
}
@Before
public void before() {
p = new Person(“l(fā)isi”,20);
System.out.println(“before”);
}
@Test
public void testGetName() {
System.out.println(p.getName());
}
@Test
public void testGetAge() {
System.out.println(p.getAge());
}
@After
public void after() {
System.out.println(“after”);
}
@AfterClass
public static void afterClass() {
System.out.println(“afterClass”);
}
}
輸出結(jié)果:
boforeClass
before
lisi
after
before
20
after
afterClass
以下是轉(zhuǎn)載:
我們先看一下在JUnit 3中我們是怎樣寫(xiě)一個(gè)單元測(cè)試的。比如下面一個(gè)類(lèi):
?。踛ava] view plain copy
public class AddOperation {
public int add(int x,int y){
return x+y;
}
}
我們要測(cè)試add這個(gè)方法,我們寫(xiě)單元測(cè)試得這么寫(xiě):
?。踛ava] view plain copy
import junit.framework.TestCase;
import static org.junit.Assert.*;
public class AddOperationTest extends TestCase{
public void setUp() throws Exception {
}
public void tearDown() throws Exception {
}
public void testAdd() {
System.out.println(\“add\”);
int x = 0;
int y = 0;
AddOperation instance = new AddOperation();
int expResult = 0;
int result = instance.add(x, y);
assertEquals(expResult, result);
}
}
可以看到上面的類(lèi)使用了JDK5中的靜態(tài)導(dǎo)入,這個(gè)相對(duì)來(lái)說(shuō)就很簡(jiǎn)單,只要在import關(guān)鍵字后面加上static關(guān)鍵字,就可以把后面的類(lèi)的static的變量和方法導(dǎo)入到這個(gè)類(lèi)中,調(diào)用的時(shí)候和調(diào)用自己的方法沒(méi)有任何區(qū)別。
我們可以看到上面那個(gè)單元測(cè)試有一些比較霸道的地方,表現(xiàn)在:
1.單元測(cè)試類(lèi)必須繼承自TestCase。
2.要測(cè)試的方法必須以test開(kāi)頭。
如果上面那個(gè)單元測(cè)試在JUnit 4中寫(xiě)就不會(huì)這么復(fù)雜。代碼如下:
?。踛ava] view plain copy
import junit.framework.TestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author bean
*/
public class AddOperationTest extends TestCase{
public AddOperationTest() {
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void add() {
System.out.println(\“add\”);
int x = 0;
int y = 0;
AddOperation instance = new AddOperation();
int expResult = 0;
int result = instance.add(x, y);
assertEquals(expResult, result);
}
}
我們可以看到,采用Annotation的JUnit已經(jīng)不會(huì)霸道的要求你必須繼承自TestCase了,而且測(cè)試方法也不必以test開(kāi)頭了,只要以@Test元數(shù)據(jù)來(lái)描述即可。
從上面的例子可以看到在JUnit 4中還引入了一些其他的元數(shù)據(jù),下面一一介紹:
@Before:
使用了該元數(shù)據(jù)的方法在每個(gè)測(cè)試方法執(zhí)行之前都要執(zhí)行一次。
@After:
使用了該元數(shù)據(jù)的方法在每個(gè)測(cè)試方法執(zhí)行之后要執(zhí)行一次。
注意:@Before和@After標(biāo)示的方法只能各有一個(gè)。這個(gè)相當(dāng)于取代了JUnit以前版本中的setUp和tearDown方法,當(dāng)然你還可以繼續(xù)叫這個(gè)名字,不過(guò)JUnit不會(huì)霸道的要求你這么做了。
@Test(expected=*.class)
在JUnit4.0之前,對(duì)錯(cuò)誤的測(cè)試,我們只能通過(guò)fail來(lái)產(chǎn)生一個(gè)錯(cuò)誤,并在try塊里面assertTrue(true)來(lái)測(cè)試?,F(xiàn)在,通過(guò)@Test元數(shù)據(jù)中的expected屬性。expected屬性的值是一個(gè)異常的類(lèi)型
@Test(timeout=xxx):
該元數(shù)據(jù)傳入了一個(gè)時(shí)間(毫秒)給測(cè)試方法,
如果測(cè)試方法在制定的時(shí)間之內(nèi)沒(méi)有運(yùn)行完,則測(cè)試也失敗。
@ignore:
該元數(shù)據(jù)標(biāo)記的測(cè)試方法在測(cè)試中會(huì)被忽略。當(dāng)測(cè)試的方法還沒(méi)有實(shí)現(xiàn),或者測(cè)試的方法已經(jīng)過(guò)時(shí),或者在某種條件下才能測(cè)試該方法(比如需要一個(gè)數(shù)據(jù)庫(kù)聯(lián)接,而在本地測(cè)試的時(shí)候,數(shù)據(jù)庫(kù)并沒(méi)有連接),那么使用該標(biāo)簽來(lái)標(biāo)示這個(gè)方法。同時(shí),你可以為該標(biāo)簽傳遞一個(gè)String的參數(shù),來(lái)表明為什么會(huì)忽略這個(gè)測(cè)試方法。比如:@lgnore(“該方法還沒(méi)有實(shí)現(xiàn)”),在執(zhí)行的時(shí)候,僅會(huì)報(bào)告該方法沒(méi)有實(shí)現(xiàn),而不會(huì)運(yùn)行測(cè)試方法。
評(píng)論