1.注解
-
@Test
說明該方法是測試方法。測試方法必須是public void,可以拋出異常。 -
@Before、@After
@Before它會(huì)在每個(gè)測試方法執(zhí)行前都調(diào)用一次。
@After與@Before對應(yīng),它會(huì)在每個(gè)測試方法執(zhí)行完后都調(diào)用一次。 -
@BeforeClass、@AfterClass
@BeforeClass它會(huì)在所有的測試方法執(zhí)行之前調(diào)用一次。與@Before的差別是:@Before注解的方法在每個(gè)方法執(zhí)行前都會(huì)調(diào)用一次,有多少個(gè)測試方法就會(huì)掉用多少次;而@BeforeClass注解的方法只會(huì)執(zhí)行一次,在所有的測試方法執(zhí)行前調(diào)用一次
@AfterClass與@BeforeClass對應(yīng),它會(huì)在所有的測試方法執(zhí)行完成后調(diào)用一次。
注意的是,被這兩個(gè)annotation修飾的方法必須是靜態(tài)的。
這兩個(gè)方法可以用來setup和release一些公共的資源 -
@Ignore
忽略該測試方法,很多時(shí)候,因?yàn)槟承┰颍ū热缯酱a還沒有實(shí)現(xiàn)等),我們可能想讓JUnit忽略某些方法,讓它在跑所有測試方法的時(shí)候不要跑這個(gè)測試方法,可以加上該注解。
以上這些注解都是針對測試方法而言的,我們寫個(gè)測試類來運(yùn)行一下,看看具體的執(zhí)行順序,代碼如下:
public class Test {
@BeforeClass
public static void init() {
System.out.println("------init()------");
}
@AfterClass
public static void finish() {
System.out.println("------finish()------");
}
@Before
public void setUp() {
System.out.println("------setUp()------");
}
@After
public void tearDown() {
System.out.println("------tearDown()------");
}
@Test
public void test1() {
System.out.println("------test1()------");
}
@Test
public void test2() {
System.out.println("------test2()------");
}
}
------init()------
------setUp()------
------test1()------
------tearDown()------
------setUp()------
------test2()------
------tearDown()------
------finish()------
2.常用斷言
-
assertEquals(expected, actual)
驗(yàn)證expected的值跟actual是一樣的,如果是一樣的話,測試通過,不然的話,測試失敗。如果傳入的是object,那么這里的對比用的是equals() -
assertNotEquals(unexpected, actual)
驗(yàn)證期望值與實(shí)際值不相等。 -
assertTrue(boolean condition)
驗(yàn)證contidion的值是true -
assertFalse(boolean condition)
驗(yàn)證contidion的值是false -
assertNull(Object obj)
驗(yàn)證obj的值是null -
assertNotNull(Object obj)
驗(yàn)證obj的值不是null -
assertSame(expected, actual)
驗(yàn)證expected和actual是同一個(gè)對象,即指向同一個(gè)對象 -
assertNotSame(expected, actual)
驗(yàn)證expected和actual不是同一個(gè)對象,即指向不同的對象 -
Assert.fail()
讓測試方法失敗
3.Hamcrest與assertThat(使驗(yàn)證條件更加豐富,充分考慮測試過程中數(shù)據(jù)的變化)
字符串相關(guān)匹配符
startsWith
endsWith
containsString
equalToIgnoringCase
equalToIgnoringWhiteSpace
數(shù)值相關(guān)匹配符
closeTo
greaterThan
lessThan
lessThanOrEqualTo
greaterThanOrEqualTo
集合相關(guān)匹配符
hasEntry
hasKey
hasValue
hasItem
hasItems
hasItemInArray
對象相關(guān)匹配符
notNullValue
nullValue
sameInstance
instanceOf
hasProperty
組合等邏輯匹配符
allOf
anyOf
both
either
is
isA
not
any
anything
代碼演示示列:
//文本
assertThat("android studio", startsWith("and"));
assertThat("android studio", endsWith("dio"));
assertThat("android studio", containsString("android"));
assertThat("android studio", equalToIgnoringCase("ANDROID studio"));
assertThat("android studio ", equalToIgnoringWhiteSpace(" android studio "));
//數(shù)字
//測試數(shù)字在某個(gè)范圍之類,10.6在[10.5-0.2, 10.5+0.2]范圍之內(nèi)
assertThat(10.6, closeTo(10.5, 0.2));
//測試數(shù)字大于某個(gè)值
assertThat(10.6, greaterThan(10.5));
//測試數(shù)字小于某個(gè)值
assertThat(10.6, lessThan(11.0));
//測試數(shù)字小于等于某個(gè)值
assertThat(10.6, lessThanOrEqualTo(10.6));
//測試數(shù)字大于等于某個(gè)值
assertThat(10.6, greaterThanOrEqualTo(10.6));
//集合類測試
Map<String, String> map = new HashMap<String, String>();
map.put("a", "hello");
map.put("b", "world");
map.put("c", "haha");
//測試map包含某個(gè)entry
assertThat(map, hasEntry("a", "hello"));
//測試map是否包含某個(gè)key
assertThat(map, hasKey("a"));
//測試map是否包含某個(gè)value
assertThat(map, hasValue("hello"));
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
//測試list是否包含某個(gè)item
assertThat(list, hasItem("a"));
assertThat(list, hasItems("a", "b"));
//測試數(shù)組是否包含某個(gè)item
String[] array = new String[]{"a", "b", "c", "d"};
assertThat(array, hasItemInArray("a"));
//測試對象
//測試對象不為null
assertThat(new Object(), notNullValue());
Object obj = null;
//測試對象為null
assertThat(obj, nullValue());
String str = null;
assertThat(str, nullValue(String.class));
obj = new Object();
Object obj2 = obj;
//測試2個(gè)引用是否指向的通一個(gè)對象
assertThat(obj, sameInstance(obj2));
str = "abc";
assertThat(str, instanceOf(String.class));
//測試JavaBean對象是否有某個(gè)屬性
assertThat(new UserInfo(), hasProperty("name"));
assertThat(new UserInfo(), hasProperty("age"));
//-------組合邏輯測試--------
//兩者都滿足,a && b
assertThat(10.4, both(greaterThan(10.0)).and(lessThan(10.5)));
//所有的條件都滿足,a && b && c...
assertThat(10.4, allOf(greaterThan(10.0), lessThan(10.5)));
//任一條件滿足,a || b || c...
assertThat(10.4, anyOf(greaterThan(10.3), lessThan(10.4)));
//兩者滿足一個(gè)即可,a || b
assertThat(10.4, either(greaterThan(10.0)).or(lessThan(10.2)));
assertThat(10.4, is(10.4));
assertThat(10.4, is(equalTo(10.4)));
assertThat(10.4, is(greaterThan(10.3)));
str = new String("abc");
assertThat(str, is(instanceOf(String.class)));
assertThat(str, isA(String.class));
assertThat(10.4, not(10.5));
assertThat(str, not("abcd"));
assertThat(str, any(String.class));
assertThat(str, anything());
文章借鑒與:
http://www.itdecent.cn/p/06124ddc6c68
http://chriszou.com/2016/04/18/android-unit-testing-junit.html