簡單的Junit4應用
如果寫了一個類,想測試一下有沒有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: 所有測試結束之后運行