Android UI 測(cè)試框架總結(jié)

1摊滔、簡(jiǎn)述

1.1 總結(jié):

Google官方推薦的UI測(cè)試有兩種:?jiǎn)螒?yīng)用界面測(cè)試Espresso和多應(yīng)用界面測(cè)試UI Automator (例如與系統(tǒng)應(yīng)用交互)。兩種都是基于JUnit測(cè)試框架實(shí)現(xiàn)的,通過Juit框架中的AndroidJUnitRunner運(yùn)行實(shí)現(xiàn)浪默,此測(cè)試運(yùn)行程序與 JUnit 3 和 JUnit 4(最高為 JUnit 4.10)測(cè)試兼容弦蹂,都是基于插樁(在實(shí)體設(shè)備和模擬器上運(yùn)行)的測(cè)試框架∈荩可以混合使用泪姨,亦可單獨(dú)使用,但鑒于兩者的差異饰抒、APK包容量增加肮砾、代碼維護(hù)的考量,需根據(jù)需求慎重選擇合適的測(cè)試框架方案袋坑。

1.2 Espresso 與UI Automator區(qū)別:

涵蓋單個(gè)應(yīng)用的界面測(cè)試(Espresso ):這種類型的測(cè)試可驗(yàn)證目標(biāo)應(yīng)用在用戶執(zhí)行特定操作或在其 Activity 中輸入特定內(nèi)容時(shí)的行為是否符合預(yù)期仗处。它可讓檢查目標(biāo)應(yīng)用是否返回正確的界面輸出來響應(yīng)應(yīng)用 Activity 中的用戶交互。單應(yīng)用界面測(cè)試框架可讓以編程方式模擬用戶操作枣宫,并測(cè)試復(fù)雜的應(yīng)用內(nèi)用戶交互疆柔。

涵蓋多個(gè)應(yīng)用的界面測(cè)試(UI Automator):這種類型的測(cè)試可驗(yàn)證不同用戶應(yīng)用之間交互或用戶應(yīng)用與系統(tǒng)應(yīng)用之間交互的正確行為。例如镶柱,可能想要測(cè)試相機(jī)應(yīng)用是否能夠與第三方社交媒體應(yīng)用或默認(rèn)的 Android 相冊(cè)應(yīng)用正確分享圖片旷档。支持跨應(yīng)用交互的界面測(cè)試框架可讓針對(duì)此類場(chǎng)景創(chuàng)建測(cè)試。

2歇拆、Espresso 測(cè)試框架

2.1簡(jiǎn)介

Espresso 測(cè)試框架是基于插樁的 API鞋屈,可與 AndroidJUnitRunner 測(cè)試運(yùn)行程序一起使用范咨。由 AndroidX Test 提供的 Espresso 測(cè)試框架提供了一些 API,用于編寫界面測(cè)試以模擬單個(gè)目標(biāo)應(yīng)用內(nèi)的用戶交互厂庇。Espresso 測(cè)試可以在搭載 Android 2.3.3(API 級(jí)別 10)及更高版本的設(shè)備上運(yùn)行渠啊。使用 Espresso 的主要好處在于,它可以自動(dòng)同步測(cè)試操作與正在測(cè)試的應(yīng)用的界面权旷。Espresso 會(huì)檢測(cè)主線程何時(shí)處于空閑狀態(tài)替蛉,以便可以在適當(dāng)?shù)臅r(shí)間運(yùn)行測(cè)試命令,從而提高測(cè)試的可靠性拄氯。此外躲查,借助該功能,不必在測(cè)試代碼中添加任何計(jì)時(shí)解決方法译柏,如 Thread.sleep()镣煮。

2.2設(shè)置 Espresso

在使用 Espresso 構(gòu)建界面測(cè)試之前,請(qǐng)務(wù)必設(shè)置對(duì) Espresso 庫的依賴項(xiàng)引用:

dependencies {

androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'

}

