在Android Studio中進(jìn)行單元測試和UI測試

本文章轉(zhuǎn)載于搜狗測試

本文轉(zhuǎn)自簡書吝秕,是作者翻譯Google I/0 2015中關(guān)于測試的codelab烁峭。

目錄

1.概述

2.創(chuàng)建新的Android Studio工程

3.配置支持單元測試的工程

4.創(chuàng)建第一個單元測試

5.運行單元測試

6.配置支持Instrumentation測試的工程

7.為app添加簡單的交互

8.創(chuàng)建并運行Espresso測試

9.祝賀约郁!

1. 概述

在這個codelab中鬓梅,你將學(xué)習(xí)如何在Android Studio中配置工程用于測試,在開發(fā)機(jī)器上編寫并運行單元測試士袄,以及如何在手機(jī)上做功能UI測試娄柳。

你會學(xué)到什么

更新包含JUnit和AndroidTesting Support Library的Gradle構(gòu)建文件

編寫運行在本機(jī)Java虛擬機(jī)上的單元測試

編寫運行在手機(jī)或者虛擬機(jī)上的Espresso測試

你需要什么

Android Studiov1.2+

Android 4.0+的測試設(shè)備

2.創(chuàng)建新的Android Studio工程

如果是第一次啟動Android Studio赤拒,從歡迎頁選擇“Start a new Android Studio project”挎挖。如果已經(jīng)打開了一個工程,選擇File>New>New Project...

Create new project”向?qū)笇?dǎo)整個過程崔涂,在第一頁輸入如下內(nèi)容:

這樣會保證你的代碼同codelab講解的內(nèi)容具有一致的命名冷蚂。其他的選項都設(shè)置為默認(rèn)蝙茶,一路點擊Next直到工程創(chuàng)建完畢隆夯。

點擊Run按鈕檢查app是否運行正常别伏,要么從模擬器列表中選擇一個啟動厘肮,要么確認(rèn)開啟了debug模式的設(shè)備通過USB同電腦正確連接轴脐。

app目前沒有做任何事情大咱,但是屏幕上應(yīng)該顯示“Hello world!”和app的名字。

3.配置支持單元測試的工程

在寫測試之前,讓我們做下簡單的檢查厦瓢,確保工程配置正確煮仇。

首先浙垫,確認(rèn)在Build Variants窗口內(nèi)的Test Artifact中選擇了"Unit Tests"。

然后辙诞,在工程的src文件夾內(nèi)創(chuàng)建test和test/java文件夾轻抱。需要注意的是祈搜,你不能在Android視圖下進(jìn)行這些操作夭问,要么在系統(tǒng)的文件管理器內(nèi)創(chuàng)建缰趋,要么在工程窗口左上方點擊下拉菜單選擇Project視圖陕见。最終的工程結(jié)構(gòu)應(yīng)該是這樣的:

最后灰粮,打開工程的build.gradle(Module:app)文件忍坷,添加JUnit4依賴,點擊Gradle sync按鈕佩研。

dependencies{compilefileTree(dir:'libs',include: ['*.jar'])compile'com.android.support:appcompat-v7:22.1.1'testCompile'junit:junit:4.12'}

當(dāng)你同步Gradle配置時柑肴,可能需要聯(lián)網(wǎng)下載JUnit依賴。

4.創(chuàng)建第一個單元測試

現(xiàn)在旬薯,萬事俱備晰骑,讓我們開始寫第一個測試吧。首先绊序,創(chuàng)建一個非常簡單的被測類:Calculator類硕舆。

然后,向類中添加一些基本的算術(shù)運算方法抚官,比如加法和減法。將下列代碼復(fù)制到編輯器中阶捆。不用擔(dān)心實際的實現(xiàn)耗式,暫時讓所有的方法返回0。

packagecom.example.testing.testingexample;publicclassCalculator{publicdoublesum(doublea,doubleb){return0; ? ?}publicdoublesubstract(doublea,doubleb){return0; ? ?}publicdoubledivide(doublea,doubleb){return0; ? ?}publicdoublemultiply(doublea,doubleb){return0; ? ?}}

Android Studio提供了一個快速創(chuàng)建測試類的方法。只需在編輯器內(nèi)右鍵點擊Calculator類的聲明刊咳,選擇Go to > Test彪见,然后"Create anew test…"

在打開的對話窗口中,選擇JUnit4和"setUp/@Before"娱挨,同時為所有的計算器運算生成測試方法

這樣余指,就會在正確的文件夾內(nèi)(app/src/test/java/com/example/testing/testingexample)生成測試類框架,在框架內(nèi)填入測試方法即可跷坝。下面是一個示例:

Calculator.java

