Android 單元測(cè)試框架匯總(Junit,Mockito仗嗦,Robolectric膘滨,Espresso)

單元測(cè)試其實(shí)分為兩種:一種為純java代碼測(cè)試,一般位于test包下稀拐;另一種為UI測(cè)試火邓,一般位于androiTest包下。

本篇用到的單元測(cè)試框架主要有:

Junit钩蚊,Mockito贡翘,Robolectric,Espresso

一砰逻、Junit

詳細(xì)資料請(qǐng)參考

1鸣驱、添加依賴(lài)

dependencies {
    testCompile "junit:junit:4.12"
}

2、創(chuàng)建test文件夾

app
    src
        main
            java
                com.woaikakashen
                    java代碼
                
        test
            java
                com.woaika.kashen
                    測(cè)試代碼

3蝠咆、生成對(duì)應(yīng)的test類(lèi)

java被測(cè)試類(lèi):Student.class
test測(cè)試類(lèi):StudentTest.class

生成方式:
通過(guò)AndroidStudio創(chuàng)建踊东,選中Student.class 點(diǎn)擊右鍵,選擇GoTo--->Test來(lái)快速創(chuàng)建單元測(cè)試方法

運(yùn)行:選中測(cè)試類(lèi)中的方法右鍵Run方法名刚操。

二闸翅、Mockito

詳細(xì)資料請(qǐng)參考資料1
詳細(xì)資料請(qǐng)參考資料2

1、介紹

用來(lái)為提供函數(shù)返回結(jié)果的模擬(mock)及對(duì)函數(shù)調(diào)用過(guò)程的驗(yàn)證菊霜。
關(guān)鍵詞

mock: 針對(duì)真實(shí)的類(lèi)或者對(duì)象坚冀,創(chuàng)建一個(gè)模擬(代理)的對(duì)象。

stub: 針對(duì)一個(gè)類(lèi)或者對(duì)象的方法鉴逞,進(jìn)行模擬調(diào)用及輸出记某。

2、添加依賴(lài)

dependencies {
   testCompile "org.mockito:mockito-core:2.11.0"
}

3构捡、加載方式

方法一:

    @Test
    public void testIsNotNull(){
        Person mPerson = mock(Person.class); //<--使用mock方法

        assertNotNull(mPerson);
    }
    

方法二:

    @Mock //<--使用@Mock注解
    Person mPerson;

    @Before
    public void setup(){
        MockitoAnnotations.initMocks(this); //<--初始化
    }

4液南、常用語(yǔ)法

1.  打樁方法
2.  驗(yàn)證方法
3.  參數(shù)匹配器
4.  其他方法

三、Robolectric

詳細(xì)資料請(qǐng)參考

1勾徽、介紹

利用Android SDK和資源來(lái)編寫(xiě)測(cè)試用例滑凉,并將所有的測(cè)試用例運(yùn)行在java虛擬機(jī)內(nèi)。不需要使用模擬器或真機(jī)來(lái)測(cè)試喘帚。

2畅姊、添加依賴(lài)

dependencies {
    testCompile "junit:junit:4.12"
    testCompile "org.robolectric:robolectric:3.0"
}

3、注解配置TestRunner

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class SampleActivityTest {

}

4吹由、常用語(yǔ)法

四若未、Espresso

詳細(xì)資料請(qǐng)參考資料1

詳細(xì)資料請(qǐng)參考資料2

Espresso需要依賴(lài)Android設(shè)備.這將導(dǎo)致我們將花費(fèi)更多時(shí)間在編譯apk和AndroidTest apk的安裝上

4.1、添加依賴(lài)

androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
}

4.2溉知、設(shè)置測(cè)試執(zhí)行器

這個(gè)運(yùn)行器是基于InstrumentationTestRunnerGoogleInstrumentationTestRunner 陨瘩,運(yùn)行JUnit3和JUnit4來(lái)測(cè)試你的Android應(yīng)用程序腕够。

defaultConfig {
        ...
        testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
    }

4.3、創(chuàng)建androidTest文件夾

