1.注解
-
@Test
說明該方法是測(cè)試方法。測(cè)試方法必須是public void,可以拋出異常召夹。 -
@Before、@After
@Before它會(huì)在每個(gè)測(cè)試方法執(zhí)行前都調(diào)用一次恕沫。
@After與@Before對(duì)應(yīng)监憎,它會(huì)在每個(gè)測(cè)試方法執(zhí)行完后都調(diào)用一次。 -
@BeforeClass婶溯、@AfterClass
@BeforeClass它會(huì)在所有的測(cè)試方法執(zhí)行之前調(diào)用一次鲸阔。與@Before的差別是:@Before注解的方法在每個(gè)方法執(zhí)行前都會(huì)調(diào)用一次偷霉,有多少個(gè)測(cè)試方法就會(huì)掉用多少次;而@BeforeClass注解的方法只會(huì)執(zhí)行一次褐筛,在所有的測(cè)試方法執(zhí)行前調(diào)用一次
@AfterClass與@BeforeClass對(duì)應(yīng)类少,它會(huì)在所有的測(cè)試方法執(zhí)行完成后調(diào)用一次。
注意的是渔扎,被這兩個(gè)annotation修飾的方法必須是靜態(tài)的硫狞。
這兩個(gè)方法可以用來setup和release一些公共的資源 -
@Ignore
忽略該測(cè)試方法,很多時(shí)候晃痴,因?yàn)槟承┰颍ū热缯酱a還沒有實(shí)現(xiàn)等)残吩,我們可能想讓JUnit忽略某些方法,讓它在跑所有測(cè)試方法的時(shí)候不要跑這個(gè)測(cè)試方法倘核,可以加上該注解世剖。
以上這些注解都是針對(duì)測(cè)試方法而言的,我們寫個(gè)測(cè)試類來運(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是一樣的,如果是一樣的話琼蚯,測(cè)試通過酬凳,不然的話,測(cè)試失敗遭庶。如果傳入的是object宁仔,那么這里的對(duì)比用的是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è)對(duì)象峦睡,即指向同一個(gè)對(duì)象 -
assertNotSame(expected, actual)
驗(yàn)證expected和actual不是同一個(gè)對(duì)象翎苫,即指向不同的對(duì)象 -
Assert.fail()
讓測(cè)試方法失敗
3.Hamcrest與assertThat(使驗(yàn)證條件更加豐富,充分考慮測(cè)試過程中數(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
對(duì)象相關(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ù)字
//測(cè)試數(shù)字在某個(gè)范圍之類榨了,10.6在[10.5-0.2, 10.5+0.2]范圍之內(nèi)
assertThat(10.6, closeTo(10.5, 0.2));
//測(cè)試數(shù)字大于某個(gè)值
assertThat(10.6, greaterThan(10.5));
//測(cè)試數(shù)字小于某個(gè)值
assertThat(10.6, lessThan(11.0));
//測(cè)試數(shù)字小于等于某個(gè)值
assertThat(10.6, lessThanOrEqualTo(10.6));
//測(cè)試數(shù)字大于等于某個(gè)值
assertThat(10.6, greaterThanOrEqualTo(10.6));
//集合類測(cè)試
Map<String, String> map = new HashMap<String, String>();
map.put("a", "hello");
map.put("b", "world");
map.put("c", "haha");
//測(cè)試map包含某個(gè)entry
assertThat(map, hasEntry("a", "hello"));
//測(cè)試map是否包含某個(gè)key
assertThat(map, hasKey("a"));
//測(cè)試map是否包含某個(gè)value
assertThat(map, hasValue("hello"));
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
//測(cè)試list是否包含某個(gè)item
assertThat(list, hasItem("a"));
assertThat(list, hasItems("a", "b"));
//測(cè)試數(shù)組是否包含某個(gè)item
String[] array = new String[]{"a", "b", "c", "d"};
assertThat(array, hasItemInArray("a"));
//測(cè)試對(duì)象
//測(cè)試對(duì)象不為null
assertThat(new Object(), notNullValue());
Object obj = null;
//測(cè)試對(duì)象為null
assertThat(obj, nullValue());
String str = null;
assertThat(str, nullValue(String.class));
obj = new Object();
Object obj2 = obj;
//測(cè)試2個(gè)引用是否指向的通一個(gè)對(duì)象
assertThat(obj, sameInstance(obj2));
str = "abc";
assertThat(str, instanceOf(String.class));
//測(cè)試JavaBean對(duì)象是否有某個(gè)屬性
assertThat(new UserInfo(), hasProperty("name"));
assertThat(new UserInfo(), hasProperty("age"));
//-------組合邏輯測(cè)試--------
//兩者都滿足煎谍,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.reibang.com/p/06124ddc6c68
http://chriszou.com/2016/04/18/android-unit-testing-junit.html