Junit 斷言 assertThat Hamcrest匹配器

junit斷言總結

本文參考了http://blog.csdn.net/wangpeng047/article/details/9628449

一 junit斷言
1.JUnit框架用一組assert方法封裝了最多見的測試任務。這些assert方法能夠極大地簡化單元測試的編寫。
Assert類包含了一組靜態的測試方法,用於驗證指望值expected和實際值actual邏輯比對是否正確,即測試失敗,標誌爲未經過測試。
若是指望值和實際值比對失敗,Assert類就會拋出一個AssertionFailedError異常,Junit測試框架將這種錯誤納入Fails而且加以記錄。
每個Assert類所屬的方法都會被重載(OverLoaded),若是指定了一個String類型的傳參則該參數將被作爲AssertionFailedError異常的標識信息,告訴測試人員該異常的具體信息。
定義assert方法的輔助類的名稱:Assert類。這個類包含了不少對於編寫測試頗有用的具體代碼。
2.核心斷言方法:
assertArrayEquals(expecteds, actuals)     查看兩個數組是否相等。
assertEquals(expected, actual)     查看兩個對象是否相等。相似於字符串比較使用的equals()方法
assertNotEquals(first, second)     查看兩個對象是否不相等。
assertNull(object)     查看對象是否爲空。
assertNotNull(object)     查看對象是否不爲空。
assertSame(expected, actual)     查看兩個對象的引用是否相等。相似於使用「==」比較兩個對象
assertNotSame(unexpected, actual)     查看兩個對象的引用是否不相等。相似於使用「!=」比較兩個對象
assertTrue(condition)     查看運行結果是否爲true。
assertFalse(condition)     查看運行結果是否爲false。
assertThat(actual, matcher)     查看實際值是否知足指定的條件
fail()     讓測試失敗
3.註解:
@Before     初始化方法
@After     釋放資源
@Test     測試方法,在這裏能夠測試指望異常和超時時間
@Ignore     忽略的測試方法
@BeforeClass     針對全部測試,只執行一次,且必須爲static void
@AfterClass     針對全部測試,只執行一次,且必須爲static void
@RunWith     指定測試類使用某個運行器
@Parameters     指定測試類的測試數據集合
@Rule     容許靈活添加或從新定義測試類中的每一個測試方法的行爲
@FixMethodOrder     指定測試方法的執行順序
一個測試類單元測試的執行順序爲:
@BeforeClass –> @Before –> @Test –> @After –> @AfterClass
4.基本用法:
package test;  
      
    import static org.hamcrest.CoreMatchers.*;  
    import static org.junit.Assert.*;      
    import java.util.Arrays;       
    import org.hamcrest.core.CombinableMatcher;  
    import org.junit.Test;  
      
    public class AssertTests {  
      
          @Test  
          public void testAssertArrayEquals() {  
            byte[] expected = "trial".getBytes();  
            byte[] actual = "trial".getBytes();  
            org.junit.Assert.assertArrayEquals("failure - byte arrays not same", expected, actual);  
          }  
      
          @Test  
          public void testAssertEquals() {  
            org.junit.Assert.assertEquals("failure - strings not same", 5l, 5l);  
          }  
      
          @Test  
          public void testAssertFalse() {  
            org.junit.Assert.assertFalse("failure - should be false", false);  
          }  
      
          @Test  
          public void testAssertNotNull() {  
            org.junit.Assert.assertNotNull("should not be null", new Object());  
          }  
      
          @Test  
          public void testAssertNotSame() {  
            org.junit.Assert.assertNotSame("should not be same Object", new Object(), new Object());  
          }  
      
          @Test  
          public void testAssertNull() {  
            org.junit.Assert.assertNull("should be null", null);  
          }  
      
          @Test  
          public void testAssertSame() {  
            Integer aNumber = Integer.valueOf(768);  
            org.junit.Assert.assertSame("should be same", aNumber, aNumber);  
          }  
      
          // JUnit Matchers assertThat  
          @Test  
          public void testAssertThatBothContainsString() {  
            org.junit.Assert.assertThat("albumen", both(containsString("a")).and(containsString("b")));  
          }  
      
          @Test  
          public void testAssertThathasItemsContainsString() {  
            org.junit.Assert.assertThat(Arrays.asList("one", "two", "three"), hasItems("one", "three"));  
          }  
      
          @Test  
          public void testAssertThatEveryItemContainsString() {  
            org.junit.Assert.assertThat(Arrays.asList(new String[] { "fun", "ban", "net" }), everyItem(containsString("n")));  
          }  
      
          // Core Hamcrest Matchers with assertThat  
          @Test  
          public void testAssertThatHamcrestCoreMatchers() {  
            assertThat("good", allOf(equalTo("good"), startsWith("good")));  
            assertThat("good", not(allOf(equalTo("bad"), equalTo("good"))));  
            assertThat("good", anyOf(equalTo("bad"), equalTo("good")));  
            assertThat(7, not(CombinableMatcher.<Integer> either(equalTo(3)).or(equalTo(4))));  
            assertThat(new Object(), not(sameInstance(new Object())));  
          }  
    }  

 

