測試導覽功能

1. 事前準備

在先前的程式碼研究室中,您已瞭解如何處理不同活動之間的導覽。在本程式碼研究室中,您將瞭解其他幾種方法,以使用檢測設備測試來測試導覽功能。

必要條件

  • 您已在 Android Studio 中建立測試目錄。
  • 您已在 Android Studio 中撰寫了單元和檢測設備測試。

課程內容

  • 如何利用檢測設備測試來測試活動或片段之間的實際瀏覽情形。

需求條件

  • 安裝 Android Studio 的電腦。
  • Words 應用程式的程式碼解答。

下載這個程式碼研究室的範例程式碼

在本程式碼研究室中,您將針對 Words 應用程式的解決方案程式碼新增檢測設備測試。

如要取得這個程式碼研究室的程式碼,並在 Android Studio 中開啟,請按照下列步驟操作:

取得程式碼

  1. 按一下上面顯示的網址。系統會在瀏覽器中開啟專案的 GitHub 頁面。
  2. 在專案的 GitHub 頁面中,按一下「Code」按鈕開啟對話方塊。

5b0a76c50478a73f.png

  1. 在對話方塊中,按一下「Download ZIP」按鈕,將專案儲存到電腦。等待下載作業完成。
  2. 在電腦中找到該檔案 (可能位於「下載」資料夾中)。
  3. 按兩下解壓縮 ZIP 檔案。這項操作會建立含有專案檔案的新資料夾。

在 Android Studio 中開啟專案

  1. 啟動 Android Studio。
  2. 在「Welcome to Android Studio」視窗中,按一下「Open an existing Android Studio project」

36cc44fcf0f89a1d.png

注意:如果 Android Studio 已開啟,請依序選取「File」>「New」>「Import Project」選單選項。

21f3eec988dcfbe9.png

  1. 在「Import Project」對話方塊中,前往解壓縮專案資料夾所在的位置 (可能位於「下載」資料夾中)。
  2. 按兩下該專案資料夾。
  3. 等待 Android Studio 開啟專案。
  4. 按一下「Run」按鈕 11c34fc5e516fb1c.png 即可建構並執行應用程式。請確認應用程式的建構符合預期。
  5. 在「Project」工具視窗中瀏覽專案檔案,查看應用程式的設定方式。

2. 範例應用程式總覽

Words 應用程式的主畫面會顯示一份清單,每個清單項目都是字母表中的一個字母。按一下其中一個字母,螢幕上會顯示該字母開頭的字詞清單。

3. 最佳做法

在 Kotlin 中,命名函式的常用慣例是使用「駝峰式大小寫」,其中函式名稱的第一個字母為小寫,後續單詞的第一個字母為大寫 (例如 myCamelCaseFunction())。到目前為止,我們撰寫的所有測試方法都使用小寫字母,並在單詞之間加底線 (例如 my_test_function())。這是因為我們希望各函式的名稱能夠精確描述內容,以便明確指出接受測試的項目。如此一來,當測試失敗時,名稱本身就會清楚指出失敗的原因。在 Kotlin 中,如果使用倒引號括住方法名稱,我們甚至可以在方法名稱中加入空格,例如:``test function with spaces()請注意,倒引號與單引號不同。您可以在帶有波浪號 (~) 的按鍵上找到倒引號。這有助於建立使用者可理解的函式名稱,方便在測試失敗時輕鬆識別函式。

但是,這種方法存在限制,需要進行一些設定才能實作。請注意,本節為選學內容。建議您閱讀這部分內容,但您不必執行「建立檢測設備測試目錄」章節之前的所有步驟。

  1. 請注意,在 Android 中,僅當您針對 API 30 時,才能在函式名稱中加入空格。否則,您可能會收到類似下列內容的錯誤:

4333fe8605801dba.png

如要變更 API,請前往 app/build.gradle,修改 minSdkVersion 和/或 targetSdkVersion

a6207c31c66ca185.png

在此案例中,targetSdkVersion 已設為 30,這是必要操作。但 minSdkVersion19,因此我們需要將其變更為 30,以允許函式名稱中出現空格。這項功能不一定始終適用,因此擁有這項功能「更好」,但並非必需功能。

  1. 即使您已指定 API 30,系統依然會為該方法加上紅色底線,並標示「Identifier not allowed in Android Project」(Android 專案不允許使用 ID) 的訊息。

d1330d69cc2472b1.png

測試仍會執行,直到完成;但如要移除底線,請前往 Android Studio 設定/偏好設定,然後依序前往「Editor」->「Inspections」->「Kotlin Android」->「Illegal Android Identifier」->「Tests」。