在測(cè)試設(shè)備上關(guān)閉動(dòng)畫 - 如果讓系統(tǒng)動(dòng)畫在測(cè)試設(shè)備上保持開啟狀態(tài)鄙麦,可能會(huì)導(dǎo)致意外結(jié)果或?qū)е聹y(cè)試失敗典唇。通過以下方式關(guān)閉動(dòng)畫:在“設(shè)置”中打開“開發(fā)者選項(xiàng)”,然后關(guān)閉以下所有選項(xiàng):窗口動(dòng)畫縮放胯府、過渡動(dòng)畫縮放介衔、Animator 時(shí)長(zhǎng)縮放

2.3創(chuàng)建 Espresso 測(cè)試類

如需創(chuàng)建 Espresso 測(cè)試,請(qǐng)遵循以下編程模型:

通過調(diào)用 onView() 方法或 AdapterView 控件的 onData() 方法骂因,在 Activity 中找到要測(cè)試的界面組件(例如夜牡,應(yīng)用中的登錄按鈕)。

通過調(diào)用 ViewInteraction.perform() 或 DataInteraction.perform()方法并傳入用戶操作(例如侣签,點(diǎn)擊登錄按鈕),模擬要在該界面組件上執(zhí)行的特定用戶交互急迂。如需對(duì)同一界面組件上的多項(xiàng)操作進(jìn)行排序影所,請(qǐng)?jiān)诜椒▍?shù)中使用逗號(hào)分隔列表將它們鏈接起來。

根據(jù)需要重復(fù)上述步驟僚碎,以模擬目標(biāo)應(yīng)用中跨多個(gè) Activity 的用戶流猴娩。

執(zhí)行這些用戶交互后,使用 ViewAssertions 方法檢查界面是否反映了預(yù)期的狀態(tài)或行為勺阐。

2.4 Espresso 與 ActivityTestRule 一起使用

下文介紹如何創(chuàng)建新的 JUnit 4 型 Espresso 測(cè)試卷中,并使用 ActivityTestRule 減少需要編寫的樣板代碼量。通過使用 ActivityTestRule渊抽,測(cè)試框架會(huì)在帶有 @Test 注釋的每個(gè)測(cè)試方法運(yùn)行之前以及帶有 @Before 注釋的所有方法運(yùn)行之前啟動(dòng)被測(cè) Activity蟆豫。該框架將在測(cè)試完成并且?guī)в?@After 注釋的所有方法都運(yùn)行后關(guān)閉該 Activity。

2.5訪問界面組件

必須先指定界面組件或視圖懒闷,然后 Espresso 才能與被測(cè)應(yīng)用進(jìn)行交互十减。Espresso 支持使用 Hamcrest 匹配器指定應(yīng)用中的視圖和適配器栈幸。

如需查看視圖,請(qǐng)調(diào)用 onView() 方法并傳入用于指定目標(biāo)視圖的視圖匹配器帮辟。指定視圖匹配器部分對(duì)此進(jìn)行了更詳細(xì)的說明速址。onView() 方法將返回一個(gè) ViewInteraction 對(duì)象,該對(duì)象允許測(cè)試與視圖進(jìn)行交互由驹。但是芍锚,如果希望在 RecyclerView 布局中查找視圖,調(diào)用 onView() 方法可能不起作用蔓榄。在這種情況下并炮,請(qǐng)按照在 AdapterView 中查找視圖中的說明進(jìn)行操作。

注意:onView() 方法不檢查指定的視圖是否有效润樱。相反渣触,Espresso 根據(jù)提供的匹配器僅搜索當(dāng)前視圖層次結(jié)構(gòu)。如果未找到匹配項(xiàng)壹若,該方法會(huì)拋出 NoMatchingViewException嗅钻。

2.6指定視圖匹配器

可以使用以下方法指定視圖匹配器:

