JUnit測(cè)試框架使用介紹_第1頁
JUnit測(cè)試框架使用介紹_第2頁
JUnit測(cè)試框架使用介紹_第3頁
JUnit測(cè)試框架使用介紹_第4頁
JUnit測(cè)試框架使用介紹_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個(gè)回歸測(cè)試框架(regression testing framework)。Junit測(cè)試是程序員測(cè)試,即白盒測(cè)試。 JUnit測(cè)試骨架使用JUnit時(shí),主要都是通過繼承TestCase類別來撰寫測(cè)試用例,使用testXXX()名稱來撰寫單元測(cè)試。用JUnit寫測(cè)試真正所需要的就三件事:1  一個(gè)import語句引入所有junit.framework.*下的類。2  一個(gè)extends語句讓你的類從TestCase繼承。3 

2、 一個(gè)調(diào)用super(string)的構(gòu)造函數(shù)。功能類MathToolpackage com.zj.c01; public class MathTool     public static int gcd(int num1, int num2)        int r = 0;       whi

3、le (num2 != 0)            r = num1 % num2;           num1 = num2;           num2 = r;       

4、60;      return num1;    測(cè)試類MathToolTestpackage com.zj.c01;import junit.framework.TestCase; public class MathToolTest extends TestCase     public MathToolTest(String name)   &

5、#160;    super(name);         public void testGcd()        assertEquals(5, MathTool.gcd(10, 5);    使用Eclipse-Run As JUnit Test在運(yùn)行TestRunner執(zhí)行測(cè)試時(shí),你會(huì)發(fā)現(xiàn)到有Failure與Error兩種測(cè)試尚未

6、通過的信息。Failure指的是預(yù)期的結(jié)果與實(shí)際運(yùn)行單元的結(jié)果不同所導(dǎo)致,例如當(dāng)使用assertEquals()或其它assertXXX()方法斷言失敗時(shí),就會(huì)回報(bào)Failure,這時(shí)候要檢查你的單元方法中的邏輯設(shè)計(jì)是否有誤。Error指的是你的程序沒有考慮到的情況,在斷言之前程序就因?yàn)槟撤N錯(cuò)誤引發(fā)例外而終止,例如在單元中存取某個(gè)數(shù)組,因?yàn)榇嫒〕鏊饕l(fā) ArrayIndexOutOfBoundsException,這會(huì)使得單元方法無法正確完成,在測(cè)試運(yùn)行到asertXXXX()前就提前結(jié)束,這時(shí)候要檢查你的單元方法中是否有未考慮到的情況而引發(fā)流程突然中斷。 JUnit

7、的各種斷言JUnit提供了一些輔助函數(shù),用于幫助你確定某個(gè)被測(cè)試函數(shù)是否工作正常。通常而言,我們把所有這些函數(shù)統(tǒng)稱為斷言。斷言是單元測(cè)試最基本的組成部分。1. assertEquals(String message, expected,actual)比較兩個(gè)基本類型或?qū)ο笫欠裣嗟龋╡xpected和actual是原始類型數(shù)值(primitive value)或者必須為實(shí)現(xiàn)比較而具有equal方法);2.assertFalse(String message,boolean condition)對(duì)布爾值求值,看它是否為“真“;3.assertTrue(String message,boolean

8、condition)對(duì)布爾值求值,看它是否為“假“;4.assertNull(String message,java.lang.Object object)檢查對(duì)象是否為“空“;5.assertNotNull(String message,java.lang.Object object)檢查對(duì)象是否不為“空”;6.assertSame(String message,expected,actual)檢查兩個(gè)對(duì)象是否為同一實(shí)例;7.assertNotSame(String message,expected,actual)檢查兩個(gè)對(duì)象是否不為同一實(shí)例;8. fail( String message

9、)使測(cè)試立即失敗,其中 message 參數(shù)使可選的。這種斷言通常被用于標(biāo)記某個(gè)不應(yīng)該到達(dá)的分支(例如,在一個(gè)預(yù)期發(fā)生的異常之后) 一個(gè)TestCase測(cè)試實(shí)例下面是一個(gè)數(shù)字功能類,它提供了求最大值函數(shù)和求最小值函數(shù):package com.zj.c01; public class NumberTool     public static int getMax(int arr)       

