• 簡單的Junit4應用

    1
    Java C/C++ Jar list 14166 次瀏覽

    如果寫了一個類,想測試一下有沒有bug,可以用main方法去測試。但是main方法缺點很多,不是理想的做單元測試的途徑——方法不能一起運行,且測試結果多數要通過程序員自己觀察才可以判定。

        為了克服這些缺點,使單元測試更加簡單方便,Junit是一個很好的選擇。接下來,將會講解下Junit4的使用。

        要使用Junit4非常的簡單,準備工作也非常方便。以Junit4.8.1為例,只需要添加junit-4.8.1.jar就可以使用junit的所有傳統方法。

     

    以下是一個小例子:

    待測試類T

    package com.ellis.junit4;  
      
    public class T {  
          
        public int add(int x, int y){  
            return x+y;  
        }  
          
    }
    junit4測試類TTest:
    package com.ellis.junit4.test;  
      
    import static org.junit.Assert.*;  
      
    import org.junit.Test;  
      
    import com.ellis.junit4.T;  
      
    public class TTest {  
      
        @Test  
        public void testAdd() {  
            int z = new T().add(5, 3);  
                      assertEquals("z != 8", z, 8);   
             }  
      
    }

    TTest.class里的testAdd方法用來測試T.class里的add方法。@Test代表這個方法為測試方法。如果有多個方法用 @Test注釋的話,那么多個方法中的每個方法都可以單獨運行(運行一個方法的時候,不運行其它方法),這是用main方法測試所無法比擬的。運行單個 @Test方法的操作是:選中該方法名,然后點run。

        TTest.class里的assertEquals()就是Junit的斷言方法之一,它的作用是判斷z的值是否為8,如果z不等于8的話junit將 會報錯,"z !=8"是自己寫的用于與該錯誤提示一起提示出來字符串,使錯誤原因更加直觀。assert*()方法有很多,它們都是org.junit.Assert 的靜態方法,若要像TTest.class里那樣使用,需要進行靜態引入:import static org.junit.Assert.*。

        傳統的,也就是Junit3及其之前的assert*()方法有很多,在這里就不一一介紹。這里主要介紹一下Junit4里新增加的hamcrest斷言assertThat()。

        若要使用hamcrest的斷言,還必須添加hamcrest-core-1.2.jar和hamcrest-library-1.2.jar這個兩個jar包。

        assertThat()有什么作用?使用assertThat()有什么好處呢?assertThat()比起傳統的assert*()斷言,在功能上 并沒有多大的不同,它最主要的優點是在于——1.它的語法更接近于口語,從而使代碼寫和看起來更加直觀;2.一個assertThat()可以實現絕大部 分常用的傳統assert*()方法的功能。下面以用assertThat()代替assertEquals()為例,講解一下 assertThat()。

     

    用assertThat()的TTest:

    package com.ellis.junit4.test;  
      
    import static org.junit.Assert.*;  
    import static org.hamcrest.Matchers.*;  
      
    import org.junit.Test;  
      
    import com.ellis.junit4.T;  
      
    public class TTest {  
      
        @Test  
        public void testAdd() {  
            int z = new T().add(5, 3);  
            assertThat(z, is(8));  
            assertThat("wrong", z, allOf(greaterThan(5), lessThan(10)));  
      
            assertEquals("z != 8", z, 8);  
        }  
      
    } 

    如上面代碼所示assertThat(z, is(8))的作用是判斷z的值是否為8(z is 8 or not ?),它的作用和assertEquals(z, 8)完全一樣。is()其實是org.hamcrest.Matchers的靜態方法,若要如此使用必須先進行靜態引入import static org.hamcrest.Matchers.*。

        上面代碼中的assertThat(z, allof(greaterThan(5), lessThan(10)))的作用是判斷z是否都allof()里面的條件,allof()里的條件是大于5(greaterThan(5))、小于 3(lessThan(10))。

     

    assertThat()常用的方法還有:

    a)

    assertThat( n, allOf( greaterThan(1), lessThan(15) ) ); n滿足allof()里的所有條件
    assertThat( n, anyOf( greaterThan(16), lessThan(8) ) );n滿足anyOf()里的任意條件
    assertThat( n, anything() );  n是任意值(任意值都可以通過測試)
    assertThat( str, is( "ellis" ) ); str是is()里的內容
    assertThat( str, not( "ellis" ) ); str不是not()里的內容

    b)

    assertThat( str, containsString( "ellis" ) ); str包含containsString()里的內容
    assertThat( str, endsWith("ellis" ) );  str以endsWith()里的內容結尾
    assertThat( str, startsWith( "ellis" ) ); str以startsWith()里的內容開始
    assertThat( n, equalTo( nExpected ) ); n與equalTo()里的內容相等
    assertThat( str, equalToIgnoringCase( "ellis" ) ); str忽略大小寫后與equalToIgnoringCase()里的內容相等
    assertThat( str, equalToIgnoringWhiteSpace( "ellis" ) );str忽略空格后與equalToIgnoringWhiteSpace()里的內容相等

    c)

    assertThat( d, closeTo( 3.0, 0.3 ) );d接近于3.0,誤差不超過0.3
    assertThat( d, greaterThan(3.0) );d大于3.0
    assertThat( d, lessThan (10.0) );d小于10.0
    assertThat( d, greaterThanOrEqualTo (5.0) );d大于或等于5.0
    assertThat( d, lessThanOrEqualTo (16.0) );d小于或等于16.0

    d)

    assertThat( map, hasEntry( "ellis", "ellis" ) );map里有一個名為ellis的key,其值為ellis

    assertThat( iterable, hasItem ( "ellis" ) );iterable(例如List)里包含值ellis
    assertThat( map, hasKey ( "ellis" ) );map有一個名為ellis的key
    assertThat( map, hasValue ( "ellis" ) );map里包含一個值ellis

     

    另外,還有如下這些常用注解,使測試起來更加方便:

    1.         @Ignore: 被忽略的測試方法

    2.         @Before: 每一個測試方法之前運行

    3.         @After: 每一個測試方法之后運行

    4.         @BeforeClass: 所有測試開始之前運行

    5.         @AfterClass: 所有測試結束之后運行

    相似問題

    相關經驗

    相關資訊

    相關文檔

  • sesese色