app
    src
        main
            java
                com.woaikakashen
                    java代碼
        androidTest
            java
               com.woaikakashen
                    UI測(cè)試代碼
        test
            java
                com.woaika.kashen
                    純測(cè)試代碼

4.4舌劳、常用注解

@Rule:
public ActivityTestRule mActivityRule = new ActivityTestRule<>(
            MainActivity.class);
定義一個(gè)測(cè)試規(guī)則帚湘,構(gòu)造函數(shù)參數(shù)指定一個(gè)需要被測(cè)試的頁(yè)面。當(dāng)打開(kāi)app會(huì)打開(kāi)對(duì)應(yīng)的頁(yè)面執(zhí)行所定義的測(cè)試用例甚淡。
@Test:
用來(lái)定義一個(gè)測(cè)試用例

4.5大诸、常用語(yǔ)法

1、訪問(wèn)UI元素

onView()方法來(lái)訪問(wèn)UI元素, withId()進(jìn)行id訪問(wèn),使用withText()進(jìn)行文本匹配,然后在執(zhí)行相應(yīng)的動(dòng)作贯卦,最后在驗(yàn)證

eg:

//驗(yàn)證id為tvLoanBig的text內(nèi)容是否為極速大額貸
onView(withId(R.id.tvLoanBig)).check(matches(withText("極速大額貸")));

2资柔、AdapterView

onData 方法來(lái)獲取DataInteraction對(duì)象,然后在來(lái)訪問(wèn)目標(biāo)元素撵割。Espresso處理加載目標(biāo)元素到當(dāng)前層次結(jié)構(gòu)贿堰。

3、執(zhí)行動(dòng)作

調(diào)用ViewInteraction.perform()DataInteraction.perform()啡彬「耄可以指定一個(gè)或者多個(gè)動(dòng)作,Espresso會(huì)按照指定的順序庶灿,依次發(fā)送動(dòng)作事件纵搁,這些動(dòng)作是線程安全的.

ViewActions可以提供一些列常用的方法,我們可以利用寫(xiě)方法來(lái)操作UI元素往踢。

  • ViewActions.click(): 點(diǎn)擊事件
  • ViewActions.typeText(): 輸入指定的文字內(nèi)容
  • ViewActions.scrollTo(): 滑動(dòng)
  • ViewActions.pressKey(): 按下按鍵
  • ViewActions.clearText(): 清空文本
4腾誉、校驗(yàn)結(jié)果

調(diào)用ViewInteraction.check()DataInteraction.check()方法,可以判斷UI元素的狀態(tài)峻呕,如果斷言失敗利职,會(huì)拋出AssertionFailedError異常。

比如:

  • doesNotExist: 斷言某一個(gè)view不存在
  • matches: 斷言某個(gè)view存在山上,且符合一列的匹配
  • selectedDescendentsMatch:斷言指定的子元素存在眼耀,且他們的狀態(tài)符合一些列的匹配

4.6英支、Espresso 自動(dòng)化測(cè)試- RecyclerView

從測(cè)試的角度上來(lái)看 RecyclerView不是一個(gè) AdapterView佩憾,這意味著你不能使用 onData()去跟你的list items交互。

1干花、添加對(duì)應(yīng)的庫(kù)
dependencies {
    // ...
   androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.0');
}

但是這樣子的話妄帘。gradle就會(huì)出現(xiàn)報(bào)錯(cuò)了,出現(xiàn)一些依賴(lài)關(guān)系的沖突池凄,所以我們需要去除一些重復(fù)的依賴(lài)關(guān)系抡驼。

dependencies {
    // ...

    androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.0') {
        exclude group: 'com.android.support', module: 'appcompat'
        exclude group: 'com.android.support', module: 'support-v4'
        exclude module: 'recyclerview-v7'
    }
}
2、常用語(yǔ)法

主要用到RecyclerViewActions類(lèi)