packagecom.example.testing.testingexample;importorg.junit.Before;importorg.junit.Test;importstaticorg.junit.Assert.*;publicclassCalculatorTest{privateCalculator mCalculator;@BeforepublicvoidsetUp()throwsException{ ? ? ? ?mCalculator =newCalculator(); ? ?}@TestpublicvoidtestSum()throwsException{//expected: 6, sum of 1 and 5assertEquals(6d, mCalculator.sum(1d,5d),0); ? ?}@TestpublicvoidtestSubstract()throwsException{ ? ? ? ?assertEquals(1d, mCalculator.substract(5d,4d),0); ? ?}@TestpublicvoidtestDivide()throwsException{ ? ? ? ?assertEquals(4d, mCalculator.divide(20d,5d),0); ? ?}@TestpublicvoidtestMultiply()throwsException{ ? ? ? ?assertEquals(10d, mCalculator.multiply(2d,5d),0); ? ?}}

5.運行單元測試

終于到運行測試的時候了酵镜!右鍵點擊CalculatorTest類,選擇Run > CalculatorTest柴钻。也可以通過命令行運行測試淮韭,在工程目錄內(nèi)輸入:

./gradlew test

無論如何運行測試,都應(yīng)該看到輸出顯示4個測試都失敗了贴届。這是預(yù)期的結(jié)果靠粪,因為我們還沒有實現(xiàn)運算操作。

讓我們修改Calculator類中的sum(double a,double b)方法返回一個正確的結(jié)果毫蚓,重新運行測試占键。你應(yīng)該看到4個測試中的3個失敗了。

Calculator.java

publicdoublesum(doublea,doubleb){returna + b;}

作為練習(xí)元潘,你可以實現(xiàn)剩余的方法使所有的測試通過畔乙。

可能你已經(jīng)注意到了Android Studio從來沒有讓你連接設(shè)備或者啟動模擬器來運行測試。那是因為翩概,位于src/tests目錄下的測試是運行在本地電腦Java虛擬機(jī)上的單元測試牲距。編寫測試,實現(xiàn)功能使測試通過钥庇,然后再添加更多的測試...這種工作方式使快速迭代成為可能嗅虏,我們稱之為測試驅(qū)動開發(fā)。

值得注意的是上沐,當(dāng)在本地運行測試時皮服,Gradle為你在環(huán)境變量中提供了包含Android框架的android.jar包。但是它們功能不完整(所以参咙,打個比方龄广,你不能單純調(diào)用Activity的方法并指望它們生效)。推薦使用Mockito等mocking框架來mock你需要使用的任何Android方法蕴侧。對于運行在設(shè)備上择同,并充分利用Android框架的測試,請繼續(xù)閱讀本篇教程的下個部分净宵。

6.配置支持Instrumentation測試的工程

雖然在Android框架內(nèi)支持運行instrumentation測試敲才,但是目前開發(fā)重心主要集中在剛剛發(fā)布的作為Android Testing Support Library一部分的新的AndroidJUnitRunner裹纳。測試庫包含Espresso,用于運行功能UI測試的框架紧武。讓我們通過編輯build.gradle的相關(guān)部分來把它們添加進(jìn)我們的工程剃氧。

build.gradle

apply plugin:'com.android.application'android { ? ?compileSdkVersion22buildToolsVersion"22.0.1"defaultConfig { ? ? ? ?applicationId"com.example.testing.testingexample"minSdkVersion15targetSdkVersion22versionCode1versionName"1.0"http://ADD THIS LINE:testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner"} ? ?buildTypes { ? ? ? ?release { ? ? ? ? ? ?minifyEnabledfalseproguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'} ? ?}//ADD THESE LINES:packagingOptions {exclude'LICENSE.txt'}}dependencies{compilefileTree(dir:'libs',include: ['*.jar'])compile'com.android.support:appcompat-v7:22.0.0'//← MAKE SURE IT’S 22.0.0testCompile'junit:junit:4.12'//ADD THESE LINES:androidTestCompile'com.android.support.test:runner:0.2'androidTestCompile'com.android.support.test:rules:0.2'androidTestCompile'com.android.support.test.espresso:espresso-core:2.1'}

重要:由于一些依賴版本沖突,你需要確認(rèn)com.android.support:appcompat-v7庫的版本號是22.0.0阻星,像上面的代碼片段一樣朋鞍。

另外,Android Studio可能會提醒你Build Tools 22.0.1沒有安裝妥箕。你應(yīng)該接受修復(fù)建議滥酥,Studio會為你安裝Build Tools或者在build.gradle中把這行修改成已經(jīng)安裝在你電腦的版本。

上面的工作完成后畦幢,在Build Variants窗口內(nèi)切換成Android Instrumentation Tests坎吻,你的工程應(yīng)該自動同步。如果沒有宇葱,點擊Gradle sync按鈕瘦真。

7.為app添加簡單的交互

在使用Espresso進(jìn)行UI測試前,讓我們?yōu)閍pp添加一些Views和簡單的交互贝搁。我們使用一個用戶可以輸入名字的EditText,歡迎用戶的Button和用于輸出的TextView芽偏。打開res/layout/activity_main.xml雷逆,粘貼如下代碼:

activity_main.xml

還需要在MainActivity.java中添加onClick handler:

MainActivity.java

publicvoidsayHello(View v){ ? ?TextView textView = (TextView) findViewById(R.id.textView); ? ?EditText editText = (EditText) findViewById(R.id.editText); ? ?textView.setText("Hello, "+ editText.getText().toString() +"!");}

現(xiàn)在可以運行app并確認(rèn)一切工作正常。在點擊Run按鈕之前污尉,確認(rèn)你的Run Configuration沒有設(shè)置為運行測試膀哲。如需更改,點擊下拉選項被碗,選擇app某宪。

8.創(chuàng)建并運行Espresso測試

在工程的整體視圖上,找到以(androidTest)后綴結(jié)尾的包名并創(chuàng)建一個新的Java類锐朴⌒宋梗可以將它命名為MainActivityInstrumentationTest,將如下代碼粘貼過去焚志。

MainActivityInstrumentationTest.java

package com.example.testing.testingexample;importandroid.support.test.InstrumentationRegistry;importandroid.support.test.espresso.action.ViewActions;importandroid.support.test.rule.ActivityTestRule;importandroid.support.test.runner.AndroidJUnit4;importandroid.test.ActivityInstrumentationTestCase2;importandroid.test.suitebuilder.annotation.LargeTest;importorg.junit.After;importorg.junit.Before;importorg.junit.Rule;importorg.junit.Test;importorg.junit.runner.RunWith;importstatic android.support.test.espresso.Espresso.onView;importstatic android.support.test.espresso.action.ViewActions.click;importstatic android.support.test.espresso.action.ViewActions.closeSoftKeyboard;importstatic android.support.test.espresso.action.ViewActions.typeText;importstatic android.support.test.espresso.assertion.ViewAssertions.matches;importstatic android.support.test.espresso.matcher.ViewMatchers.withId;importstatic android.support.test.espresso.matcher.ViewMatchers.withText;@RunWith(AndroidJUnit4.class)@LargeTestpublicclassMainActivityInstrumentationTest{privatestaticfinalStringSTRING_TO_BE_TYPED="Peter"; ? ?@RulepublicActivityTestRule mActivityRule = newActivityTestRule<>(MainActivity.class); ? ?@Testpublicvoid sayHello(){ ? ? ? ?onView(withId(R.id.editText)).perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard());//line 1onView(withText("Say hello!")).perform(click());//line 2StringexpectedText ="Hello, "+STRING_TO_BE_TYPED+"!"; ? ? ? ?onView(withId(R.id.textView)).check(matches(withText(expectedText)));//line 3}}

測試類通過AndroidJUnitRunner運行衣迷,并執(zhí)行sayHello()方法。下面將逐行解釋都做了什么:

1.首先酱酬,找到ID為editText的view壶谒,輸入Peter,然后關(guān)閉鍵盤膳沽;

2.接下來汗菜,點擊Say hello!的View让禀,我們沒有在布局的XML中為這個Button設(shè)置id,因此陨界,通過搜索它上面的文字來找到它巡揍;

3.最后,將TextView上的文本同預(yù)期結(jié)果對比普碎,如果一致則測試通過吼肥;

你也可以右鍵點擊域名運行測試,選擇Run>MainActivityInstrume...(第二個帶Android圖標(biāo)的)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末麻车,一起剝皮案震驚了整個濱河市缀皱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌动猬,老刑警劉巖啤斗,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赁咙,居然都是意外死亡钮莲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門彼水,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崔拥,“玉大人,你說我怎么就攤上這事凤覆×赐撸” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵盯桦,是天一觀的道長慈俯。 經(jīng)常有香客問我,道長拥峦,這世上最難降的妖魔是什么贴膘? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮略号,結(jié)果婚禮上刑峡,老公的妹妹穿的比我還像新娘。我一直安慰自己玄柠,他們只是感情好氛琢,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著随闪,像睡著了一般阳似。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铐伴,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天撮奏,我揣著相機(jī)與錄音俏讹,去河邊找鬼。 笑死畜吊,一個胖子當(dāng)著我的面吹牛泽疆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播玲献,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼殉疼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捌年?” 一聲冷哼從身側(cè)響起瓢娜,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎礼预,沒想到半個月后眠砾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡托酸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年褒颈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片励堡。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡谷丸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出应结,到底是詐尸還是另有隱情刨疼,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布摊趾,位于F島的核電站币狠,受9級特大地震影響游两,放射性物質(zhì)發(fā)生泄漏砾层。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一贱案、第九天 我趴在偏房一處隱蔽的房頂上張望肛炮。 院中可真熱鬧,春花似錦宝踪、人聲如沸侨糟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秕重。三九已至,卻和暖如春厉膀,著一層夾襖步出監(jiān)牢的瞬間溶耘,已是汗流浹背二拐。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留凳兵,地道東北人百新。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像庐扫,于是被迫代替她去往敵國和親饭望。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

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