調(diào)用 ViewMatchers 類中的方法。不能保證 Android 資源 ID 是唯一的店展。如果測(cè)試嘗試匹配由多個(gè)視圖使用的某個(gè)資源 ID养篓,Espresso 會(huì)拋出 AmbiguousViewMatcherException。

使用 Matchers 類赂蕴×可以使用 allOf() 方法組合多個(gè)匹配器,例如 containsString() 和 instanceOf()概说。此方法可讓更精細(xì)地過濾匹配結(jié)果碧注。可以使用 not 關(guān)鍵字過濾與匹配器不對(duì)應(yīng)的視圖糖赔,如需在測(cè)試中使用這些方法萍丐,請(qǐng)導(dǎo)入 org.hamcrest.Matchers 軟件包。如需詳細(xì)了解 Hamcrest 匹配放典,請(qǐng)?jiān)L問 Hamcrest 網(wǎng)站逝变。

如需提高 Espresso 測(cè)試的性能,請(qǐng)指定查找目標(biāo)視圖所需的最少匹配信息奋构。例如壳影,如果某個(gè)視圖可通過其描述性文本進(jìn)行唯一標(biāo)識(shí),無需指定該視圖也可從 TextView 實(shí)例分配弥臼。

2.7在 AdapterView 中查找視圖

在 AdapterView 微件中宴咧,視圖會(huì)在運(yùn)行時(shí)由子視圖動(dòng)態(tài)填充。如果要測(cè)試的目標(biāo)視圖位于 AdapterView(例如 ListView径缅、GridView 或 Spinner)內(nèi)悠汽,則 onView() 方法可能不起作用箱吕,因?yàn)橹荒軐⒁徊糠忠晥D加載到當(dāng)前視圖層次結(jié)構(gòu)中。

應(yīng)改為調(diào)用 onData()方法獲取 DataInteraction 對(duì)象柿冲,以訪問目標(biāo)視圖元素茬高。Espresso 負(fù)責(zé)將目標(biāo)視圖元素加載到當(dāng)前視圖層次結(jié)構(gòu)中。Espresso 還負(fù)責(zé)滾動(dòng)到目標(biāo)元素假抄,并將該元素置于焦點(diǎn)上怎栽。

注意:onData() 方法不檢查指定的項(xiàng)是否與視圖對(duì)應(yīng)。Espresso 僅搜索當(dāng)前視圖層次結(jié)構(gòu)宿饱。如果未找到匹配項(xiàng)熏瞄,該方法會(huì)拋出 NoMatchingViewException。

2.8執(zhí)行操作

調(diào)用 ViewInteraction.perform() 或 DataInteraction.perform() 方法谬以,以模擬界面組件上的用戶交互强饮。必須將一個(gè)或多個(gè) ViewAction 對(duì)象作為參數(shù)傳入。Espresso 將按照給定的順序依次觸發(fā)每項(xiàng)操作为黎,并在主線程中執(zhí)行這些操作邮丰。

ViewActions 類提供了用于指定常見操作的輔助程序方法的列表∶可以將這些方法用作方便的快捷方式剪廉,而不是創(chuàng)建和配置單個(gè) ViewAction 對(duì)象】婚荩可以指定以下操作:

ViewActions.click():點(diǎn)擊視圖斗蒋。

ViewActions.typeText():點(diǎn)擊視圖并輸入指定的字符串。

ViewActions.scrollTo():滾動(dòng)到視圖笛质。目標(biāo)視圖必須是由 ScrollView 派生的子類泉沾,并且其 android:visibility 屬性的值必須為 VISIBLE。對(duì)于擴(kuò)展 AdapterView 的視圖(例如 ListView)妇押,onData() 方法將負(fù)責(zé)為滾動(dòng)跷究。

ViewActions.pressKey():使用指定的鍵碼執(zhí)行按鍵操作。

ViewActions.clearText():清除目標(biāo)視圖中的文本舆吮。