acc4a31499bdb25.png

接著取消勾選「Tests」方塊,然後按一下「Apply」或「OK」。

aeb57d303996a3de.png

現在只要使用倒引號括住方法名稱,此方法就不會再以紅色底線標示。

a54f3eff47697024.png

4. 建立測試目錄

為 Words 應用程式建立檢測設備測試目錄。

5. 建立檢測設備測試類別

建立名為 NavigationTests.kt 的新類別。

9d9ee307b4773b7.png

6. 撰寫導覽測試

  1. 指定測試執行器。
@RunWith(AndroidJUnit4::class)
  1. 然後啟動主要活動。
@get:Rule
val activity = ActivityScenarioRule(MainActivity::class.java)
  1. 接著,建立名為 navigate_to_word() 的方法。
@Test
fun navigate_to_word() {
}
  1. navigate_to_word() 方法中,我們需要選擇一個待選取的清單項目。我們選擇的項目是任意項目,可以透過多種方式完成。我們可以根據項目在轉接器中的位置選擇項目,也可以根據項目包含的文字 (也就是字母) 選擇項目。請注意,如果選擇直接與 RecyclerView 互動,就需要下列依附元件:
dependencies {
    ...
    androidTestImplementation
‘com.android.support.test.espresso:espresso-contrib:3.0.2'
}

另一方面,如果您選擇透過文字選取項目,可以使用在先前的程式碼研究室中使用的 withText() 方法。請注意,如果採用此方法,但文字未顯示在畫面中,則測試會失敗。我們之後會介紹此內容。

  1. 看看是否能試試這兩種做法。請記住,我們的目標是在找到 UI 元件後立即點選。

下面以點選字母「C」的項目做為範例,介紹了這兩種方法。

onView(withText("C")).perform(click())
onView(withId(R.id.recycler_view))
   .perform(RecyclerViewActions
       .actionOnItemAtPosition<RecyclerView.ViewHolder>(2, click()))

請花一點時間深入瞭解這兩種方法。如果您執行其中一種方法,並觀察模擬器或裝置,就會看到兩種方法都在運作。使用 RecyclerViewActions 需要更多程式碼,但這樣有一個明顯的優勢,就是可以點選任何項目,不必額外採取任何行動。請嘗試第一個方法,但將字母「C」變更為「Z」,然後再次執行測試。系統會顯示測試失敗,並出現以下錯誤:androidx.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with text: is "Z"

3c518d4b00624af3.png

這是因為「Z」顯示在清單末端,當我們啟動應用程式時,它不在畫面中,必須捲動畫面才能看到。RecyclerViewAction 方法能夠正確處理這個問題。嘗試將 25 做為位置值傳遞,並觀察模擬器或裝置。

  1. 如果您執行了上述範例,您會看到我們成功啟動了下一個活動,但我們想透過斷言來確認這一點。如果執行應用程式,並按一下任何給定的清單項目,您會在應用程式列中看到標題「Words That Start With __」,其中空白處就是您點選的任何字母。我們可藉此確認導覽功能是否運作正常。我們只需聲明畫面上顯示正確的字串,以及我們點選的字母。您曾在先前的程式碼研究室中做出類似的斷言,這次看看您是否能自行嘗試。
onView(withText("Words That Start With C")).check(matches(isDisplayed()))

7. 概念課程和最佳做法

測試中使用了兩個重要字詞:「偽陽性」和「偽陰性」。

「偽陽性」是指即使測試發生了問題應該失敗,卻得到測試通過的結果。同樣地,「偽陰性」是指測試過程一切正常,測試應該通過,卻得到測試失敗的結果。

在上方撰寫的測試中,我們硬式編碼了要查找的字串。從程式碼的角度來看,從字串資源建構字串更為簡單,就像在應用程式中所做的那樣。與在一般應用程式程式碼中的運作方式相比,這個做法略有不同,但您仍可正常使用。不過,以這種方式建構字串可能會失敗,因為建立字串從技術上來說是商業邏輯。如果在測試中建構字串的失敗方式與在應用程式程式碼中失敗的方式相同,便可能會產生偽陽性。這是因為這兩段程式碼都錯誤地建構了相同的字串,導致測試中的錯誤文字與應用程式顯示的錯誤文字相符。因此,最好將字串硬式編碼為我們想要的值。

8. 解決方案程式碼

9. 恭喜

在本程式碼研究室中,我們:

  • 瞭解了如何為測試建立詳細的函式名稱。
  • 瞭解了如何使用活動或片段測試實體導覽功能。
  • 瞭解了「偽陽性」和「偽陰性」。