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,把這些類進行打包,然后同時運行測試。

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 {
    /*
     *  測試原則:
     *  1、建議創建一個專門的source folder--->test來編寫測試類代碼
     *  2、測試類的包應該保持和需要測試的類一致
     *  3、測試單元中的每個測試方法都必須可以獨立執行,沒有次序,不能有任何互相依賴
     */

}
然后直接運行TestSuit這個類就可以測試所選的測試類了。


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM