摘要:檢查操作的結(jié)果是否符合預(yù)期。大家在實(shí)際編寫(xiě)自動(dòng)化測(cè)試腳本時(shí)可以靈活選用。
到目前為止,我們已經(jīng)完成了對(duì)Espresso的介紹。從之前的文章我們可以看到,Espresso對(duì)Android APP的自動(dòng)化測(cè)試提供了一系列非常強(qiáng)大的工具和方法。
現(xiàn)在試想這樣一個(gè)場(chǎng)景:我們?cè)贏PP中有一個(gè)更改頭像的功能,此時(shí)我們需要調(diào)用系統(tǒng)相機(jī)進(jìn)行拍照,然后再回到APP提交拍好的照片。在這種場(chǎng)景下,我們需要從自己的APP跳轉(zhuǎn)到其他的APP,而這種跳轉(zhuǎn)的交互在產(chǎn)品中是經(jīng)常會(huì)發(fā)生的。
Espresso并沒(méi)有對(duì)這種跨APP的交互測(cè)試提供支持。我們無(wú)法在腳本中通過(guò)Espresso獲取到非自己APP之外其他APP(或者系統(tǒng)界面)的UI組件。這時(shí),我們就需要用到Android提供的UI Automator來(lái)進(jìn)行自動(dòng)化測(cè)試。
配置想要使用UI Automator,只需要添加如下依賴(lài):
dependencies { ... androidTestCompile "com.android.support.test.uiautomator:uiautomator-v18:2.1.1" }
UI Automator僅支持Android 4.3(API Level 18)及以上版本。
可行性探索在使用UI Automator編寫(xiě)測(cè)試腳本之前,我們需要對(duì)當(dāng)前測(cè)試用例是否可以用UI Automator進(jìn)行測(cè)試做一些探索。簡(jiǎn)單來(lái)說(shuō),就是要確保我們需要的界面元素是否都能找到、希望出發(fā)的操作是否都支持。
確定可行性的方法也很簡(jiǎn)單,只要確保我們需要操作的UI元素有可以進(jìn)行匹配的屬性(這一點(diǎn)類(lèi)似于Espresso),比如唯一的ID,text等等。我們可以按照該系列第四篇對(duì)uiautomatorviewer的介紹來(lái)使用Android提供的uiautomatorviewer工具,對(duì)測(cè)試用例中的各個(gè)頁(yè)面,尤其是跨APP交互的頁(yè)面中的各個(gè)UI元素進(jìn)行分析,確保每個(gè)我們需要操作的元素都有相應(yīng)可以匹配的屬性值,以便于我們可以通過(guò)腳本找到相應(yīng)的元素。
對(duì)此,Android官方對(duì)我們開(kāi)發(fā)者也提出了一些針對(duì)自動(dòng)化測(cè)試的建議,便于我們?cè)陂_(kāi)發(fā)時(shí)采用:
對(duì)于ImageView, ImageButton, CheckBox這些控件,對(duì)其設(shè)置android:contentDescription屬性。
對(duì)于EditText,設(shè)置其android:hint屬性。
對(duì)于其他有交互作用但沒(méi)有顯式文本的控件(比方說(shuō)可以點(diǎn)擊的icon之類(lèi)),設(shè)置其android:hint屬性。
以上這些建議的目的,無(wú)非就是可以讓我們通過(guò)自動(dòng)化測(cè)試API去找到頁(yè)面上的控件。
UI Automator測(cè)試流程使用UI Automator進(jìn)行腳本編寫(xiě)的一些前置條件和Espresso基本類(lèi)似,實(shí)際上,我們基于之前幾篇文章的配置就可以直接進(jìn)行UI Automator的編寫(xiě)。
采用UI Automator的過(guò)程如下:
獲得一個(gè)UiDevice對(duì)象,代表我們正在執(zhí)行測(cè)試的設(shè)備。該對(duì)象可以通過(guò)一個(gè)getInstance()方法獲取,入?yún)橐粋€(gè)Instrumentation對(duì)象:
UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
通過(guò)findObject()方法獲取到一個(gè)UiObject對(duì)象,代表我們需要執(zhí)行測(cè)試的UI組件。
對(duì)該UI組件執(zhí)行一系列操作。
檢查操作的結(jié)果是否符合預(yù)期。
整個(gè)流程和Espresso基本類(lèi)似,除了增加了第一項(xiàng):首先獲得一個(gè)UiDevice對(duì)象。這一點(diǎn)也容易理解,為了要支持跨APP的測(cè)試,我們就不能只從APP層面而是需要從整個(gè)設(shè)備層面來(lái)進(jìn)行測(cè)試了,因此也是首先需要獲取設(shè)備對(duì)象,再執(zhí)行相關(guān)的操作。
獲取UI組件根據(jù)如上所說(shuō),我們是通過(guò)UiDevice來(lái)調(diào)用findObject()方法來(lái)獲取到我們想要執(zhí)行操作的UI組件。我們來(lái)看一下這個(gè)方法的聲明:
/** * Returns a UiObject which represents a view that matches the specified selector criteria. * * @param selector * @return UiObject object */ public UiObject findObject(UiSelector selector) { return new UiObject(this, selector); }
從如上聲明可以看出,findObject()方法接受了一個(gè)UiSelector對(duì)象,返回了我們需要的UiObject對(duì)象。在這里,UiSelector類(lèi)似于Espresso中的Matcher,也是指定了某種匹配規(guī)則,UI Automator會(huì)按照UiSelector指定的規(guī)則從當(dāng)前UI上進(jìn)行控件的查找。不同于Espresso的是,如果找到多個(gè)滿(mǎn)足規(guī)則的控件,則會(huì)返回第一個(gè)控件。如果沒(méi)有控件滿(mǎn)足當(dāng)前指定的規(guī)則,則會(huì)拋出一個(gè)UiAutomatorObjectNotFoundException異常。
和Espresso類(lèi)似,我們可以通過(guò)ID、text等屬性來(lái)進(jìn)行控件的查找,同時(shí)也可以指定目標(biāo)控件的類(lèi)型??梢灾付ㄒ粋€(gè)規(guī)則,也可以通過(guò)鏈?zhǔn)秸{(diào)用指定多個(gè)規(guī)則。比如:
UiObject mCameraSureBtn = mDevice.findObject(new UiSelector().resourceId("com.android.camera:id/v6_btn_done") .className("android.widget.ImageView"));
這行代碼的UiSelector構(gòu)建就是采用了如下兩個(gè)組合規(guī)則:
控件ID為"com.android.camera:id/v6_btn_done",這個(gè)ID是從某個(gè)MIUI版本系統(tǒng)的系統(tǒng)相機(jī)獲取的,對(duì)應(yīng)于拍照按鈕;
控件類(lèi)型為ImageView。
除了UiObject之外,UI Automator還提供了其他的UI對(duì)象,比如UiCollection對(duì)象可以對(duì)一組控件之間進(jìn)行操作,對(duì)布局之間的包含關(guān)系做了支持;比如UiScrollable對(duì)象支持了對(duì)可滑動(dòng)組件的支持。這些組件的用法大同小異,可以自行參考API接口。
執(zhí)行操作找到了我們需要的控件,接下來(lái)該對(duì)控件進(jìn)行操作了!
UiObject提供了一系列方法用來(lái)執(zhí)行各種各樣的操作。比如:
click():點(diǎn)擊控件中心;
dragTo():拖動(dòng)控件到指定位置;
setText():對(duì)可輸入控件設(shè)置文本;
swipeUp():對(duì)控件執(zhí)行上滑操作。類(lèi)似地,swipeDown(), swipeLeft()和swipeRight()可以執(zhí)行相應(yīng)的操作
這一部分也是比較簡(jiǎn)單,和Espresso的用法大體類(lèi)似,只是API層面的區(qū)別。具體的可以在使用的時(shí)候查看API文檔。
檢查結(jié)果執(zhí)行一系列操作之后,我們需要對(duì)操作的結(jié)果進(jìn)行驗(yàn)證了!
對(duì)于結(jié)果的驗(yàn)證,我們可以使用之前說(shuō)到的一系列Assert方法了。比如說(shuō),我們需要檢測(cè)某個(gè)控件的文字:
assertEquals(TargetText, mUiObject.getText())
便可以這樣進(jìn)行執(zhí)行。
總結(jié)從該篇文章來(lái)看,UI Automator的使用方法和Espresso基本相同,整體的思路也是完全一致,只是一個(gè)對(duì)APP內(nèi)部提供了很好的支持,另一個(gè)對(duì)跨APP提供了支持。大家在實(shí)際編寫(xiě)自動(dòng)化測(cè)試腳本時(shí)可以靈活選用。
附錄Android自動(dòng)化測(cè)試-從入門(mén)到入門(mén)(1) Hello Testing!
Android自動(dòng)化測(cè)試-從入門(mén)到入門(mén)(2) Testing APIs
Android自動(dòng)化測(cè)試-從入門(mén)到入門(mén)(3) Espresso入門(mén)
Android自動(dòng)化測(cè)試-從入門(mén)到入門(mén)(4) uiautomatorviewer
Android自動(dòng)化測(cè)試-從入門(mén)到入門(mén)(5) AdapterView的測(cè)試
Android自動(dòng)化測(cè)試-從入門(mén)到入門(mén)(6) 會(huì)玩的Espresso
Android自動(dòng)化測(cè)試-從入門(mén)到入門(mén)(7) UI Automator
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/65624.html
摘要:標(biāo)識(shí)一個(gè)測(cè)試方法。附錄自動(dòng)化測(cè)試從入門(mén)到入門(mén)自動(dòng)化測(cè)試從入門(mén)到入門(mén)自動(dòng)化測(cè)試從入門(mén)到入門(mén)入門(mén)自動(dòng)化測(cè)試從入門(mén)到入門(mén)自動(dòng)化測(cè)試從入門(mén)到入門(mén)的測(cè)試自動(dòng)化測(cè)試從入門(mén)到入門(mén)會(huì)玩的自動(dòng)化測(cè)試從入門(mén)到入門(mén) 根據(jù)該系列文章的第一篇:Hello Testing,大家已經(jīng)對(duì)整個(gè)自動(dòng)化測(cè)試運(yùn)行流程有了一個(gè)基本的了解,接下來(lái)我們?cè)摷芯﹃P(guān)注具體的腳本實(shí)現(xiàn)了!在具體實(shí)現(xiàn)之前,我們先來(lái)了解一下Android提...
摘要:右下角部分顯示當(dāng)前選中控件的各個(gè)屬性。然后,向這個(gè)中輸入賬號(hào)信息就完成了一個(gè)表單的輸入。我們可以根據(jù)屬性區(qū)域顯示的來(lái)進(jìn)行匹配賬號(hào)小總結(jié)所提供的界面簡(jiǎn)單,使用方便,對(duì)于我們的自動(dòng)化測(cè)試來(lái)說(shuō)是一個(gè)很好的輔助工具。 我們用如下一行代碼來(lái)回顧一下之前介紹過(guò)的內(nèi)容: import static android.support.test.espresso.Espresso.onView; impo...
閱讀 3608·2021-10-09 09:41
閱讀 2803·2021-10-08 10:18
閱讀 2254·2021-09-10 10:51
閱讀 2737·2021-09-10 10:50
閱讀 862·2021-09-09 09:33
閱讀 3470·2021-09-06 15:14
閱讀 3092·2019-08-30 11:06
閱讀 3314·2019-08-29 14:04