如果目標(biāo)視圖位于 ScrollView 內(nèi),請(qǐng)先執(zhí)行 ViewActions.scrollTo() 操作以在屏幕中顯示該視圖队贱,然后再繼續(xù)執(zhí)行其他操作色冀。如果已顯示該視圖,則 ViewActions.scrollTo() 操作將不起作用柱嫌。

2.9使用 Espresso Intent 單獨(dú)測(cè)試 Activity

Espresso Intent 支持對(duì)應(yīng)用發(fā)出的 intent 進(jìn)行驗(yàn)證和打樁锋恬。使用 Espresso Intent,可以通過以下方式單獨(dú)測(cè)試應(yīng)用编丘、Activity 或服務(wù):攔截傳出 intent与学,對(duì)結(jié)果進(jìn)行打樁彤悔,然后將其發(fā)送回被測(cè)組件。

如需開始使用 Espresso Intent 進(jìn)行測(cè)試索守,需要將以下代碼行添加到應(yīng)用的 build.gradle 文件中:

dependencies {

androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.0'

}

如需測(cè)試 intent晕窑,需要?jiǎng)?chuàng)建 IntentsTestRule 類(與 ActivityTestRule 類非常相似)的實(shí)例。IntentsTestRule 類會(huì)在每次測(cè)試前初始化 Espresso Intent卵佛,終止托管 Activity杨赤,并在每次測(cè)試后釋放 Espresso Intent。

2.10使用 Espresso Web 測(cè)試 WebView

使用 Espresso Web截汪,可以測(cè)試包含在 Activity 中的 WebView 組件疾牲。它使用 WebDriver API 檢查和控制 WebView 的行為。

如需開始使用 Espresso Web 進(jìn)行測(cè)試衙解,需要將以下代碼行添加到應(yīng)用的 build.gradle 文件中:

dependencies {

androidTestImplementation 'androidx.test.espresso:espresso-web:3.1.0'

}

在使用 Espresso Web 創(chuàng)建測(cè)試的過程中阳柔,當(dāng)實(shí)例化 ActivityTestRule 對(duì)象以測(cè)試 Activity 時(shí),需要在 WebView 上啟用 JavaScript蚓峦。在測(cè)試中舌剂,可以選擇 WebView 中顯示的 HTML 元素并模擬用戶交互,例如在文本框中輸入文本枫匾,然后點(diǎn)擊某個(gè)按鈕架诞。完成這些操作后,可以驗(yàn)證網(wǎng)頁上的結(jié)果是否與預(yù)期結(jié)果一致干茉。

2.11驗(yàn)證結(jié)果

調(diào)用 ViewInteraction.check() 或 DataInteraction.check() 方法以斷言界面中的視圖與某種預(yù)期狀態(tài)匹配谴忧。必須將 ViewAssertion 對(duì)象作為參數(shù)傳入。如果斷言失敗角虫,Espresso 會(huì)拋出 AssertionFailedError沾谓。

ViewAssertions 類提供了用于指定常見斷言的輔助程序方法的列表。

可以使用的斷言包括:

doesNotExist:斷言當(dāng)前視圖層次結(jié)構(gòu)中沒有符合指定條件的視圖戳鹅。

matches:斷言當(dāng)前視圖層次結(jié)構(gòu)中存在指定的視圖均驶,并且其狀態(tài)與某個(gè)給定的 Hamcrst 匹配器匹配。

selectedDescendentsMatch:斷言存在父視圖的指定子視圖枫虏,并且其狀態(tài)與某個(gè)給定的 Hamcrst 匹配器匹配妇穴。

2.12在設(shè)備或模擬器上運(yùn)行 Espresso 測(cè)試

可以通過 Android Studio 或命令行運(yùn)行 Espresso 測(cè)試。請(qǐng)務(wù)必在項(xiàng)目中將 AndroidJUnitRunner 指定為默認(rèn)插樁測(cè)試運(yùn)行程序隶债。

如需運(yùn)行 Espresso 測(cè)試腾它,請(qǐng)按照測(cè)試入門中所述的插樁測(cè)試運(yùn)行步驟進(jìn)行操作。

見文檔:https://developer.android.google.cn/training/testing/unit-testing/instrumented-unit-tests?hl=zh-cn#run

3死讹、UI Automator 測(cè)試框架

3.1簡(jiǎn)介

UI Automator 測(cè)試框架是基于插樁的 API瞒滴,可與 AndroidJUnitRunner 測(cè)試運(yùn)行程序一起使用。通過涉及多個(gè)應(yīng)用中的用戶交互的界面測(cè)試,可以驗(yàn)證當(dāng)用戶流跨入其他應(yīng)用或系統(tǒng)界面時(shí)妓忍,的應(yīng)用是否能夠正常運(yùn)行虏两。短信應(yīng)用就是此類用戶流的一個(gè)例子,該應(yīng)用先讓用戶輸入短信世剖,再啟動(dòng) Android 聯(lián)系人選擇器定罢,以便用戶可以選擇短信的收件人,然后將控制權(quán)返還給原來的應(yīng)用搁廓,以便用戶提交短信引颈。

使用 AndroidX Test 提供的 UI Automator 測(cè)試框架來編寫此類界面測(cè)試。通過 UI Automator API境蜕,可以與設(shè)備上的可見元素進(jìn)行交互蝙场,而不管焦點(diǎn)在哪個(gè) Activity 上。的測(cè)試可以使用方便的描述符(如顯示在相應(yīng)組件中的文本或其內(nèi)容描述)來查找界面組件粱年。UI Automator 測(cè)試可以在搭載 Android 4.3(API 級(jí)別 18)或更高版本的設(shè)備上運(yùn)行售滤。

3.2設(shè)置 UI Automator

在使用 UI Automator 構(gòu)建界面測(cè)試之前,請(qǐng)務(wù)必配置測(cè)試源代碼位置和項(xiàng)目依賴項(xiàng)台诗,如針對(duì) AndroidX Test 設(shè)置項(xiàng)目中所述完箩。

在 Android 應(yīng)用模塊的 build.gradle 文件中,必須設(shè)置對(duì) UI Automator 庫的依賴項(xiàng)引用:

dependencies {

...

androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'

}

要優(yōu)化 UI Automator 測(cè)試拉队,應(yīng)先檢查目標(biāo)應(yīng)用的界面組件并確保它們可訪問弊知。這些優(yōu)化提示將在接下來的兩部分中進(jìn)行介紹。

3.3檢查設(shè)備上的界面

在設(shè)計(jì)測(cè)試之前粱快,請(qǐng)先檢查設(shè)備上可見的界面組件秩彤。要確保 UI Automator 測(cè)試可以訪問這些組件,請(qǐng)檢查這些組件是否具有可見文本標(biāo)簽和/或 android:contentDescription 值事哭。

uiautomatorviewer 工具提供了一個(gè)方便的可視界面漫雷,用于檢查布局層次結(jié)構(gòu)以及查看在設(shè)備前臺(tái)顯示的界面組件的屬性。利用此信息鳍咱,可以使用 UI Automator 創(chuàng)建更精細(xì)的測(cè)試降盹。例如,可以創(chuàng)建與特定可見屬性匹配的界面選擇器谤辜。

要啟動(dòng) uiautomatorviewer 工具蓄坏,請(qǐng)執(zhí)行以下操作:

在實(shí)體設(shè)備上啟動(dòng)目標(biāo)應(yīng)用。

將設(shè)備連接到開發(fā)機(jī)器丑念。

打開終端窗口并導(dǎo)航至 <android-sdk>/tools/ 目錄涡戳。

使用以下命令運(yùn)行該工具:

$ uiautomatorviewer

如需查看應(yīng)用的界面屬性,請(qǐng)執(zhí)行以下操作:

在 uiautomatorviewer 界面中渠欺,點(diǎn)擊 Device Screenshot 按鈕妹蔽。

