天天看點

espresso基礎架構與API分析

espresso測試架構提供了一組api來建構ui測試,以測試應用程式内的使用者流。 這些api讓您能夠編寫簡潔,運作可靠的自動化ui測試。 espresso非常适合編寫白盒式自動化測試,其中測試代碼使用來自所測試的應用程式的實作代碼細節。

espresso測試架構的主要功能包括:

需要android 2.2(api級别8)或更高版本。

espresso.onview()方法允許您通路目标應用程式中的ui元件并與其進行互動。 該方法接受matcher參數并搜尋視圖層次以定位滿足某些給定标準的對應view執行個體。 您可以通過指定以下條件來優化搜尋:

視圖的類名

視圖的内容描述

視圖的r.id

視圖中顯示的文本

例如,要定位id值為my_button的按鈕,您可以指定一個比對器,如下所示:

<code>onview(withid(r.id.my_button));</code>

如果搜尋成功,onview()方法傳回一個引用,該引用允許您對目标視圖執行使用者操作和測試斷言。

onview方法需要傳入類型為matcher泛型viewmatcher對象.

viewmatchers類中方法有

這些方法能夠幫助我們快速定位到特定的視圖。

我們來看看常用的幾個方法

withid

傳回基于資源ids比對視圖的比對器。

withtext

傳回基于textview的文本屬性值比對textview的比對器。

<code>onview(allof(withid(r.id.my_view), withtext("hello!")))</code>

isdisplayed

傳回與目前顯示在螢幕上的視圖比對的比對器給使用者。

如下

<code>espresso.onview(viewmatchers.withid(r.id.mpu_summary_send_receipt_button)) .check(viewassertions.matches(viewmatchers.isdisplayed()));</code>

其他api方法可以在以下文檔中找到具體用法和解釋,我們并不需要記住每個方法,遇到具體的場景的時候再過來查詢也來得及

<a href="https://developer.android.com/reference/android/support/test/espresso/matcher/viewmatchers.html" target="_blank">viewmatchers-api</a>

什麼是hamcrest?

hamcrest架構是junit4架構新引入的斷言架構,hamcest提供了一套比對符matcher,這些比對符更接近自然語言,可讀性高,更加靈活。

我們可以通過各種viewmatchers與hamcrest組合比對器來縮小搜尋的範圍。

如以下示例所示:

<code>onview(allof(withid(r.id.button_signin), withtext("sign-in")));</code>

你也可以使用 ​not​ 反轉比對:

<code>onview(allof(withid(r.id.button_signin), not(withtext("sign-out"))));</code>

注意:

一個工程化的應用中,所有使用者可與之互動的視圖都應該包含說明文字或有一個内容描述(參考 android 可通路性指導)。如果你不能通過使用 ‘withtext’ 或 ‘withcontentdescripiton’ 來縮小onview的搜尋範圍,可以認為這是一個可通路性的 bug。

請使用最少的比對器來定位視圖。不要過指定,因為這将強制架構做無用功。例如,如果一個視圖可以通過它的文字唯一确定,你不需要說明該視圖也可以通過 ​textview​ 指定。對許多視圖而言,使用它的​r.id​值就足夠了。

更多的hamcrest api請檢視

<a href="http://hamcrest.org/javahamcrest/javadoc/1.3/" target="_blank">hamcrest api</a>

###ondata

當espresso在adapterview中查找視圖時需要用ondata方法,例如在adapterview小部件中,視圖在運作時動态填充子視圖。如果要測試的目标視圖位于adapterview(例如listview,gridview或spinner)中,則onview()方法可能無法工作,因為隻有一部分視圖可能會加載到目前視圖層次結構中。

相反,調用ondata()方法可擷取datainteraction對象以通路目标視圖元素。 espresso處理将目标視圖元素加載到目前視圖層次結構中。 espresso還負責滾動到目标元素,并将放在焦點元素。

注意:ondata()方法不檢查您指定的項目是否與視圖對應。 espresso僅搜尋目前視圖層次結構。如果沒有找到比對,該方法将抛出nomatchingviewexception異常。

下面的代碼片段展示了如何使用ondata()方法和hamcrest比對來搜尋包含給定字元串的清單中的特定行。在此示例中,longlistactivity類包含通過simpleadapter公開的字元串清單。

調用viewinteraction.perform()或datainteraction.perform()方法來模拟ui元件上的使用者互動。您必須傳入一個或多個viewaction對象作為參數。espresso按照給定的順序依次觸發每個動作,并在主線程中執行它們。

viewactions類提供了指定常用操作的幫助方法清單。您可以使用這些方法作為友善的快捷方式,而不是建立和配置單個viewaction對象。您可以指定以下操作:

viewactions.click():點選視圖。

viewactions.typetext():點選視圖并輸入指定的字元串。

viewactions.scrollto():滾動到視圖。目标視圖必須是來自scrollview的子類,它的android:visibility屬性的值必須是visible。對于擴充adapterview(例如,listview)的視圖,ondata()方法為您處理滾動。

viewactions.presskey():使用指定的鍵碼執行鍵按下。

viewactions.cleartext():清除目标視圖中的文本。

如果目标視圖位于scrollview内部,請先執行viewactions.scrollto()操作,以在其他操作進行之前在螢幕中顯示視圖。如果視圖已顯示,viewactions.scrollto()操作将不起作用。

例如,要模拟輸入字元串值并按按鈕送出值,您可以編寫類似這樣的自動測試腳本。 viewinteraction.perform()和datainteraction.perform()方法采用一個或多個viewaction參數,并按提供的順序運作操作。

//将文本鍵入edittext視圖,然後關閉軟鍵盤

//按按鈕送出文本更改

<code>onview(withid(r.id.changetextbt)).perform(click());</code>

其他action api 請檢視

<a href="https://qaseven.github.io/espresso.action">https://developer.android.com/reference/android/support/test/espresso/action/package-summary.html</a>

調用viewinteraction.check()或datainteraction.check()方法來斷言ui中的視圖比對一些預期狀态。 您必須傳遞一個viewassertion對象作為參數。 如果斷言失敗,espresso會抛出一個assertionfailederror。

viewassertions類提供了用于指定公共斷言的幫助程式方法的清單。 您可以使用的斷言包括:

doesnotexist:斷言沒有與目前視圖層次結構中指定的條件比對的視圖。

matches:斷言指定視圖存在于目前視圖層次結構中,并且其狀态與某個給定的hamcrest比對器比對。

selecteddescendentsmatch:存在指定的孩子為父視圖檢視的聲明,它們的狀态與某個給定的hamcrest比對器比對。

以下代碼段顯示了如何檢查ui中顯示的文本的值與之前在edittext字段中輸入的文本的值相同。

viewmatchers, viewactions, viewassertions 組成了espresso的基礎架構,是以要真正的掌握espresso必須将這3部分基礎熟悉。

最新内容請見作者的github頁:http://qaseven.github.io/

繼續閱讀