Android單元測(cè)試的利器:Juint(三):Juint的詳細(xì)用法(上)

前言

這幾天正在成都出差,欣賞著成都的妹紙。

當(dāng)我開始寫這篇的時(shí)候是上周五馋记,沒想到這么快就星期二了,東西越寫越多懊烤,為了保持文章盡量短小精悍梯醒,Juint的詳細(xì)用法就分成多篇來寫把,具體能寫幾篇我也不清楚...

正文

現(xiàn)在我們看是介紹Junit的用法奸晴,如果你想看看官方的介紹冤馏,可以訪問http://junit.org/junit4/

Assertions(斷言)

斷言我們之前已經(jīng)在demo中使用過了寄啼,他的作用就是明確我們期望發(fā)生的情況逮光,如果不滿足就會(huì)報(bào)錯(cuò)代箭,就是一種突然成為上帝的感覺,不符合條件的情況我們就不允許發(fā)生涕刚。

Junit中斷言有好幾種嗡综,從字面我們就可以知道他們的用途,例如

assertArrayEquals:斷言兩個(gè)數(shù)組是否相等
assertEquals:斷言字符串是否相等
assertTrue:斷言判斷為true
assertNotNull:斷言不為空
assertSame:斷言相同

他們還有相反的斷言杜漠,例如assertEquals极景,對(duì)應(yīng)就有assertNotEquals,這里就不全都列舉出來了驾茴。

斷言最多有三個(gè)參數(shù):

String reason: 描述要測(cè)試的原因盼樟,此參數(shù)可以省略
T actual:要判斷的參數(shù)
T matcher:對(duì)比的參數(shù)

其中稍微復(fù)雜一點(diǎn)的assertThat,他相當(dāng)于上面列舉的斷言的升級(jí)版锈至,他更加靈活晨缴,接下來我們舉一個(gè)例子:

int x = 3;
assertThat("assertThat good", "good", is("good"));
assertEquals("assertEquals good", "good", "good");
assertThat(x, is(3));

上面的代碼中,我們通過assertThat峡捡,assertEquals都去判斷同一個(gè)字符串是否相等击碗,第三個(gè)斷言是判斷整型是否相等。

運(yùn)行之后沒有報(bào)錯(cuò)们拙,說明assertThat稍途,assertEquals都測(cè)試通過了,這兩種用法得到的結(jié)果是相同的砚婆。

assertThat只能判斷相同類型械拍,例如要判斷的參數(shù)為int型,對(duì)比的參數(shù)也只能是int型装盯。對(duì)比的參數(shù)要使用Matcher參數(shù)殊者,類似于一個(gè)判斷語句,比如的有:

is():相當(dāng)于 “是” 的意思
not():相當(dāng)于 “不是的意思”

ok验夯,以上就是斷言的用法,通常我們沒有必要使用assertThat摔刁,其他的斷言幾乎可以滿足我們所有的需求挥转,但是我們?nèi)匀灰斡浰挠梅ā?/p>

Test Runners

我沒想到一個(gè)特別合適的詞來形容Test Runners的作用,所以多說幾句:

Test Runners 是具有特殊功能的執(zhí)行測(cè)試用例的通道共屈,也可以理解為測(cè)試的執(zhí)行者绑谣,例如可以同時(shí)運(yùn)行多個(gè)測(cè)試用例,也可以具有這個(gè)測(cè)試執(zhí)行者特有的功能拗引。

用法1

/**
 *      Test Runner 示例代碼
 */
public class TestRunnerDemo {
    @Test
    public void runnerTest(){
        org.junit.runner.JUnitCore.runClasses(ExampleUnitTest.class, StudentTest.class);
    }
}

我們可以通過org.junit.runner.JUnitCore.runClasses()方法來同時(shí)運(yùn)行多個(gè)測(cè)試class文件借宵,里面的參數(shù)個(gè)數(shù)是隨意的,例如示例代碼中按照順序運(yùn)行了ExampleUnitTest.class和StudentTest.class矾削。

用法2

/**
 *      Test Runner 實(shí)例代碼2
 */
@RunWith(Suite.class)
// 綁定的測(cè)試用例集合
@Suite.SuiteClasses({ExampleUnitTest.class, StudentTest.class})
public class TestRunnerDemo2 {
}

通過注解@RunWith與其他測(cè)試用例進(jìn)行綁定壤玫,然后@Suite.SuiteClasses({ExampleUnitTest.class, StudentTest.class})來設(shè)置綁定的測(cè)試用例的集合豁护,當(dāng)運(yùn)行這個(gè)測(cè)試用例的時(shí)候,綁定的集合也會(huì)運(yùn)行欲间。

用法3

package com.lzp.unittestdemo.testrunner;

import com.lzp.unittestdemo.Utils;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import java.util.Arrays;
import java.util.Collection;

/**
 * <p>
 * Test Runner 示例代碼3
 */
@RunWith(Parameterized.class)
public class TestRunnerDemo3 {

    /**
     * name可以用來描述這個(gè)測(cè)試的信息
     * 其中{index}表示當(dāng)前的索引值楚里,因?yàn)閳?zhí)行的時(shí)候會(huì)遍歷集合
     * {0} 表示參數(shù)鍵值對(duì)的第一個(gè)位置
     * {1} 表示參數(shù)鍵值對(duì)的第二個(gè)位置,坐標(biāo)以此類推
     */
    @Parameters()
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][]{
                {0, 0}, {1, 1}, {2, 1}, {3, 2}, {4, 3}, {5, 5}, {6, 8}
        });
    }

    private int fInput;

    private int fExpected;

    /**
     * 這里模擬了創(chuàng)建對(duì)象的過程猎贴,Juit會(huì)自動(dòng)把@Parameters里面的數(shù)據(jù)集合班缎,按照順序依次放入構(gòu)造方法中
     * */
    public TestRunnerDemo3(int input, int expected) {
        fInput = input;
        fExpected = expected;
        System.out.println(input + " :" + expected);
    }

    /**
     * 測(cè)試方法,通過Assert.assertEquals判斷參數(shù)是否符合我們的期望
     * */
    @Test
    public void test() {
        Assert.assertEquals(fExpected, Utils.compute(fInput));
    }
}