二 assertThat的用法
1.一些基本的斷言,如eqaul,null,true它們的可讀性並非很好,有時咱們不得不本身編寫表達式並斷言其結果,而且由於咱們沒有提供失敗的信息,當這個斷言失敗時只會拋出java.lang.AssertionError,沒法知道究竟是哪一部分出錯。
JUnit4.4引入了Hamcrest框架,Hamcest提供了一套匹配符Matcher,這些匹配符更接近天然語言,可讀性高,更加靈活。而且使用全新的斷言語法:assertThat,結合Hamcest提供的匹配符,只用這一個方法,就能夠實現全部的測試。
2.assertThat語法以下:
assertThat(T actual, Matcher matcher);
assertThat(String reason, T actual, Matcher matcher);
其中reason爲斷言失敗時的輸出信息,actual爲斷言的值或對象,matcher爲斷言的匹配器,裏面的邏輯決定了給定的actual對象滿不知足斷言
3.注意事項:
a.必須導入JUnit4.4以後的版本以及hamcrest-core.jar和hamcrest-library.jar才能使用assertThat方法; b.不須要繼承TestCase類,可是須要測試方法前必須加「@Test」。
c.要用junit中的assertThat來進行斷言,記住靜態導入:
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;

三 Hamcrest匹配器的用法
Hamcrest是一個測試的框架,它提供了一套通用的匹配符Matcher,靈活使用這些匹配符定義的規則,程序員能夠更加精確的表達本身的測試思想,指定所想設定的測試條件。
hamcrest經常使用的匹配器:
核心:
    anything - 老是匹配,若是你不關心測試下的對象是什麼是有用的
    describedAs - 添加一個定製的失敗表述裝飾器
    is - 改進可讀性裝飾器 - 見下 「Sugar」
邏輯:
    allOf - 若是全部匹配器都匹配才匹配,像Java裏的&&
    anyOf - 若是任何匹配器匹配就匹配,像Java裏的||
    not - 若是包裝的匹配器不匹配器時匹配,反之亦然
對象:
    equalTo - 測試對象相等使用Object.equals方法
    hasToString - 測試Object.toString方法
    instanceOf, isCompatibleType - 測試類型
    notNullValue, nullValue - 測試null
    sameInstance - 測試對象實例
Beans:
    hasProperty - 測試JavaBeans屬性
集合:
    array - 測試一個數組元素test an array’s elements against an array of matchers
    hasEntry, hasKey, hasValue - 測試一個Map包含一個實體,鍵或者值
    hasItem, hasItems - 測試一個集合包含一個元素
    hasItemInArray - 測試一個數組包含一個元素
數字:
    closeTo - 測試浮點值接近給定的值
    greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo - 測試次序
文本:
    equalToIgnoringCase - 測試字符串相等忽略大小寫
    equalToIgnoringWhiteSpace - 測試字符串忽略空白
    containsString, endsWith, startsWith - 測試字符串匹配
舉個例子:
 
    @Test
     public void testHamcrest(){
         // 比較50是否和50相等
         assertThat(50, equalTo(50));
        // 50是否大於30而且小於60
        assertThat("錯誤",50, allOf(greaterThan(30), lessThan(60)));
        // 判斷字符串是否以.txt結尾
        assertThat("錯誤", "abc.txt", endsWith(".txt"));
     }
 

 

四 TestSuite
若是有多個測試操做類,那麼一個一個來運行測試就很不方便,因此經過testsuit能夠把多個測試類「捆綁」起來,一塊兒測試!
例如,一個工程有三個測試類,TestA, TestB和TestCalculate,咱們能夠再建一個類TestSuit,把這些類進行打包,而後同時運行測試。java

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

// RunWith表示這個類是一個suite的類
@RunWith(Suite.class)
// 說明這個類中包含哪些測試組建
@SuiteClasses({TestA.class,
               TestB.class,
               TestCalculate.class})
public class TestSuit {
    /*
     *  測試原則:
     *  一、建議建立一個專門的source folder--->test來編寫測試類代碼
     *  二、測試類的包應該保持和須要測試的類一致
     *  三、測試單元中的每一個測試方法都必須能夠獨立執行,沒有次序,不能有任何互相依賴
     */

}
而後直接運行TestSuit這個類就能夠測試所選的測試類了。
相關文章
相關標籤/搜索