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這個類就能夠測試所選的測試類了。