2.1 actionOnItemAtPosition
//點(diǎn)擊position為5的item
onView(withId(R.id.rvLoanAll)).perform(RecyclerViewActions.actionOnItemAtPosition(5, click()));
2.2 actionOnItem
//點(diǎn)擊帶有 "百度有錢(qián)花" 字符串的item
onView(withId(R.id.rvLoanAll)).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText("百度有錢(qián)花")), click()));

hasDescendant 指代的是對(duì)應(yīng)的item的后代中有包含對(duì)應(yīng)文本的內(nèi)容的.不過(guò)使用這個(gè)需要小心 因?yàn)楹苡锌赡軙?huì)出現(xiàn)兩個(gè)同樣內(nèi)容的

2.3 scrollToPosition
//滾動(dòng)到position為5的位置
onView(withId(R.id.rvLoanAll)).perform(RecyclerViewActions.scrollToPosition(5));
        

4.7肿仑、Espresso 自動(dòng)化測(cè)試- 異步代碼測(cè)試

由于成本過(guò)高致盟,需要大量代碼碎税,而且需要實(shí)現(xiàn)idlingResource接口,請(qǐng)查閱:

詳細(xì)請(qǐng)參考資料

//Espresso的IdlingResource異步接口依賴(lài):
compile('com.android.support.test.espresso:espresso-idling-resource:3.0.1') {
        exclude module: 'support-annotations'
    }
androidTestCompile('com.android.support.test.espresso:espresso-idling-resource:3.0.1') {
        exclude module: 'support-annotations'
}

最后馏锡,希望此篇博客對(duì)大家有所幫助雷蹂,歡迎提出問(wèn)題及建議共同探討,如有興趣可以關(guān)注我的博客杯道,謝謝匪煌!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市党巾,隨后出現(xiàn)的幾起案子萎庭,更是在濱河造成了極大的恐慌,老刑警劉巖齿拂,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驳规,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡署海,警方通過(guò)查閱死者的電腦和手機(jī)达舒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)叹侄,“玉大人巩搏,你說(shuō)我怎么就攤上這事≈捍” “怎么了贯底?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)撒强。 經(jīng)常有香客問(wèn)我禽捆,道長(zhǎng),這世上最難降的妖魔是什么飘哨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任胚想,我火速辦了婚禮,結(jié)果婚禮上芽隆,老公的妹妹穿的比我還像新娘浊服。我一直安慰自己,他們只是感情好胚吁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布牙躺。 她就那樣靜靜地躺著,像睡著了一般腕扶。 火紅的嫁衣襯著肌膚如雪孽拷。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天半抱,我揣著相機(jī)與錄音脓恕,去河邊找鬼膜宋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛炼幔,可吹牛的內(nèi)容都是我干的激蹲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼江掩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼学辱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起环形,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤策泣,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后抬吟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體萨咕,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年火本,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了危队。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钙畔,死狀恐怖茫陆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情擎析,我是刑警寧澤簿盅,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布桨醋,位于F島的核電站,受9級(jí)特大地震影響现斋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜庄蹋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一瞬内、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔓肯,春花似錦遂鹊、人聲如沸振乏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)慧邮。三九已至调限,卻和暖如春舟陆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耻矮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工秦躯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裆装。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓踱承,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親哨免。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茎活,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)琢唾,斷路器载荔,智...
    卡卡羅2017閱讀 134,660評(píng)論 18 139
  • Instrumentation介紹 Instrumentation是個(gè)什么東西? Instrumentation測(cè)...
    打不死的小強(qiáng)qz閱讀 7,789評(píng)論 2 39
  • 小孩子工扎,小孩子。 咱們家的大侄女讀一年級(jí)七歲衔蹲,小侄女一歲多定庵,會(huì)走,會(huì)說(shuō)一些又懂又不懂的話踪危。 和姐姐玩得可好玩了蔬浙,整...
    一尢心青閱讀 127評(píng)論 0 0
  • 前言 在上個(gè)月.NET Core出了最新版本預(yù)覽版,只是在Window系統(tǒng)上試驗(yàn)了一下贞远。原本想等發(fā)布正式版的時(shí)候在...
    seay閱讀 4,570評(píng)論 1 4