使用@RunWith(Parameterized.class)會(huì)稍微復(fù)雜一點(diǎn)她渴,但是使用起來非常的方便达址,我們可以創(chuàng)建很多個(gè)相同類型的對(duì)象,然后通過測(cè)試方法對(duì)屬性進(jìn)行操作趁耗,驗(yàn)證我們創(chuàng)建的類是否符合我們的期望沉唠。

用法4

@RunWith(Categories.class)
// 為這個(gè)測(cè)試添加分類
@Category(MyCategory.class)
// 綁定的測(cè)試類集合
@Suite.SuiteClasses( { TestRunnerDemo.class, TestRunnerDemo3.class })
// 交集,運(yùn)行SuiteClasses中與自己分類相同的測(cè)試類
//@Categories.IncludeCategory(MyCategory.class)
// 除去交集对粪,運(yùn)行SuiteClasses中與自己分類不同的測(cè)試類
@Categories.ExcludeCategory(MyCategory.class)
public class TestRunnerDemo4 {
    @Test
    public void test(){
        assertEquals(4, 2 + 2);
    }
}

使用@Category可以對(duì)測(cè)試類添加分類右冻,然后和@Suit結(jié)合使用,可以同時(shí)運(yùn)行相同分類或不同分類的測(cè)試著拭,算是上一種用法的升級(jí)版纱扭。

用法5

有時(shí)候我們會(huì)把測(cè)試方法卸載內(nèi)部類中,這個(gè)時(shí)候我們需要使用@RunWith(Enclosed.class)儡遮,這樣可以運(yùn)行內(nèi)部類的測(cè)試方法乳蛾, 這里貼出官方的demo連接:https://github.com/junit-team/junit4/wiki/%27Enclosed%27-test-runner-example,大家可以學(xué)習(xí)一下鄙币。

用法6

使用第三方的Test Runner:


這里寫圖片描述

這是官網(wǎng)的舉例肃叶,之后我們會(huì)用到MockitoJUnitRunner,其他的大家可以自己去百度學(xué)習(xí)一下如何使用十嘿。

Test execution order(測(cè)試運(yùn)行順序)

有時(shí)候我們需要一些測(cè)試按照我們期望的順序進(jìn)行因惭,例如對(duì)同一個(gè)屬性按照某個(gè)順序多次加工,我們想要看到最終的結(jié)果绩衷,這種情況下蹦魔,我們可以使用@FixMethodOrder()。

@FixMethodOrder() 指明類中測(cè)試方法的運(yùn)行順序咳燕。

MethodSorters.DEFAULT:不可預(yù)測(cè)的順序勿决,可以認(rèn)為是隨機(jī)的順序。
MethodSorters.JVM:按照J(rèn)VM編譯的順序招盲,順序也可能發(fā)生變化
MethodSorters.NAME_ASCENDING:按照方法的命名的順序低缩,也就是按照字母的順序,從a到z曹货。

@FixMethodOrder(MethodSorters.DEFAULT)
public class TestMethodOrder {

    @Test
    public void testA() {
        System.out.println("first");
    }
    
    @Test
    public void testC() {
        System.out.println("third");
    }

    @Test
    public void testB() {
        System.out.println("second");
    }

    
}

上面是官方的demo咆繁,為了讓測(cè)試結(jié)果更明顯讳推,我把testC()移動(dòng)到了第一位,看一下運(yùn)行結(jié)果:

這里寫圖片描述

從截圖上看么介,確實(shí)是按照A娜遵、B、C的順序執(zhí)行壤短。

總結(jié)

今天就到此為止设拟,東西不難,但是知識(shí)點(diǎn)還是挺多的久脯,都需要我們慢慢消化纳胧,我也是用的時(shí)候,偶爾還得復(fù)習(xí)一遍帘撰。

聽同事說今天立冬跑慕,啥也別說了,先填飽我的肚子把摧找,各位拜拜~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末核行,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蹬耘,更是在濱河造成了極大的恐慌芝雪,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件综苔,死亡現(xiàn)場(chǎng)離奇詭異惩系,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)如筛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門堡牡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杨刨,你說我怎么就攤上這事晤柄。” “怎么了妖胀?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵可免,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我做粤,道長(zhǎng),這世上最難降的妖魔是什么捉撮? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任怕品,我火速辦了婚禮,結(jié)果婚禮上巾遭,老公的妹妹穿的比我還像新娘肉康。我一直安慰自己闯估,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布吼和。 她就那樣靜靜地躺著涨薪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炫乓。 梳的紋絲不亂的頭發(fā)上刚夺,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音末捣,去河邊找鬼侠姑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛箩做,可吹牛的內(nèi)容都是我干的莽红。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼邦邦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼安吁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起燃辖,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤鬼店,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后郭赐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薪韩,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年捌锭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俘陷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡观谦,死狀恐怖拉盾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情豁状,我是刑警寧澤捉偏,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站泻红,受9級(jí)特大地震影響夭禽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谊路,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一讹躯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦潮梯、人聲如沸骗灶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耙旦。三九已至,卻和暖如春萝究,著一層夾襖步出監(jiān)牢的瞬間免都,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工糊肤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留琴昆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓馆揉,卻偏偏與公主長(zhǎng)得像业舍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子升酣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容