將鼠標(biāo)懸停在左側(cè)面板中的快照上椎眯,以查看 uiautomatorviewer 工具識(shí)別的界面組件挠将。右下方的面板中列出了屬性胳岂,右上方的面板中列出了布局層次結(jié)構(gòu)。

(可選)點(diǎn)擊 Toggle NAF Nodes 按鈕舔稀,以查看 UI Automator 無法訪問的界面組件乳丰。對(duì)于這些組件,系統(tǒng)顯示的相關(guān)信息可能很有限内贮。

3.4確保 Activity 可訪問

UI Automator 測(cè)試框架在已實(shí)現(xiàn) Android 無障礙功能的應(yīng)用上效果更好产园。當(dāng)使用類型為 View 或 SDK 中的 View 的子類的界面元素時(shí),無需實(shí)現(xiàn)無障礙功能支持夜郁,因?yàn)檫@些類已經(jīng)為實(shí)現(xiàn)了這項(xiàng)支持什燕。

不過,某些應(yīng)用會(huì)使用自定義界面元素來提供更豐富的用戶體驗(yàn)竞端。此類元素不會(huì)提供自動(dòng)無障礙功能支持屎即。如果的應(yīng)用包含不是 SDK 中的 View 的子類的實(shí)例,請(qǐng)務(wù)必向這些元素添加無障礙功能事富,具體操作步驟如下:

創(chuàng)建一個(gè)擴(kuò)展 ExploreByTouchHelper 的具體類技俐。

通過調(diào)用 setAccessibilityDelegate(),將新類的實(shí)例與特定自定義界面元素相關(guān)聯(lián)统台。

如需獲得有關(guān)向自定義視圖元素添加無障礙功能的其他指導(dǎo)雕擂,請(qǐng)參閱構(gòu)建無障礙自定義視圖。如需詳細(xì)了解 Android 平臺(tái)上無障礙功能的常規(guī)最佳做法贱勃,請(qǐng)參閱改進(jìn)應(yīng)用的無障礙功能井赌。

3.5創(chuàng)建 UI Automator 測(cè)試類

UI Automator 測(cè)試類的編寫方式應(yīng)與 JUnit 4 測(cè)試類相同。如需詳細(xì)了解如何創(chuàng)建 JUnit 4 測(cè)試類以及如何使用 JUnit 4 斷言和注釋募寨,請(qǐng)參閱創(chuàng)建插樁單元測(cè)試類族展。

在測(cè)試類定義的開頭添加 @RunWith(AndroidJUnit4.class) 注釋。還需要將 AndroidX Test 中提供的 AndroidJUnitRunner 類指定為默認(rèn)測(cè)試運(yùn)行程序拔鹰。在設(shè)備或模擬器上運(yùn)行 UI Automator 測(cè)試部分對(duì)此步驟進(jìn)行了更詳細(xì)的說明仪缸。

在 UI Automator 測(cè)試類中實(shí)現(xiàn)以下編程模型:

通過調(diào)用 getInstance() 方法并將 Instrumentation 對(duì)象作為參數(shù)傳遞給該方法,獲取 UiDevice 對(duì)象以訪問要測(cè)試的設(shè)備列肢。

通過調(diào)用 findObject() 方法恰画,獲取 UiObject 對(duì)象以訪問設(shè)備上顯示的界面組件(例如,前臺(tái)的當(dāng)前視圖)瓷马。

通過調(diào)用 UiObject 方法拴还,模擬需要在該界面組件上執(zhí)行的特定用戶交互;例如欧聘,調(diào)用 performMultiPointerGesture() 以模擬多點(diǎn)觸控手勢(shì)片林,以及調(diào)用 setText() 以修改文本字段。可以根據(jù)需要反復(fù)調(diào)用第 2 步和第 3 步中的 API费封,以測(cè)試涉及多個(gè)界面組件或用戶操作序列的更復(fù)雜的用戶交互焕妙。