10、60;int max = Integer.MIN_VALUE;        if (arr.length = 0)           throw new RuntimeException("Empty list");       for (int 

11、;index = 0; index < arr.length; index+)            if (arrindex > max)              max = arrindex;           

12、;   return max;         public static int getMin(int arr)        int min = Integer.MAX_VALUE;       if (arr.length = 0)  

13、0;        throw new RuntimeException("Empty list");       for (int i = 0; i < arr.length; i+)            if (arri < min) 

14、60;            min = arri;              return min;    下面針對(duì)求最大值函數(shù)編寫測(cè)試用例:1.簡(jiǎn)單測(cè)試:7,8,9->9;2.位序測(cè)試:9,8,7 ->9;7,9,8 ->9;8,7,9 ->9;3.重復(fù)值測(cè)試:

15、9,7,9,8 ->9;4.單值測(cè)試:1->1;5.負(fù)值測(cè)試:-7,-8,-9->-7;6.空值測(cè)試:->拋出異常;測(cè)試類NumberToolTest:package com.zj.c01;import junit.framework.TestCase; public class NumberToolTest extends TestCase     public NumberToolTest(String name)   

16、0;    super(name);         public void testSimple()        assertEquals(9, NumberTool.getMax(new int 7, 8, 9 );         public void

17、0;testOrder()        assertEquals(9, NumberTool.getMax(new int 9, 8, 7 );       assertEquals(9, NumberTool.getMax(new int 7, 9, 8 );       assertEquals(9, NumberTool.getMax(new int

18、 8, 7, 9 );         public void testDups()        assertEquals(9, NumberTool.getMax(new int 9, 7, 9, 8 );         public void testOne()   &#

19、160;    assertEquals(1, NumberTool.getMax(new int 1 );         public void testNegitave()        assertEquals(-7, NumberTool.getMax(new int -7, -8, -9 );    

20、60;    public void testEmpty()        try            NumberTool.getMax(new int );           fail("Should have

21、thrown an exception");        catch (RuntimeException e)            assertTrue(true);           使用Eclipse-Run As JUnit Test JUnit和異常對(duì)于測(cè)

22、試而言,下面兩種異常是我們可能會(huì)感興趣的:1  從測(cè)試代碼拋出的可預(yù)測(cè)異常。2  由于某個(gè)模塊(或代碼)發(fā)生嚴(yán)重錯(cuò)誤,而拋出的不可預(yù)測(cè)異常。任何對(duì)assertTrue(true)的使用都應(yīng)該被翻譯為“我預(yù)期控制流程會(huì)達(dá)到這個(gè)地方”。通常而言,對(duì)于方法中每個(gè)被期望的異常,你都應(yīng)該寫一個(gè)專門的測(cè)試來確認(rèn)該方法在應(yīng)該拋出異常的時(shí)候確實(shí)會(huì)拋出異常。如上例中testEmpty()測(cè)試方法的設(shè)計(jì)。對(duì)于處于出乎意料的異常,你最好簡(jiǎn)單的改變你的測(cè)試方法的聲明讓它能拋出可能的異常。JUnit框架可以捕獲任何異常,并且把它報(bào)告為一個(gè)錯(cuò)誤,這些都不需要你的參與。 P

23、er-method的Setup和Tear-down對(duì)于重復(fù)出現(xiàn)在各個(gè)單元測(cè)試中的運(yùn)行環(huán)境,可以集中加以管理,可以在繼承TestCase之后,重新定義setUp()與tearDown()方法,將數(shù)個(gè)單元測(cè)試所需要的運(yùn)行環(huán)境在setUp()中創(chuàng)建,并在tearDown()中銷毀。JUnit的TestCase基類提供兩個(gè)方法供你改寫,分別用于環(huán)境的建立和清理:protected void setup();protected void teardown(); 測(cè)試類MathToolTest2:package com.zj.c01;import junit.framewor

24、k.TestCase; public class NumberToolTest2 extends TestCase     private int arr;     public NumberToolTest2(String name)        super(name);       

25、  protected void setUp() throws Exception        super.setUp();       arr = new int -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5 ;         protected

26、 void tearDown() throws Exception        super.tearDown();       arr = null;         public void testMax()       &#

27、160;assertEquals(5, NumberTool.getMax(arr);         public void testMin()        assertEquals(-5, NumberTool.getMin(arr);     TestSuite每一個(gè)定義好的TestCase,都使用TestRunner來運(yùn)行測(cè)試,事實(shí)上TestRunner并不

28、直接運(yùn)行TestCase上的單元方法,而是通過TestSuite ,TestSuite可以將數(shù)個(gè)TestCase組合在一起。在上面的例子中,并沒有看到任何的TestSuite,這是因?yàn)門estRunner的run()方法中會(huì)建立TestSuite:static public void run(Class testClass)     run(new TestSuite(testClass);在這個(gè)TestSuite的建構(gòu)式中,會(huì)使用反射自動(dòng)找出testXXX()方法,并加入待執(zhí)行的測(cè)試方法, T

29、estRunner的run()方法中會(huì)去執(zhí)行TestSuite上的run()方法,然后TestSuite會(huì)將之委托給TestCase上的 run()方法,而該run()方法中執(zhí)行每一個(gè)testXXX()方法。如果你只想執(zhí)行某TestCase中的部分測(cè)試函數(shù),則可自己構(gòu)建TestSuite,下面的代碼針對(duì)NumberToolTest中的兩個(gè)測(cè)試函數(shù)testSimple()和testNegitave()進(jìn)行測(cè)試。package com.zj.c02;import com.zj.c01.NumberToolTest;import junit.framework

30、.Test;import junit.framework.TestSuite; public class PartTest     public static Test suite()        TestSuite suite = new TestSuite();       suite.addTest(new Number

31、ToolTest("testSimple");       suite.addTest(new NumberToolTest("testNegitave");       return suite;    使用Eclipse-Run As JUnit Test你也可以組合多個(gè)testCase,下面的代碼將MathToolTest和NumberToolTest

32、集中到一個(gè)TestSuite中:package com.zj.c02;import com.zj.c01.MathToolTest;import com.zj.c01.NumberToolTest;import junit.framework.Test;import junit.framework.TestSuite; public class CompositeTest     public static Test suite()   

33、;     TestSuite suite = new TestSuite("Running all tests.");       suite.addTestSuite(MathToolTest.class);       suite.addTestSuite(NumberToolTest.class);     &

34、#160; return suite;    使用Eclipse-Run As JUnit Test Per-suite Setup和Tear-down一般而言,你只須針對(duì)每個(gè)方法設(shè)置運(yùn)行環(huán)境;但是在某些情況下,你須為整個(gè)test suite設(shè)置一些環(huán)境,以及在test suite中的所有方法都執(zhí)行完成后做一些清理工作。要達(dá)到這種效果,你需要per-suite setup和per-suite teardown。Per-suite的setup要復(fù)雜一些。你需要提供所需測(cè)試的一個(gè)suite(無論通過什么樣的方式)并且把它包裝進(jìn)一

35、個(gè)TestSetup對(duì)象。注意你可以在同一個(gè)類中同時(shí)使用per-sutie和per-test的setup()和teardown。package com.zj.c02;import junit.extensions.TestSetup;import junit.framework.Test;import junit.framework.TestSuite;import com.zj.c01.MathToolTest;import com.zj.c01.NumberToolTest; public class WrapperCompositeTest     public static Test suite()        TestSuite suite = new TestSuite("Running all tests with env.");       

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論