Robolectric 單元測試筆記

2016年4月11日

[TOC]

1、環(huán)境搭建(版本3.0)

Android單元測試需要JUnit框架的支持斤葱,Robolectric只是提供了Android代碼的運(yùn)行環(huán)境,測試還是需要junit來實(shí)現(xiàn)。配置如下:

testCompile 'junit:junit:4.10'
testCompile 'org.robolectric:robolectric:3.0'

然后在Build Variants中的Test Artifact改為Unit Tests弹惦。

a-1-1.png-9.4kB
a-1-1.png-9.4kB

在Android Studio2.0正式版中沒有這個(gè)選項(xiàng),直至忽略掉悄但。

2棠隐、第一次嘗試

在Android studio下面有Test包,新建測試類TestDemoTest.

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class,
        sdk = 21,
        manifest = "src/main/AndroidManifest.xml",
        packageName = "cn.liucl.andoridunittestdemo",
        resourceDir = "res")
public class TestDemoTest {


    public static final String TAG = TestDemoTest.class.getSimpleName();
    private MainActivity mainActivity;

    @Before
    public void beforeTest() throws Exception {
        System.out.println("before");
    }

    @Test
    public void Testing() throws Exception {
        System.out.println("Testing()");
    }

}

第1行代碼檐嚣,使用注解的方式引入robolectric助泽。然后看這個(gè)類的兩個(gè)方法,使用before注解的方法嚎京,表示在單元測試之前執(zhí)行嗡贺,可用于獲取Activity或資源文件等;而Test注解的方法表示就是這個(gè)測試case鞍帝。執(zhí)行之后诫睬,你會(huì)發(fā)現(xiàn)Robolectric cant found resource and AndroidManifest.xml這個(gè)錯(cuò)誤。這是robolectric沒有正確加載manifest文件帕涌。其實(shí)摄凡,Resources也沒有被加載。這樣就有這個(gè)類的第二個(gè)注解蚓曼,也就是Config亲澡。在Config里面可以指定SDK版本,資源文件以及清單文件等信息纫版。具體信息可以看他的注解谷扣。

補(bǔ)充:如果還是找不到資源,嘗試把AndroidManifest中Application的Theme改成android:theme="@style/Theme.AppCompat"

注意,第一次運(yùn)行需要下載sdk需要的組件会涎,可能需要一段時(shí)間裹匙。如果下載失敗,自備梯子末秃。
a-1-2.png-63.2kB
a-1-2.png-63.2kB

圖為正在下載概页。

3、帶上Activity

Robolectric可以創(chuàng)建Activity练慕,可以測試執(zhí)行點(diǎn)擊事件惰匙,可以測試生命周期等。

1铃将、創(chuàng)建一個(gè)Activity
Robolectric提供對(duì)Activity的操作方法项鬼,我們獲取一個(gè)Activity只需要Robolectric.setupActivity(MainActivity.class);就可以了。

@Before
public void beforeTest() throws Exception {
    System.out.println("before");
    mainActivity = Robolectric.setupActivity(MainActivity.class);
}

@Test
public void Testing() throws Exception {
    Assert.assertNotNull(mainActivity); //斷言是否不為空
    System.out.println("Testing()");
}

下面是Robolectric的方法:


a-1-3.png-50.4kB
a-1-3.png-50.4kB

上面的buildActivity和setupActivity都可以創(chuàng)建Activity劲阎,他們的不同之處在于绘盟,setupActivity直接到Activity生命周期的運(yùn)行階段,而buildActivity只是獲取對(duì)象

public static <T extends Activity> ActivityController<T> buildActivity(Class<T> activityClass) {
    return ActivityController.of(shadowsAdapter, activityClass);
}

public static <T extends Activity> T setupActivity(Class<T> activityClass) {
    return ActivityController.of(shadowsAdapter, activityClass).setup().get();
}
public ActivityController<T> setup() {
    return create().start().postCreate(null).resume().visible();
}

2悯仙、生命周期
ActivityController提供對(duì)Activity生命周期操作的一系列方法:(相同的龄毡,Service也是這樣)

a-1-4.png-62.5kB
a-1-4.png-62.5kB

3、測試點(diǎn)擊
Robolectric支持點(diǎn)擊操作锡垄,首先確保Activity執(zhí)行到相應(yīng)的生命周期沦零。在MainActivity編寫好邏輯。

MainActivity

button = (Button) findViewById(R.id.test1);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        System.out.println("Success");
    }
});

TestDemoTest

@Before
public void beforeTest() throws Exception {
    Log.i(TAG, "beforeTest()");
    mainActivity = Robolectric.buildActivity(MainActivity.class).setup().get();//注意生命周期
    button = (Button) mainActivity.findViewById(R.id.test1);
}

@Test
public void btn1(){
    button.performClick();
}
在Robolectric中打Log請(qǐng)使用**System.out**货岭。Android的Log工具只有在使用Adb時(shí)候才有效路操。

4、斷言

Robolectric不提供類似Junit的assert方法來測試程序千贯。所以還是需要使用Junit的assert來測試屯仗。

assertNotNull(); //判斷對(duì)象是否不為空
assertNull();
assertEquals(); //判斷實(shí)際值和期望值是否“相同”
assertTrue(); //判斷布爾值是否為true
assertFalse();
assertNotSame();
assertSame(); //判斷實(shí)際值和期望值是否為同一個(gè)對(duì)象

5、在項(xiàng)目中使用

實(shí)際項(xiàng)目中丈牢,單元測試對(duì)象與頁面是一對(duì)一的祭钉,并不建議跨頁面,這樣的單元測試藕合度太大己沛,維護(hù)困難慌核。單元測試需要找到頁面的入口,分析項(xiàng)目頁面中的元素申尼、業(yè)務(wù)邏輯垮卓,這里的邏輯不僅僅包括界面元素的展示以及控件組件的行為,還包括代碼的處理邏輯师幕。然后可以創(chuàng)建單元測試case列表(列表用于紀(jì)錄項(xiàng)目中單元測試的范圍粟按,便于單元測試的管理以及新人了解業(yè)務(wù)流程)诬滩,列表中記錄單元測試對(duì)象的頁面,對(duì)象中的case邏輯以及名稱等灭将。工程師可以根據(jù)這個(gè)列表開始寫單元測試代碼疼鸟。
單元測試是工程師代碼級(jí)別的質(zhì)量保證工程,上述流程并不能完全覆蓋重要的業(yè)務(wù)邏輯以及邊界條件庙曙,因此空镜,需要寫完后,看覆蓋率捌朴,找出單元測試中沒有覆蓋到的函數(shù)分支條件等吴攒,然后繼續(xù)補(bǔ)充單元測試case列表,并在單元測試工程代碼中補(bǔ)上case砂蔽。
直到規(guī)劃的頁面中所有邏輯的重要分支洼怔、邊界條件都被覆蓋,該項(xiàng)目的單元測試結(jié)束左驾。


a-1-5.jpg-169.5kB
a-1-5.jpg-169.5kB

參考

  1. http://tech.meituan.com/Android_unit_test.html
  2. http://stackoverflow.com/questions/18715983/robolectric-cant-found-resource-and-androidmanifest-xml
  3. http://www.xuxu1988.com/2015/05/23/robolectric-01/?utm_source=tuicool
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末镣隶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子什荣,更是在濱河造成了極大的恐慌矾缓,老刑警劉巖怀酷,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稻爬,死亡現(xiàn)場離奇詭異,居然都是意外死亡蜕依,警方通過查閱死者的電腦和手機(jī)桅锄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來样眠,“玉大人友瘤,你說我怎么就攤上這事¢苁” “怎么了辫秧?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長被丧。 經(jīng)常有香客問我盟戏,道長,這世上最難降的妖魔是什么甥桂? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任柿究,我火速辦了婚禮,結(jié)果婚禮上黄选,老公的妹妹穿的比我還像新娘蝇摸。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布貌夕。 她就那樣靜靜地躺著律歼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪啡专。 梳的紋絲不亂的頭發(fā)上苗膝,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音植旧,去河邊找鬼辱揭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛病附,可吹牛的內(nèi)容都是我干的问窃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼完沪,長吁一口氣:“原來是場噩夢啊……” “哼域庇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起覆积,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤听皿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后宽档,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尉姨,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年吗冤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了又厉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡椎瘟,死狀恐怖覆致,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肺蔚,我是刑警寧澤煌妈,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站宣羊,受9級(jí)特大地震影響璧诵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜段只,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一腮猖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赞枕,春花似錦澈缺、人聲如沸坪创。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莱预。三九已至,卻和暖如春项滑,著一層夾襖步出監(jiān)牢的瞬間依沮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工枪狂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留危喉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓州疾,卻偏偏與公主長得像辜限,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子严蓖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,129評(píng)論 25 707
  • Android單元測試介紹 處于高速迭代開發(fā)中的Android項(xiàng)目往往需要除黑盒測試外更加可靠的質(zhì)量保障薄嫡,這正是單...
    東經(jīng)315度閱讀 3,108評(píng)論 6 37
  • @Author:彭海波 前言 單元測試(又稱為模塊測試, Unit Testing)是針對(duì)程序模塊(軟件設(shè)計(jì)的最小...
    海波筆記閱讀 4,961評(píng)論 0 52
  • 學(xué)了萬人迷的課程之后,很多同學(xué)就想實(shí)踐一下颗胡,于是有了各種群毫深,大家在群里面分享自己的所學(xué),也借機(jī)鍛煉下自己毒姨。大家滿腔...
    若蘭W5243閱讀 464評(píng)論 2 2
  • 我喜歡這個(gè)琴房哑蔫, 甚至感覺有些許地“戀”著這個(gè)地方。 【一】 剛開始來的時(shí)候手素,老師的琴房是“緊張而嚴(yán)肅”的鸳址, 還帶...
    路航唐LhT閱讀 313評(píng)論 0 1