執(zhí)行這些用戶交互后,檢查界面是否反映了預(yù)期的狀態(tài)或行為弓摘。

下面幾部分更詳細(xì)地介紹了這些步驟焚鹊。

3.6訪問界面組件

UiDevice 對(duì)象是訪問和操縱設(shè)備狀態(tài)的主要方式。在測(cè)試中韧献,可以調(diào)用 UiDevice 方法檢查各種屬性的狀態(tài)末患,如當(dāng)前屏幕方向或顯示屏尺寸。的測(cè)試可以使用 UiDevice 對(duì)象執(zhí)行設(shè)備級(jí)操作锤窑,如強(qiáng)制設(shè)備進(jìn)行特定旋轉(zhuǎn)璧针、按方向鍵硬件按鈕,以及按主屏幕和菜單按鈕渊啰。

最好從設(shè)備的主屏幕開始測(cè)試陈莽。在主屏幕(或在設(shè)備中選擇的其他某個(gè)起始位置)上,可以調(diào)用 UI Automator API 提供的方法虽抄,以選擇特定的界面元素并與之交互走搁。

在某些情況測(cè)試中,例如@SdkSuppress(minSdkVersion = 18) 語句有助于確保測(cè)試只能在搭載 Android 4.3(API 級(jí)別 18)或更高版本的設(shè)備上運(yùn)行(根據(jù) Android Automator 框架的要求)迈窟。

使用 findObject() 方法檢索 UiObject私植,它表示符合給定選擇器條件的視圖〕岛ǎ可以根據(jù)需要重復(fù)使用已在應(yīng)用測(cè)試的其他部分中創(chuàng)建的 UiObject 實(shí)例曲稼。請(qǐng)注意,每當(dāng)?shù)臏y(cè)試使用 UiObject 實(shí)例以點(diǎn)擊界面元素或查詢屬性時(shí)湖员,UI Automator 測(cè)試框架都會(huì)在當(dāng)前顯示內(nèi)容中搜索匹配項(xiàng)贫悄。

3.7指定選擇器

如果需要訪問應(yīng)用中的特定界面組件,請(qǐng)使用 UiSelector 類娘摔。此類表示對(duì)當(dāng)前顯示的界面中特定元素的查詢窄坦。

如果找到了多個(gè)匹配元素,系統(tǒng)會(huì)將布局層次結(jié)構(gòu)中的第一個(gè)匹配元素作為目標(biāo) UiObject 返回凳寺。構(gòu)建 UiSelector 時(shí)鸭津,可以將多個(gè)屬性鏈接在一起以優(yōu)化搜索。如果未找到匹配的界面元素肠缨,系統(tǒng)會(huì)拋出 UiAutomatorObjectNotFoundException逆趋。

可以使用 childSelector() 方法來嵌套多個(gè) UiSelector 個(gè)實(shí)例。

最佳做法是晒奕,在指定選擇器時(shí)闻书,應(yīng)使用資源 ID(如果已將其分配給界面元素)名斟,而不是文本元素或內(nèi)容描述符。并非所有元素都有文本元素(例如魄眉,工具欄中的圖標(biāo))蒸眠。文本選擇器很脆弱,如果界面發(fā)生細(xì)微更改杆融,可能會(huì)導(dǎo)致測(cè)試失敗。此外霜运,文本選擇器也可能無法在不同語言之間擴(kuò)展脾歇,它們可能與翻譯的字符串不匹配。

在選擇器條件中指定對(duì)象狀態(tài)可能很有用淘捡。例如藕各,如果要選擇所有已選中元素的列表以便取消選中這些元素,請(qǐng)調(diào)用 checked() 方法并將參數(shù)設(shè)置為 true焦除。

3.8執(zhí)行操作

的測(cè)試獲取 UiObject 對(duì)象后激况,可以調(diào)用 UiObject 類中的方法,在由該對(duì)象表示的界面組件上執(zhí)行用戶交互膘魄∥谥穑可以指定如下操作:

click():點(diǎn)擊界面元素的可見邊界的中心。

dragTo():將此對(duì)象拖動(dòng)到任意坐標(biāo)创葡。

setText():清除可修改字段的內(nèi)容后浙踢,設(shè)置該字段中的文本。相反灿渴,clearTextField() 方法用于清除可修改字段中的現(xiàn)有文本洛波。

swipeUp():對(duì) UiObject 執(zhí)行向上滑動(dòng)操作。同樣骚露,swipeDown()蹬挤、swipeLeft() 和 swipeRight() 方法用于執(zhí)行相應(yīng)的操作。

通過 UI Automator 測(cè)試框架棘幸,可以發(fā)送 Intent 或啟動(dòng) Activity焰扳,無需使用 shell 命令,只需通過 getContext() 獲取 Context 對(duì)象即可误续。

3.8.1對(duì)集合執(zhí)行操作

如果需要模擬內(nèi)容集合(例如蓝翰,音樂專輯中的歌曲或收件箱中的電子郵件列表)上的用戶交互,請(qǐng)使用 UiCollection 類女嘲。要?jiǎng)?chuàng)建 UiCollection 對(duì)象畜份,請(qǐng)指定 UiSelector,用于搜索其他子界面元素的界面容器或封裝容器欣尼,如包含子界面元素的布局視圖爆雹。

3.8.2對(duì)可滾動(dòng)視圖執(zhí)行操作

使用 UiScrollable 類模擬顯示屏上的垂直或水平滾動(dòng)停蕉。當(dāng)界面元素位于屏幕外而需要滾動(dòng)屏幕以使其進(jìn)入視野時(shí),此方法很有用钙态。

3.9驗(yàn)證結(jié)果

InstrumentationTestCase 擴(kuò)展了 TestCase慧起,因此可以使用標(biāo)準(zhǔn)的 JUnit Assert 方法測(cè)試應(yīng)用中的界面組件是否會(huì)返回預(yù)期結(jié)果。

3.10在設(shè)備或模擬器上運(yùn)行 UI Automator 測(cè)試

可以通過 Android Studio 或命令行運(yùn)行 UI Automator 測(cè)試册倒。請(qǐng)務(wù)必在項(xiàng)目中將 AndroidJUnitRunner 指定為默認(rèn)插樁測(cè)試運(yùn)行程序蚓挤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市驻子,隨后出現(xiàn)的幾起案子灿意,更是在濱河造成了極大的恐慌,老刑警劉巖崇呵,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缤剧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡域慷,警方通過查閱死者的電腦和手機(jī)荒辕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犹褒,“玉大人抵窒,你說我怎么就攤上這事〉铮” “怎么了估脆?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)座云。 經(jīng)常有香客問我疙赠,道長(zhǎng),這世上最難降的妖魔是什么朦拖? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任圃阳,我火速辦了婚禮,結(jié)果婚禮上璧帝,老公的妹妹穿的比我還像新娘捍岳。我一直安慰自己,他們只是感情好睬隶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布锣夹。 她就那樣靜靜地躺著,像睡著了一般苏潜。 火紅的嫁衣襯著肌膚如雪银萍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天恤左,我揣著相機(jī)與錄音贴唇,去河邊找鬼搀绣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛戳气,可吹牛的內(nèi)容都是我干的链患。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瓶您,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼麻捻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呀袱,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤贸毕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后压鉴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锻拘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年油吭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片署拟。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婉宰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出推穷,到底是詐尸還是另有隱情心包,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布馒铃,位于F島的核電站蟹腾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏区宇。R本人自食惡果不足惜娃殖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望议谷。 院中可真熱鬧炉爆,春花似錦、人聲如沸卧晓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逼裆。三九已至郁稍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胜宇,已是汗流浹背艺晴。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工昼钻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人封寞。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓然评,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親狈究。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碗淌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354