JUnit 的常用語法使用

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我們寫單元測試,一般都會(huì)用到一個(gè)或多個(gè)單元測試框架,在這里,我們介紹一下JUnit4這個(gè)測試框架。這是Java界用...
    鄒小創(chuàng)閱讀 5,755評論 3 33
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評論 19 139
  • 在《初入Android單元測試》中我們對Android單元測試有了一個(gè)大概的了解,今天我們就直接進(jìn)入項(xiàng)目測試環(huán)節(jié)。...
    最最最最醉人閱讀 1,042評論 0 8
  • 腳好酸。
    赫梅爾妮閱讀 218評論 0 0
  • 今天在微信公眾號上看到了一篇文章《60個(gè)漢字,洞穿中國文化,道破人生真諦》感觸頗多。更加深刻的了解中國的博大精深的...
    云上之人閱讀 691評論 0 0

友情鏈接更多精彩內(nèi)容