[轉自] http://huihai.iteye.com/blog/1994270
上一節說了junit的一些基本概念,主要使用assert做一些基本的判斷。但很多時候使用assert做判斷,并不方便,如果要判斷某幾個值是否為true或false,這時使用hamcrest來判斷就會方便許多。hamcrest就是專門為增強junit來提供的框架。它可以有效的使用一些語義比較清楚的名字來做判斷,一些常用的方法如下:
1、下面使用hamcrest在上一節的例子上繼續操作。使用junit中的assertThat進行斷言,第一個參數為實際值,第二個參數為hamcrest的表達式。
在上一節的測試類TestCalcuate中,先靜態導入hamcrest包中的Matchers類,如下圖:
?
2、添加下圖所示的測試方法,在測試方法testHamcrest方法中,把junit與hamcrest結合使用,方法assertThat方法是junit的方法,greaterThan方法是hamcrest的方法,greaterThan判斷第一個參數是否>第二個參數,這里就是判斷50是否大于20。
?
?
3、如果要判斷第一個參數是否大于20,并且小于60,這時可以使用正面的方式:
?
?
?
4、這時使用junit進行測試,如果測試通過,代表50確實大于49,小于60,如果出現如下錯誤:
?
5、其原因是因為資源路徑里junit的jar包在hamcrest的jar包上面,java運行環境先從junit包中查找allOf方法,但是這里使用的是hamcrest的allOf方法。從資源路徑里把兩個包的路徑換一下就可以了。如下圖,選擇hamcrest的jar包點擊up,就可以反hamcrest的jar包放在junit的jar包的上面,java運行環境就會優先從hamcrest包中查allOf方法。
?
?
6、使用hamcrest還可以判斷一個字符串是否以某個字符串開始或結尾。
?
?
?
7、在一個項目中,可能有很多的測試類,如果每個測試類都要點擊運行,那么成百上千個類都需要測試,這會是個比較繁重的工作,這時可以使用可以使用junit的jar包中提供的Suite來解決這個問題,上面的例子中只有一個測試類名叫TestCalcuate,現在新建兩個測試類,分別為TestA、TestB,如下所示:
package cn.whp.util; import org.junit.Test; public class TestA { @Test public void testA(){ System.out.println("TestA"); } }
package cn.whp.util; import org.junit.Test; public class TestB { @Test public void testB(){ System.out.println("TestB"); } }
? ?8、然后新建一個測試類TestSuite,這個類可以把以上三個類,TestCalcuate、TestA、TestB,這三個測試方法同事進行測試。如下所示,
@RunWith(Suite.class)//代表以Suite來運行這個測試類
@SuiteClasses({TestA.class,TestB.class,TestCalcuate.class})//代表要測試的類有哪些。?
package cn.whp.util; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({TestA.class,TestB.class,TestCalcuate.class}) public class TestSuite { public void testSuite(){ System.out.println("TestA"); } }
??如上操作完成后點擊運行,就可以看到所有的測試方法全通過的信息,如下所示:?
?
?
測試原則:
1、建議創建一個專門的source folder--->test來編寫測試類代碼。上面例子就新建一個test的資源包。
2、測試類的包應該保持和需要測試的類一致。上面的例子中Calcuate類在src/cn/whp/util包中,相應的測試類就在test/cn/whp/util中。
3、測試單元中的每個測試方法都必須可以獨立執行,不相互依賴,沒有順序。