Android Testing support Library 提供了一個(gè)強(qiáng)大的Android 應(yīng)用測(cè)試框架捣域。 library提供了一系列用以快速建立和運(yùn)行測(cè)試代碼的APIs焕梅,包括Junit4 和 功能性UI測(cè)試贞言。支持從IDE或者命令行來(lái)使用這些APIs该窗。
獲仍橄肌: 通過(guò)Android SDK Manager (Testing Support Library Setup)
這篇文章的主要內(nèi)容:
- 說(shuō)明了Android Testing Support Library 提供了哪些工具用以測(cè)試
- 如何在你的測(cè)試環(huán)境中使用AndroidTestRunner
- 關(guān)于支持庫(kù)的發(fā)布信息
測(cè)試支持庫(kù) 的 特性說(shuō)明
Android 測(cè)試支持庫(kù)包含以下自動(dòng)化測(cè)試工具:
- AndroidJUnitRunner: Android 上使用的兼容Junit4 的Test Runner
- Espresso: UI測(cè)試框架级零;適用于應(yīng)用內(nèi)功能性UI測(cè)試(functional UI testing)
- UI Automator: UI測(cè)試框架滞乙;適用于跨APP 的功能性UI測(cè)試斩启,跨越的APP既可以是第三方APP,也可以是系統(tǒng)APP
AndroidJUnitRunner
AndroidJUnitRunner
類是一個(gè) JUnit 測(cè)試Runner发绢,它允許你在Android 設(shè)備上運(yùn)行JUnit4 或JUnit3 風(fēng)格的測(cè)試類,這些測(cè)試類同時(shí)也包含那些使用Espresso 和 UI Automator 測(cè)試框架建立的測(cè)試類经柴。 AndroidJUnitTestRunner 能安裝測(cè)試包和被測(cè)APP 到設(shè)備坯认,并且運(yùn)行測(cè)試牛哺,報(bào)告測(cè)試結(jié)果∫螅現(xiàn)在AndroidJUnitTestRunner 已經(jīng)取代了只支持Junit3測(cè)試的InstrumentationTestRunner 的測(cè)試類淳附。
AndroidJUnitTestRunner的主要功能包括:
- JUnit support - Junit支持
- Access to instrumentation information - 獲取 Instrumention信息
- Test filtering - 測(cè)試過(guò)濾
- Test sharding - 測(cè)試分片
注: AndroidJUnitTestRunner 要求Android2.2(API level 8) 或者更高級(jí)別
JUnit 支持
AndroidJUnitTestRunner兼容JUnit3和JUnit4測(cè)試(最高支持到4.10)燃观。但是缆毁,你最好避免將JUnit3 和 JUnit4 的測(cè)試代碼放在同一個(gè)包下面脊框,這將會(huì)導(dǎo)致不可預(yù)期的結(jié)果浇雹。注意如果你正在創(chuàng)建一個(gè)Instrumented JUnit4 測(cè)試類屿讽,那么你必須在測(cè)試類上使用@RunWith(AndroidJUnit4.class)
注解伐谈。
下面的代碼片段展示了一個(gè)使用JUnit4 風(fēng)格的Instrumented 測(cè)試來(lái)驗(yàn)證CalculatorActivity 的 add 方法是否正常運(yùn)行诵棵。
import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.AndroidJUnitRunner;
import android.test.ActivityInstrumentationTestCase2;
@RunWith(AndroidJUnit4.class)
public class CalculatorInstrumentationTest
extends ActivityInstrumentationTestCase2<CalculatorActivity> {
@Before
public void setUp() throws Exception {
super.setUp();
// Injecting the Instrumentation instance is required
// for your test to run with AndroidJUnitRunner.
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
mActivity = getActivity();
}
@Test
public void typeOperandsAndPerformAddOperation() {
// Call the CalculatorActivity add() method and pass in some operand values, then
// check that the expected value is returned.
}
@After
public void tearDown() throws Exception {
super.tearDown();
}
}
訪問(wèn)instrumentation 信息
你可以使用 InstrumentationRegistry 類來(lái)獲取和你運(yùn)行的測(cè)試有關(guān)的信息嘶窄。 這個(gè)類包含 Instrumentation
對(duì)象、目標(biāo)App 的 Context 對(duì)象吻谋、測(cè)試App 的Context以及傳遞到你的測(cè)試的命令行參數(shù)羊初。 當(dāng)你使用UI Automator 框架編寫依賴于Instrumentation 或者 Context 對(duì)象的測(cè)試用例時(shí)长赞,這些信息將會(huì)非常有用得哆。
測(cè)試過(guò)濾(Test filtering)
在你的JUnit 4.x 的測(cè)試中哟旗,你可以使用一些注解來(lái)配置運(yùn)行的測(cè)試。 這些功能可以最大限度的減少你往測(cè)試代碼中添加模板和條件代碼的工作量饱亮。 在標(biāo)準(zhǔn)的JUnit 4 注解之外近上,AndroidJUnitTestRunner 還支持以下Android特有的注解:
- @RequiresDevice: 指定改測(cè)試只在物理設(shè)備上運(yùn)行(而不是模擬器)
-
@SdkSupress: 禁止測(cè)試在低于給定API 級(jí)別的設(shè)備上運(yùn)行壹无。例如斗锭,禁止運(yùn)行在API level低于18 的設(shè)備上運(yùn)行時(shí)可以你寫
SDKSupress(minSdkVersion=18)
測(cè)試分片 (Test sharding)
AndroidJUnitTestRunner 支持將一個(gè)測(cè)試套件(test suite) 分割成多個(gè)測(cè)試片岖是,這樣你就可以將屬于同一個(gè)測(cè)試片的測(cè)試當(dāng)做一個(gè)組一起運(yùn)行实苞, 當(dāng)然硬梁,這些測(cè)試用例必須在同一個(gè)Instrumentation 實(shí)例下面荧止。(阶剑,under the same Instumentation). 每個(gè)測(cè)試片使用一個(gè)數(shù)字索引標(biāo)記牧愁。在運(yùn)行測(cè)試時(shí)猪半,可以使用 -e numShards
選項(xiàng)來(lái)指定要?jiǎng)?chuàng)建多少個(gè)測(cè)試片偷线,使用 -e shardIndex
選項(xiàng)來(lái)指定要運(yùn)行哪一個(gè)片的測(cè)試用例声邦。
例如亥曹,為了將測(cè)試套件(test suite) 分割成為10片媳瞪,并且只運(yùn)行位于第二片的測(cè)試,你可以使用一下命令:
adb shell am instrument -w -e numShards 10 -e shardIndex 2
你可以通過(guò)查看 API reference 來(lái)了解更多關(guān)于如何使用Android test runner 的信息句葵。
Espresso 框架
Espresso 測(cè)試框架提供了一系列的APIS 用來(lái)構(gòu)建單個(gè)應(yīng)用內(nèi)測(cè)試用戶交互的UI測(cè)試用例笼呆。 它非常使用來(lái)了編寫白盒類型的自動(dòng)化測(cè)試用例诗赌,因?yàn)镋spresso測(cè)試代碼必須了解實(shí)現(xiàn)代碼的細(xì)節(jié)铭若。
Espresso 測(cè)試框架的主要特性包括:
- 一套豐富的視圖和適配器(View and Adapter)匹配API递览。 查看 View matching 以了解更多信息。
- 一套用以進(jìn)行自動(dòng)化UI交互的action APIs绞铃。 查看 Action APIs 以了解更多儿捧。
- 用以提高測(cè)試可信度 的 UI 線程同步機(jī)制挑宠,查看 UI thread synchronization 以獲取更多信息各淀。
注: 需要Android2.2(API level 8) 或者更高版本
View matching
Espresso.onView()
使得你可以訪問(wèn)目標(biāo)app 里的UI 組件并且與之交互碎浇。 該方法接收一個(gè)Matcher
參數(shù)奴璃,然后在視圖層次樹(shù)中定位到匹配到的對(duì)應(yīng)的View實(shí)例溺健。你可以使用的匹配條件有:
- view 的類名
- view 的 content description
- view 的
R.id
- view 上顯示的文本
例如,為了定位到一個(gè)ID 為 my_button
的按鈕剖膳,你可以指定如下的matcher:
onView(withId(R.id.my_button));
如果搜索成功吱晒,onView() 方法就會(huì)返回該View 的一個(gè)引用仑濒,然后你就可以執(zhí)行actions 并且測(cè)試是否符合預(yù)期
Adapter matching - 適配器匹配
在一個(gè) AdapterView
的布局中墩瞳,布局是在運(yùn)行時(shí)動(dòng)態(tài)改變的喉酌。如果目標(biāo)View 位于一個(gè)AdapterView 的子類中(如 ListView
或者 GridView)泪电,因?yàn)楫?dāng)前的視圖層次中只加載了一部分布局View相速,那么onView() 方法將無(wú)法工作。
這時(shí)苫拍,你就可以使用 Espresso.onData()
方法來(lái)查找目標(biāo)View 。該方法會(huì)返回AdapterView中的一個(gè)元素浆洗,然后你可以在該元素上進(jìn)行 用戶操作模擬和斷言(assertions)操作。
Action APIs
一般你都是通過(guò)在你的app 的用戶界面進(jìn)行一些操作以測(cè)試你的應(yīng)用塔淤。而使用ViewActions
API 你將可以非常容易的自動(dòng)化這些交互操作。 使用這些API 你可以執(zhí)行的UI操作如下:
- View click = 視圖點(diǎn)擊
- Swipe = 滑動(dòng)
- Key and button presses = 按壓按鍵和按鈕
- Typing test = 輸入文字
- Opeing a link =打開(kāi)一個(gè)鏈接
例如聪黎,你可以編寫一個(gè)測(cè)試腳本來(lái)模擬輸入一個(gè)字符串并且按下一個(gè)按鈕來(lái)提交輸入的值的幾個(gè)動(dòng)作。 ViewInteraction.perform()
和 DataInteraction.perform()
接受一個(gè)或多個(gè)ViewAction
參數(shù)喉镰,并且按照提供他們的次序依次執(zhí)行這些動(dòng)作侣姆。
// Type text into an EditText view, then close the soft keyboard
onView(withId(R.id.editTextUserInput))
.perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard());
// Press the button to submit the text change
onView(withId(R.id.changeTextBt)).perform(click());
UI 線程同步
運(yùn)行與android設(shè)備的測(cè)試經(jīng)常會(huì)因?yàn)闀r(shí)間問(wèn)題而隨機(jī)失敗捺宗。 這個(gè)問(wèn)題 稱之為 test flakiness蚜厉。 在使用 Espresso之前弯囊,解決辦法是在測(cè)試代碼讓測(cè)試sleep 足夠長(zhǎng)的時(shí)間匾嘱,或者加入一個(gè)足夠長(zhǎng)的超時(shí)時(shí)間又或者添加失敗時(shí)不停嘗試的代碼霎烙。 然而游昼,Espresso 測(cè)試框架替你處理了Instrumentation
和 UI 線程間的同步問(wèn)題尝蠕,這將是你的測(cè)試action和測(cè)試斷言更加具有可信度廊佩。
學(xué)習(xí) API reference 和 Testing UI for a Single App 以了解更多.
說(shuō)明:1. 所有鏈接指向原始鏈接标锄; 2 . 部分名詞保留英文